ZigBee_CC2530_06H_中断的使用

CC2530的中断系统是为了让CPU对内部或外部的突发事件及时地做出响应,并执行相应的终端程序。中断由中断源引起,中断源由相应的寄存器来控制。当需要使用中断时,需配置相应的中断寄存器来开启中断,当终端发生时将跳入中断服务函数中来执行此中断所需处理的事件。

1.终端源和中断向量

  CC2530有18个中断源,每个中断源都可以产生中断请求,中断请求可以通过设置中断使能SFR寄存器的中断使能位IEN0IEN1IEN2使能或禁止中断。

中断源概述
中断号码描述中断名称中断向量中断屏蔽中断标志
0
RF TX RFIO下溢 或
RX FIFO溢出
RFERR03HIEN0.RFERRIETCON.RFERRIF
1ADC转换结束ADC0BHIEN0.ADCIETCON.ADCIF
2USART0 RX完成URX013HIEN0.URX0IETCON.URX0IF
3USART1 RX 完成URX11BHIEN0.URX1IETCON.URX1IF
4AES加密解密完成ENC23HIEN0.ENCIES0CON.ENCIF
5睡眠定时器完成ST2BHIEN0.STIEIRCON.STIF
6端口2中断P2INT33HIEN2.P2IEIRCON2.P2IF
7USART0 TX完成UTX03BHIEN2.UTX0IEIRCON2.UTX0IF
8DMA传输完成DMA43HIEN1.DMAIEIRCON.DMAIF
9Timer1(16位)捕获/比较/溢出T14BHIEN1.T1IEIRCON.T1IF
10Timer2(MAC Timer)T253HIEN1.T2IEIRCON.T2IF
11Timer3(8位)捕获/比较/溢出T35BHIEN1.T3IEIRCON.T3IF
12Timer4(8位)捕获/比较/溢出T463HIEN1.T4IEIRCON.T4IF
13端口0中断P0INT6BHIEN1.P0IEIRCON.P0IF
14USART1 TX 完成UTX173HIEN2.UTXIEIRCON2.UTX1IF
15端口1中断P1INT7BHIEN2.P1IEIRCON2.P1IF
16RF通用中断RF83HIEN2.RFIES1CON.RFIF
17看门狗计时溢出WDT8BHIEN2.WDTIEIRCON.WDTIF

  当相应的中断源使能并发生时,中断标志位将自动置1,然后程序跳往中断服务程序的入口地址执行中断服务程序。待中断服务程序处理完毕后,由硬件清除中断标志位。

  中断服务程序的入口地址即中断向量,CC2530的18个中断源对应了18个中断向量,中断向量定义在头文件"ioCC2530.h"中,定义如下:

  1. /* ------------------------------------------------------------------------------------------------ 
  2.  *                                        Interrupt Vectors 
  3.  * ------------------------------------------------------------------------------------------------ 
  4.  */  
  5. //RF内核错误中断(RF TX RFIO下溢或RF FIFO溢出)  
  6. #define  RFERR_VECTOR   VECT(  0, 0x03 )   /*  RF TX FIFO Underflow and RX FIFO Overflow   */  
  7.   
  8. //ADC转换结束  
  9. #define  ADC_VECTOR     VECT(  1, 0x0B )   /*  ADC End of Conversion                       */  
  10.   
  11. //USART0 RX完成  
  12. #define  URX0_VECTOR    VECT(  2, 0x13 )   /*  USART0 RX Complete                          */  
  13.   
  14. //USART1 RX 完成  
  15. #define  URX1_VECTOR    VECT(  3, 0x1B )   /*  USART1 RX Complete                          */  
  16.   
  17. //AES加密解密完成  
  18. #define  ENC_VECTOR     VECT(  4, 0x23 )   /*  AES Encryption/Decryption Complete          */  
  19.   
  20. //睡眠定时器完成  
  21. #define  ST_VECTOR      VECT(  5, 0x2B )   /*  Sleep Timer Compare                         */  
  22.   
  23. //端口2中断  
  24. #define  P2INT_VECTOR   VECT(  6, 0x33 )   /*  Port 2 Inputs                               */  
  25.   
  26. //USART0 TX完成  
  27. #define  UTX0_VECTOR    VECT(  7, 0x3B )   /*  USART0 TX Complete                          */  
  28.   
  29. //DMA传输完成  
  30. #define  DMA_VECTOR     VECT(  8, 0x43 )   /*  DMA Transfer Complete                       */  
  31.   
  32. //Timer1(16位)捕获/比较/溢出  
  33. #define  T1_VECTOR      VECT(  9, 0x4B )   /*  Timer 1 (16-bit) Capture/Compare/Overflow   */  
  34.   
  35. //Timer2(MAC Timer)  
  36. #define  T2_VECTOR      VECT( 10, 0x53 )   /*  Timer 2 (MAC Timer)                         */  
  37.   
  38. //Timer3(8位)捕获/比较/溢出  
  39. #define  T3_VECTOR      VECT( 11, 0x5B )   /*  Timer 3 (8-bit) Capture/Compare/Overflow    */  
  40.   
  41. //Timer4(8位)捕获/比较/溢出  
  42. #define  T4_VECTOR      VECT( 12, 0x63 )   /*  Timer 4 (8-bit) Capture/Compare/Overflow    */  
  43.   
  44. //端口0中断  
  45. #define  P0INT_VECTOR   VECT( 13, 0x6B )   /*  Port 0 Inputs                               */  
  46.   
  47. //USART1 TX 完成  
  48. #define  UTX1_VECTOR    VECT( 14, 0x73 )   /*  USART1 TX Complete                          */  
  49.   
  50. //端口1中断  
  51. #define  P1INT_VECTOR   VECT( 15, 0x7B )   /*  Port 1 Inputs                               */  
  52.   
  53. //RF通用中断  
  54. #define  RF_VECTOR      VECT( 16, 0x83 )   /*  RF General Interrupts                       */  
  55.   
  56. //看门狗计时溢出  
  57. #define  WDT_VECTOR     VECT( 17, 0x8B )   /*  Watchdog Overflow in Timer Mode             */  
/* ------------------------------------------------------------------------------------------------
 *                                        Interrupt Vectors
 * ------------------------------------------------------------------------------------------------
 */
//RF内核错误中断(RF TX RFIO下溢或RF FIFO溢出)
#define  RFERR_VECTOR   VECT(  0, 0x03 )   /*  RF TX FIFO Underflow and RX FIFO Overflow   */

//ADC转换结束
#define  ADC_VECTOR     VECT(  1, 0x0B )   /*  ADC End of Conversion                       */

//USART0 RX完成
#define  URX0_VECTOR    VECT(  2, 0x13 )   /*  USART0 RX Complete                          */

//USART1 RX 完成
#define  URX1_VECTOR    VECT(  3, 0x1B )   /*  USART1 RX Complete                          */

//AES加密解密完成
#define  ENC_VECTOR     VECT(  4, 0x23 )   /*  AES Encryption/Decryption Complete          */

//睡眠定时器完成
#define  ST_VECTOR      VECT(  5, 0x2B )   /*  Sleep Timer Compare                         */

//端口2中断
#define  P2INT_VECTOR   VECT(  6, 0x33 )   /*  Port 2 Inputs                               */

//USART0 TX完成
#define  UTX0_VECTOR    VECT(  7, 0x3B )   /*  USART0 TX Complete                          */

//DMA传输完成
#define  DMA_VECTOR     VECT(  8, 0x43 )   /*  DMA Transfer Complete                       */

//Timer1(16位)捕获/比较/溢出
#define  T1_VECTOR      VECT(  9, 0x4B )   /*  Timer 1 (16-bit) Capture/Compare/Overflow   */

//Timer2(MAC Timer)
#define  T2_VECTOR      VECT( 10, 0x53 )   /*  Timer 2 (MAC Timer)                         */

//Timer3(8位)捕获/比较/溢出
#define  T3_VECTOR      VECT( 11, 0x5B )   /*  Timer 3 (8-bit) Capture/Compare/Overflow    */

//Timer4(8位)捕获/比较/溢出
#define  T4_VECTOR      VECT( 12, 0x63 )   /*  Timer 4 (8-bit) Capture/Compare/Overflow    */

//端口0中断
#define  P0INT_VECTOR   VECT( 13, 0x6B )   /*  Port 0 Inputs                               */

//USART1 TX 完成
#define  UTX1_VECTOR    VECT( 14, 0x73 )   /*  USART1 TX Complete                          */

//端口1中断
#define  P1INT_VECTOR   VECT( 15, 0x7B )   /*  Port 1 Inputs                               */

//RF通用中断
#define  RF_VECTOR      VECT( 16, 0x83 )   /*  RF General Interrupts                       */

//看门狗计时溢出
#define  WDT_VECTOR     VECT( 17, 0x8B )   /*  Watchdog Overflow in Timer Mode             */

2.中断优先级

  中断优先级将决定中断响应的先后顺序,在CC2530中分为6个中断优先组,即IPG0~IPG5,每一组中断优先组中有三个中断源:

中断优先组划分
中断中断中断
IPG0RFERRRFDMA
IPG1ADCT1P2INT
IPG2URX0T2UTX0
IPG3URX1T3UTX1
IPG4ENCT4P1INT
IPG5STP0INTWDT


  中断优先组的优先级设定由寄存器 IP0IP1来设置。CC2530的优先级有4级,即0~3级,其中0级的优先级最低,3级的优先级最高。
优先级设置
IP1_XIP0-X优先级
000(优先级别最低)
011
102
113(优先级别最高)
  其中 IP1_XIP0_XX取值为优先组 IPG0~ IPG5中的任意一个。例如设置优先组IPG0为最高优先组:

  1. //设置IPG0优先级组为最高优先级别  
  2.   
  3. IP1_IPG0 = 1;  
  4.   
  5. IP0_IPG0 = 1;  
//设置IPG0优先级组为最高优先级别

IP1_IPG0 = 1;

IP0_IPG0 = 1;
  如果同时收到相同优先级或同一优先级组中的中断请求时,将采用轮流检测顺序来判断中断优先级别的响应。

轮流探测顺序
中断向量编号中断名称优先级排序
0RFERR
16RF 
8DMA 
1ADC 
9T1 
2URX0 
10T2 
3URX1 
11T3 
4ENC 
12T4 
5ST 
13P0INT 
6P2INT 
7UTX0 
14UTX1 
15P1INT 
17WDT

  例如在中断优先级组IPG0中的终端RFERRRFDMA的中断优先级相同,如果同时使用这三个中断,就需要使用轮流探测顺序来判断哪一个优先级最高。由轮流探测顺序表查得RFERR中断优先级最高,RF中断次之,DMA中断与其他两个中断相比中断优先级最低。

3.中断处理过程

  中断发生时,CC2530硬件自动完成以下处理:

  1. 中断申请:中断源向CPU发出中断请求信号(中断申请一般需要在程序初始化中配置相应的终端寄存器开启中断);
  2. 中断响应:CPU检测中断申请,把中断的地址保存到堆栈,转入中断向量入口地址;
  3. 中断处理:按照中断向量中设定好的地址,转入相应的中断服务程序;
  4. 中断返回:中断服务程序执行完毕后,CPU执行中断返回指令,把堆栈中保存的数据从堆栈中弹出,返回原来程序。

4.中断编程

  中断编程的一般过程如下:

  1. 中断设置:根据外设的不同,具体的设置是不同的,一般至少包含启用中断。
  2. 中断函数编写:这是中断编程的主要工作,需要注意的是,中断函数应尽可能地减少耗时或不进行耗时操作。

  CC2530所使用的编译器为IAR,在IAR编译器中用关键词_interrupt来定义一个中断函数。使用#progma vector来提供中断函数的入口地址,并且中断函数没有返回值,没有函数参数。中断函数的一般格式如下:

  1. #progma vector = 中断向量  
  2.   
  3. _interrupt void 函数名(void)  
  4. {  
  5.   
  6.     //中断函数代码  
  7.   
  8. }  
#progma vector = 中断向量

_interrupt void 函数名(void)
{

    //中断函数代码

}
  在中断函数的编写中,当程序进入中断服务程序之后,需要执行以下四个步骤:

  1. 将对应的中断关掉(不是必须的,需要根据具体情况来处理);
  2. 其次如果需要判断具体的中断源,则根据中断标志位进行判断(所有I/O中断共用1个中断向量,需要通过中断标志区分是哪个引脚引起的中断);
  3. 清中断标志(不是必须的,CC2530中中断发生后由硬件自动清中断标志位);
  4. 处理中断事件,此过程要尽可能地减少耗时;
  5. 最后,如果在第一步中关闭了相应的中断源,则需要在退出中断服务程序之前打开相应的中断。

  一般情况下,中断函数的编写是根据实际项目中的需求来定的。以CC2530端口0的P0_4P0_5外部中断为例,中断程序编写如下所示:

  1. //中断函数入口地址  
  2. #pragma vector = POINT_VECTOR  
  3.   
  4. //定义一个终端函数  
  5. _interrupt void P0_ISR(void)  
  6. {  
  7.   //关端口P0_4、P0_5中断  
  8.   P0IEN &= ~0x30;  
  9.   
  10.   //判断中断发生  
  11.   if(P0IFG > 0)  
  12.   {  
  13.       
  14.     //清中断标志  
  15.     P0IFG = 0;  
  16.   
  17.     /***中断事件的处理***/  
  18.   }  
  19.   
  20. }  

                
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值