中斷: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(); //初始化外部中斷 }