當用CC2530開發程序時,有時候會用到IO端口的外中斷,CC2530強大的外中斷系統,可以使得幾乎每一個IO端口都可以處理外中斷,外中斷的數量遠遠超過51單片機外中斷的數量(51單片機是兩個外中斷,INT0和INT1). 但是當我們對CC2530的外中斷進行編程時,會發現雖然端口0(或者端口1)可以同時處理8個外中斷,但是中斷服務程序卻只有一個,那么CC530是怎么區分是由端口中的哪個引腳觸發的中斷呢?其實是通過引腳的中斷標志位進行區分的,我下面帖一段正常運作的代碼,大家參考一下,就能知道原理了。 //代碼說明:P1.0和P1.1分別連接LED1和LED2燈,P0.1和P0.2分別接兩個按鍵,也可以接兩個外中斷源,在端口0的中斷服務程序中通過端口標志位來區分是哪個中斷源引起的中斷,如果是P0.1引起的中斷,就點亮(或者熄滅)LED1燈,如果是P0.2引起的中斷,就點亮(或者熄滅)LED2燈. void main(void)
{
halMcuClockInit();//將始終設置為32MHZ的
//對LED燈的設置
IO_FUNC_PORT_PIN(1, 0, IO_FUNC_GIO); //將P1_0設置為普通的IO口
IO_DIR_PORT_PIN(1, 0, IO_OUT); //設置為輸出 IO_FUNC_PORT_PIN(1, 1, IO_FUNC_GIO); //將P1_1設置為普通的IO口
IO_DIR_PORT_PIN(1, 1, IO_OUT); //設置為輸出
IO_FUNC_PORT_PIN(0, 2, IO_FUNC_GIO); //將P0_2設置為普通的IO口
IO_DIR_PORT_PIN(0, 2, IO_IN); //方向為輸入
IO_IMODE_PORT_PIN(0 ,2 ,IO_IMODE_PUD); //設置為上拉或者下拉模式
IO_PUD_PORT(0, IO_PULLUP); //設置為上拉模式 IO_FUNC_PORT_PIN(0, 1, IO_FUNC_GIO); //將P0_1設置為普通的IO口
IO_DIR_PORT_PIN(0, 1, IO_IN); //方向為輸入
IO_IMODE_PORT_PIN(0 ,1 ,IO_IMODE_PUD); //設置為上拉或者下拉模式
IO_PUD_PORT(0, IO_PULLUP); //設置為上拉模式
P0IFG=0x00; //P0中斷標志位清零
IRCON=0X00; //P0中斷端口標志位解掛
PICTL|=0x01; //配置端口0所有的引腳為下降沿中斷
P0IEN |=0X04; //開啟中斷p0.2
P0IEN |=0X02; //開啟中斷p0.1
IEN1 |=0X20; //開啟P0口的總中斷
INT_GLOBAL_ENABLE(INT_ON); //使能全局中斷
while(1);
} #pragma vector=P0INT_VECTOR
__interrupt void P1_IRQ(void){
// check if PUSH_BUTTON is pressed
if((P0IFG&0X04)!=0)//p0.2的中斷
{
MCU_IO_TGL(1,0);//電平切換
}
if((P0IFG&0X02)!=0)//p0.1的中斷
{
MCU_IO_TGL(1,1);//電平切換
}
P0IFG = 0;
IRCON=0X00; //P0中斷標志位解掛
}
|