• 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个中断优先级分组

  • 相关阅读:
    [转]system函数返回值探究
    [转]bat中的特殊字符,以及需要在bat中当做字符如何处理
    [转]null和""以及==与equals的区别
    粘包问题
    并发编程
    GIL锁
    五种IO模型
    css选择器
    并发与串行
    模块(二)
  • 原文地址:https://www.cnblogs.com/tianxxl/p/9867250.html
Copyright © 2020-2023  润新知