ZigBee开发(4)--基础实验外部中断

CC2530 的外部中断我们需要配置三个寄存器 P0IEN PICTL P0IFGIEN1IO 口配置请留意前 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个中断优先级分组

原文地址:https://www.cnblogs.com/tianxxl/p/9867250.html