ZigBee_CC2530_06H_中断的使用

来源:互联网 发布:佳能app软件下载 编辑:程序博客网 时间:2024/05/16 14:34

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

1.终端源和中断向量

  CC2530有18个中断源,每个中断源都可以产生中断请求,中断请求可以通过设置中断使能SFR寄存器的中断使能位IEN0IEN1IEN2使能或禁止中断。中断源概述中断号码描述中断名称中断向量中断屏蔽中断标志0

RF TX RFIO下溢 或
RX FIFO溢出
RFERR03HIEN0.RFERRIETCON.RFERRIF1ADC转换结束ADC0BHIEN0.ADCIETCON.ADCIF2USART0 RX完成URX013HIEN0.URX0IETCON.URX0IF3USART1 RX 完成URX11BHIEN0.URX1IETCON.URX1IF4AES加密解密完成ENC23HIEN0.ENCIES0CON.ENCIF5睡眠定时器完成ST2BHIEN0.STIEIRCON.STIF6端口2中断P2INT33HIEN2.P2IEIRCON2.P2IF7USART0 TX完成UTX03BHIEN2.UTX0IEIRCON2.UTX0IF8DMA传输完成DMA43HIEN1.DMAIEIRCON.DMAIF9Timer1(16位)捕获/比较/溢出T14BHIEN1.T1IEIRCON.T1IF10Timer2(MAC Timer)T253HIEN1.T2IEIRCON.T2IF11Timer3(8位)捕获/比较/溢出T35BHIEN1.T3IEIRCON.T3IF12Timer4(8位)捕获/比较/溢出T463HIEN1.T4IEIRCON.T4IF13端口0中断P0INT6BHIEN1.P0IEIRCON.P0IF14USART1 TX 完成UTX173HIEN2.UTXIEIRCON2.UTX1IF15端口1中断P1INT7BHIEN2.P1IEIRCON2.P1IF16RF通用中断RF83HIEN2.RFIES1CON.RFIF17看门狗计时溢出WDT8BHIEN2.WDTIEIRCON.WDTIF  当相应的中断源使能并发生时,中断标志位将自动置1,然后程序跳往中断服务程序的入口地址执行中断服务程序。待中断服务程序处理完毕后,由硬件清除中断标志位。

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

/* ------------------------------------------------------------------------------------------------ *                                        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,每一组中断优先组中有三个中断源:

中断优先组划分组中断中断中断IPG0RFERRRFDMAIPG1ADCT1P2INTIPG2URX0T2UTX0IPG3URX1T3UTX1IPG4ENCT4P1INTIPG5STP0INTWDT

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

//设置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来提供中断函数的入口地址,并且中断函数没有返回值,没有函数参数。中断函数的一般格式如下:

#progma vector = 中断向量_interrupt void 函数名(void){    //中断函数代码}
  在中断函数的编写中,当程序进入中断服务程序之后,需要执行以下四个步骤:

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

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

//中断函数入口地址#pragma vector = POINT_VECTOR//定义一个终端函数_interrupt void P0_ISR(void){  //关端口P0_4、P0_5中断  P0IEN &= ~0x30;  //判断中断发生  if(P0IFG > 0)  {        //清中断标志    P0IFG = 0;    /***中断事件的处理***/  }}


原创粉丝点击