历史上的今天
今天是:2025年01月21日(星期二)
2021年01月21日 | MSP430G2553中断要点总结
2021-01-21 来源:eefocus
1、中断
中断控制器:中断发生时有一个硬件装置将信号输入单片机,该硬件部件叫中断控制器,它负责把引起中断的信号编号,并按照事先约定的优先级排队,并发信号给单片机的cpu。
中断的编号叫中断号,对应处理程序叫中断服务程序,服务程序的地址叫中断向量。中断向量按照中断编号排列成表,叫中断向量表。
cpu检测到中断控制器的信号后,获得当前中断发生信号的编号,由中断向量表找到中断向量,转而去执行这个编号对应的中断处理程序。
中断向量表见文章末。
2、复位
冷复位:上电复位; 热复位:外部引脚或看门狗复位
3、通用I/O及其中断:
端口P1 和P2 有中断功能。每个针对P1 和P2 I/O 线路的中断可被单独启用并被配置成在一个输入信号的上升或者下降边沿上提供一个中断。所有P1 I/O 线路提供一个单一中断矢量,并且所有P2 I/O 线路提供一个不同的,单中断矢量。

I/O寄存器
PxDIR 方向:0输入 1输出
PxOUT
PxIN
PxREN
0:上拉/下拉电阻器被禁用 1:上拉/下拉电阻器被启用
每个PxREN 寄存器中的每个位启用或者禁用相应I/O 引脚的上拉/下拉电阻器。 PxOUT寄存器中的相应位选择上拉或下拉引脚。
PxSEL&PxSEL2 功能选择,默认是I/O功能,可以根据手册配置选择其他功能
I/O中断寄存器
端口P1 和P2 中的每个引脚都有中断功能,此功能由PxIFG, PxIE,和PxIES 寄存器配置。所有P1 引脚提供一个单一中断矢量,而所有P2 引脚提供一个不同的单一中断矢量。在中断程序中,可测试PxIFG 寄存器来确定一个P1或P2 中断的源。
P1IFG&P2IFG :中断标志位,需软件置位,也可软件置位产生软件控制的中断。
(注: 当改变PxOUT 或PxDIR 时的PxIFG 标志写入P1OUT, P1DIR, P2OUT,或P2DIR
可导致设置相应的P1IFG 或者P2IFG 标志。)
P1IES&P2IES :中断边沿选择 0上升沿;1下降沿。
(注: 写入PxIESx到P1IES,或者P2IES 的写入可导致相应中断标志的设置。)
P1IE&P2IE : 中断使能
所以根据分析可知,在设置完引脚功能寄存器后务必将中断标志位清零,然后再开中断。
默认状态
P1DIR为0(输入);P1OUT为1(高电平);P1RNE为0(禁用)。
例程
按键上拉设置;
P1OUT |= BIT0; //选择上下拉,1上拉;0下拉
P1OUT与P1REN配合使用

P1_3中断程序
#include void main(void) { WDTCTL = WDTPW + WDTHOLD; P1DIR = BIT0; P1OUT = BIT3; P1REN |= BIT3; P1IE |= BIT3; //(1)中断使能 P1IES |= BIT3; //(2)下降沿触发 P1IFG &= ~BIT3; //(3)清零标志位 __enable_interrupt (); //(4)开总中断 while(1); } #pragma vector=PORT1_VECTOR //固定格式 __interrupt void Port_1(void) { P1OUT ^= 0x01; P1IFG &= ~0x08; //每次软件复位 } 中断向量表 表中第一列是中断事件来源的名称;第二列是对应的中断标志位;第三列表示中断的性质,其中 non-maskable 是无法关掉的中断,即不受 GIE 控制的中断, maskable 是可以被 GIE 关掉的中断;第四列是中断向量在存储器中的位置;最后一列就是***中断优先级***。 中断向量表中大多数中断属于“grouped interrupt”,即多个中断源共用一个中断向量入口。例如 P1.0-P1.7 中断都使用 P1 中断这一个入口。要识别中断具体来自哪一个 I/O 口,需要查看P1IFG 寄存器, P1IFG 共 8 位,分别对应 P1.0-P1.7,当某个引脚出现中断事件时对应的P1IFG.x 就会被置位,在退出中断之前一定不要忘记手动将 P1IFG.x 复位。另外 P1IE 是 P1 口的中断使能寄存器,也有 8 位,可以分别控制每个 I/O 口的中断使能 如何写一个中断函数总结 要写一个带有中断的程序,需要做下面几件事情: 配置外设中和中断有关的寄存器,例如 I/O 口中断是上升沿触发还是下降沿触发, 定时器中断的计数方式和定时值等等。 依照中断服务函数的模板写中断服务函数,添加中断后要干什么的代码。 使能外设的中断,使能全局中断(GIE) 一旦中断发生, CPU 停下主函数中的任务,并标记位置,进入中断服务函数,执行完中断服务函数之后回到主函数标记位置处继续运行。 中断服务函数 #pragma vector=PORT1_VECTOR __interrupt void Port_1(void) { P1OUT ^= 0x01; // P1.0 = toggle P1IFG &= ~0x08; // Clear P1.3 IFG } #pragma vector=PORT1_VECTOR #Pragma 是编译器指令,是告诉编译器将函数与中断向量连接起来。 “vector=”后面是中断向量地址的宏定义,例如 P1 口中断就是 PORT1_VECTOR,定时器中断就是TIMER0_A1_VECTOR。 不同外设的中断向量名在哪里找呢?打开 CCS 的安装文件夹,例如C:ticcsv7ccs_basemsp430include,在这个文件夹中搜索芯片的具体型号,如msp430g2553,可以找到一个名为 msp430g2553.h 的头文件。这个头文件中包含了所有寄存器位的宏定义,包括中断向量的宏定义。 在 msp430g2553.h 中找到“Interrupt Vectors”这个部分(如下图),其中包含了所有中断向量的名称。 例如 P1 端口的中断向量名就是PORT1_VECTOR。 __interrupt void Port_1(void) __interrupt 关键字表明这是一个中断服务函数,CPU 见到这个关键字以后就会去做中断之前的准备工作。 Port_1 是用户自己取的函数名称,这个名称可以任意命名。 中断服务函数的具体内容 中断服务函数的内容依据中断的不同种类有所差别。退出中断前一定不要忘记将中断标志位复位。

史海拾趣
|
恩,大家好, 我现在用C编了一段程序,用汇编编了一段程序,我想把它们连接起来运行,请问应该怎么办呢? 我用的是C8051F系列的单片机,Keil Cx51编译器。 看了Cx51的帮助文档,但还是不明白。 不好意思啊,我再看看,也请大家指点。… 查看全部问答> |
|
用PROTEL画PCB,原理图转PCB时发现PCB的元件全部堆到了一起,请教高手这是怎么回事?有什么解决的好方法可以快速打散这些元件? 小弟好久没画PCB了,请高手指点一下,谢谢!… 查看全部问答> |
|
Altera提供10-GbE参考设计,器件全面支持XAUI协议 满足宽带网络和电信应用需求,Altera公司近日宣布,开始面向使用XAUI通信协议的设计人员提供万兆以太网(10GbE)参考设计。网络路由器、企业和城域以太网交换机以及存储交换机中的线路卡和系统控制器都可以采用Altera Arria和Stratix系列FPGA来可靠地 ...… 查看全部问答> |
|
工程调试中测试中发现: PC端不能正确接收0x11字符 使用串口工具,串口环回. 使用16进制发送 0x0001020304...171819 以上20个字符,除了0x11以为其他都能正确接收. 使用示波器检测信号.存在0x11的波形. 试验了以下几种通信设置: 9600,8个数据 ...… 查看全部问答> |
|
WCHAR *pBuf; pBuf = new WCHAR[256]; CString strCombine=_T(\"1111\"); 然后我将strCombine = pBuf;这样可以用CString 类里的函数进行处理字符串,可是我这么写传进去的全是乱码。怎么办那? … 查看全部问答> |
|
产生这个问题的想法,是想到平时把硬盘从主机箱里取出来,硬盘仍然能够存储数据,想知道为什么,想弄清楚。 我搜索了一下,很多文章都是介绍硬盘的结构,和对于恢复硬盘丢失数据的文章,并不是我想要的答案。请各位朋友帮忙解答一下,希望回答得尽 ...… 查看全部问答> |
|
时,为了能访问8位、16位、32位的变量,STM32的地址线和SRAM的地址线应该怎么连接?附图中的三种地址线连接方式是什么意思?请注意:因为我的理解不准确,我在20楼之前的解释有所误导,请看22楼的说明。请楼主原谅,因为此事非常重要,我不得 ...… 查看全部问答> |




