CC2530 的外部中断我们需要配置三个寄存器 P0IEN 、 PICTL 、 P0IFG、IEN1。 IO 口配置请留意前 2 节教程内容。
各寄存器功能如下表所示: (详细参CC2530 datasheet.pdf)
/******************************************************************************************************************************************
这里我要重点说一下IEN1这个寄存器,它的Bit5为P0的中断使能位,他在ioCC2530.h文件里的配置为:
SFRBIT( IEN1 , 0xB8, _IEN17, _IEN16, P0IE, T4IE, T3IE, T2IE, T1IE, DMAIE )
Bit5 为P0IE,没有任何问题,可是当我想找P1和P2的中断使能位时,却死活找不到
在网上搜了一下,找到了这个表,问题终于解决
就是在ioCC2530.h中有P0IE的定义,可以直接使用,但是却没有P1IE和P2IE
他俩在IEN2寄存器的Bit4和Bit1
********************************************************************************************************************************************/
直接付上我升级过的代码吧:
/****************************************** 程序描述:按键 S1 外部中断方式改变 LED1 状态 *******************************************/ #include <ioCC2530.h> #define uint unsigned int #define uchar unsigned char //定义控制 LED 灯的端口 #define LED1 P1_0 //定义 LED1 为 P1.0 口控制 #define KEY1 P0_1 //中断口 #define KEY2 P2_0 //中断口 //函数声明 void Delayms(uint); //延时函数 void InitLed(void); //初始化 P1 口 void KeyInit(); //按键初始化 uchar KeyValue=0; /**************************** //延时函数 *****************************/ void Delayms(uint xms) //i=xms 即延时 i 毫秒 { uint i,j; for(i=xms;i>0;i--) for(j=587;j>0;j--); } /**************************** LED 初始化程序 *****************************/ void InitLed(void) { P1DIR |= 0x01; //P1_0 定义为输出 P1INP |= 0X01; //打开下拉 LED1 = 1; //LED1 灯熄灭 } /**************************** KEY 初始化程序–外部中断方式 *****************************/ void InitKey() { /** P0中断使能位为 IEN1 的bit5 P1中断使能位为 IEN2 的bit4 P2中断使能位为 IEN2 的bit1 **/ P0IEN |= 0X02; //P00 设置为中断方式 PICTL |= 0X01; // 下降沿触发 IEN1 |= 0x20; // 允许 P0 口中断; P0IFG &= ~0x02; // 初始化中断标志位 P2IEN |= 0X01; //P20 设置为中断方式 PICTL |= 0X01; // 下降沿触发 IEN2 |= 0x02; // 允许 P2 口中断; P2IFG &= ~0x01; // 初始化中断标志位 EA = 1; //开总中断 } /**************************** 中断处理函数 *****************************/ #pragma vector = P0INT_VECTOR //格式: #pragma vector = 中断向量, //紧接着是中断处理程序 __interrupt void P0_ISR(void) { Delayms(100); //去除抖动 if(KEY1==0) { LED1=!LED1; //改变 LED1 状态 P0IFG &= ~0x02; //清中断标志 P0IF = 0; //清中断标志 } } #pragma vector = P2INT_VECTOR //格式: #pragma vector = 中断向量, //紧接着是中断处理程序 __interrupt void P2_ISR(void) { Delayms(100); //去除抖动 if(KEY2==0) { LED1=!LED1; //改变 LED1 状态 P2IFG &= ~0x01; //清中断标志 P2IF = 0; //清中断标志 } } /*************************** 主函数 ***************************/ void main(void) { InitLed(); //调用初始化函数51 InitKey(); while(1); //等待外部中断 }
CC2530 的中断服务程序格式和51不怎么一样
格式: #pragma vector = 中断向量,
紧接着是中断处理程序
18个中断源
下m面是ioCC2530.h文件中定义的中断向量表
/* ------------------------------------------------------------------------------------------------ * Interrupt Vectors * ------------------------------------------------------------------------------------------------ */ #define RFERR_VECTOR VECT( 0, 0x03 ) /* RF TX FIFO Underflow and RX FIFO Overflow */ #define ADC_VECTOR VECT( 1, 0x0B ) /* ADC End of Conversion */ #define URX0_VECTOR VECT( 2, 0x13 ) /* USART0 RX Complete */ #define URX1_VECTOR VECT( 3, 0x1B ) /* USART1 RX Complete */ #define ENC_VECTOR VECT( 4, 0x23 ) /* AES Encryption/Decryption Complete */ #define ST_VECTOR VECT( 5, 0x2B ) /* Sleep Timer Compare */ #define P2INT_VECTOR VECT( 6, 0x33 ) /* Port 2 Inputs */ #define UTX0_VECTOR VECT( 7, 0x3B ) /* USART0 TX Complete */ #define DMA_VECTOR VECT( 8, 0x43 ) /* DMA Transfer Complete */ #define T1_VECTOR VECT( 9, 0x4B ) /* Timer 1 (16-bit) Capture/Compare/Overflow */ #define T2_VECTOR VECT( 10, 0x53 ) /* Timer 2 (MAC Timer) */ #define T3_VECTOR VECT( 11, 0x5B ) /* Timer 3 (8-bit) Capture/Compare/Overflow */ #define T4_VECTOR VECT( 12, 0x63 ) /* Timer 4 (8-bit) Capture/Compare/Overflow */ #define P0INT_VECTOR VECT( 13, 0x6B ) /* Port 0 Inputs */ #define UTX1_VECTOR VECT( 14, 0x73 ) /* USART1 TX Complete */ #define P1INT_VECTOR VECT( 15, 0x7B ) /* Port 1 Inputs */ #define RF_VECTOR VECT( 16, 0x83 ) /* RF General Interrupts */ #define WDT_VECTOR VECT( 17, 0x8B ) /* Watchdog Overflow in Timer Mode */
CC2530将18个中断源划分成6个中断优先级组IPG0~IPG5,每组包含3个中断源,如表所示。
6个中断优先级分组