5.2 SW1控制LED1亮灭(中断功能)
中断:CPU收到中断请求后暂停正在执行的程序,而去执行中断服务函数中的程序,处理结束后,继续执行原来的程序。
能够产生中断请求的中断源如下:
CC2530中断设置步骤:使能端口组中断(IEN)——端口组中具体端口中断使能/禁止(PxIEN)——设置中断触发方式PICTL——使能系统总中断(EA)
下文按此思路展开:
1、使能端口组中断
IEN2|=0x10; //10000,设置IEN2的第4位,使能P1端口组中断
2、使能具体端口中断
P1IEN|=0x04; //0100,P1_2口中断
3、设置中断触发方式
PICTL|=0x02; //P_3到P1_1下降沿触发中断,SW1按下,电平由高变低
4、使能总中断
EA=1;
要想使用中断功能,必须使能中断总开关EA,并且使能各个中断源的自身控制开关IEN。
具体寄存器详情如下:
中断服务函数格式:以P1为例。函数体不能带有参数,也不能有返回值
#pragma vector=P1INT_VECTOR __interrupt void P1_INT(void) //注意,interrupt前是两个_ { /*处理程序*/ }
中断向量名如下:可查看ioCC2530.h头文件内容
中断标志位:中断源很多,需要识别触发中断的中断源。
P0、P1、P2端口组的中断标志位分别是P0IF、P1IF、P2IF。
P1_2连接着SW1按键,按键按下P1IF值变为1,CPU就去执行P1的中断服务函数。标志位不能自动复位,需要手动清除该中断标志位。
P1IF=0; //清除P1端口组中断标志位
具体是P1中哪一个针脚引起的中断,可以通过PxIFG寄存器的值来判断。当然也需要手动清除具体的针脚标志位(在中断服务函数中)。
P1IFG&0x04 //判断P1_2的中断标志位是否为1
P1IFG &=~ 0x04; //清除P1_2的中断标志位
清除过程,先小再大。即先关局部再关总闸。
#include "ioCC2530.h" #define LED1 P1_0 /*==================端口初始化函数=====================*/ void Init_Port() { //将P1_0设置为通用I/O端口功能 P1SEL &= ~0x01; //将P1_0的端口传输方式设置为输出 P1DIR |= 0x01; LED1 = 0; } /*===============外部中断初始化函数==================*/ void Init_INTP() { IEN2 |= 0x10; //端口1中断使能 P1IEN |= 0x04; //端口P1_2外部中断使能 PICTL |= 0x02; //端口P1_0到P1_3下降沿触发 EA = 1; //使能总中断 } /*================外部中断1服务函数====================*/ #pragma vector = P1INT_VECTOR //外部中断1的向量入口 __interrupt void Int1_Sevice() { LED1 = ~LED1; /*先清除引脚标志位,再清除端口组标志位,否则会一直进入中断*/ P1IFG &= ~ 0x04; //清除P1_2引脚的标志位 P1IF = 0; //清除P1端口组的标志位 } /*====================主函数==========================*/ void main() { Init_Port(); //初始化通用I/O端口 Init_INTP(); //初始化外部中断 }