當(dāng)用CC2530開發(fā)程序時,有時候會用到IO端口的外中斷,CC2530強(qiáng)大的外中斷系統(tǒng),可以使得幾乎每一個IO端口都可以處理外中斷,外中斷的數(shù)量遠(yuǎn)遠(yuǎn)超過51單片機(jī)外中斷的數(shù)量(51單片機(jī)是兩個外中斷,INT0和INT1). 但是當(dāng)我們對CC2530的外中斷進(jìn)行編程時,會發(fā)現(xiàn)雖然端口0(或者端口1)可以同時處理8個外中斷,但是中斷服務(wù)程序卻只有一個,那么CC530是怎么區(qū)分是由端口中的哪個引腳觸發(fā)的中斷呢?其實(shí)是通過引腳的中斷標(biāo)志位進(jìn)行區(qū)分的,我下面帖一段正常運(yùn)作的代碼,大家參考一下,就能知道原理了。 //代碼說明:P1.0和P1.1分別連接LED1和LED2燈,P0.1和P0.2分別接兩個按鍵,也可以接兩個外中斷源,在端口0的中斷服務(wù)程序中通過端口標(biāo)志位來區(qū)分是哪個中斷源引起的中斷,如果是P0.1引起的中斷,就點(diǎn)亮(或者熄滅)LED1燈,如果是P0.2引起的中斷,就點(diǎn)亮(或者熄滅)LED2燈. void main(void)
{
halMcuClockInit();//將始終設(shè)置為32MHZ的
//對LED燈的設(shè)置
IO_FUNC_PORT_PIN(1, 0, IO_FUNC_GIO); //將P1_0設(shè)置為普通的IO口
IO_DIR_PORT_PIN(1, 0, IO_OUT); //設(shè)置為輸出 IO_FUNC_PORT_PIN(1, 1, IO_FUNC_GIO); //將P1_1設(shè)置為普通的IO口
IO_DIR_PORT_PIN(1, 1, IO_OUT); //設(shè)置為輸出
IO_FUNC_PORT_PIN(0, 2, IO_FUNC_GIO); //將P0_2設(shè)置為普通的IO口
IO_DIR_PORT_PIN(0, 2, IO_IN); //方向?yàn)檩斎?br />
IO_IMODE_PORT_PIN(0 ,2 ,IO_IMODE_PUD); //設(shè)置為上拉或者下拉模式
IO_PUD_PORT(0, IO_PULLUP); //設(shè)置為上拉模式 IO_FUNC_PORT_PIN(0, 1, IO_FUNC_GIO); //將P0_1設(shè)置為普通的IO口
IO_DIR_PORT_PIN(0, 1, IO_IN); //方向?yàn)檩斎?br />
IO_IMODE_PORT_PIN(0 ,1 ,IO_IMODE_PUD); //設(shè)置為上拉或者下拉模式
IO_PUD_PORT(0, IO_PULLUP); //設(shè)置為上拉模式
P0IFG=0x00; //P0中斷標(biāo)志位清零
IRCON=0X00; //P0中斷端口標(biāo)志位解掛
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中斷標(biāo)志位解掛
}
|