当用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中断标志位解挂
}
|