CC2530/Zigbee协议栈外部中断配置详解

CC2530/Zigbee协议栈配置外部中断

一、I/O端口

1、在CC2530芯片中,其I/O口用作通用 I/O 时,引脚可以组成 3 个 8 位端口,端口 0、端口 1 和端口 2,表示为 P0、P1 和 P2。其中,P0和 P1 是完全的 8 位端口,而 P2 仅有 5 位可用。所有的端口均可以通过 SFR 寄存器 P0、P1 和 P2 位寻址和字节寻址。每个端口引脚都可以单独设置为通用 I/O 或外部设备 I/O。
2、用作输入时,通用 I/O 端口引脚可以设置为上拉、下拉或三态操作模式。作为缺省的情况,复位之后,所有的端口均设置为带上拉的输入
3、通用 I/O 引脚设置为输入后,均可用于产生外部中断。中断可以设置在外部信号的上升或下降沿触发,P0、P1或 P2 端口都有中断使能位。

二、配置寄存器

👆上面提到,I/O口默认状态为上拉输入,而通用 I/O 引脚设置为输入后,均可用于产生外部中断。所以我们只需要配置中断相关的寄存器即可。
👇下面将以P0_5为例讲解寄存器的配置
①配置上拉输入(默认状态)

  P0SEL &= ~0x20;//普通io模式
  P0DIR &= ~0x20;//输入模式
  P0INP &= ~0x20;//上下拉输入
  P2INP &= ~0x20;//bit5 p0端口全部上拉

②配置中断寄存器

  IEN1  |=  0x20;       //P0IE(Bit5) 允许P0口中断; 
  P0IEN |=  0x20;       //P0_5 设置为中断方式 1:中断使能 
  PICTL |=  0x01;       //P0_5下降沿触发  
  P0IFG  =  0;
  EA 	 =  1; //打开总中断 

cc2530外部中断只需要配置IEN1、P0IEN、PICTL、P0IFG 这4个寄存器

  • P0IE(Bit5) 允许P0口中断
    在这里插入图片描述
  • P0_5 设置为中断方式 1:中断使能 在这里插入图片描述
  • P0_5下降沿触发
    在这里插入图片描述
  • 端口0的中断状态标志位,0:无中断,1:产生中断
    在这里插入图片描述
  • EA = 1; //打开总中断

至此中断配置完成🆗

三、中断处理函数

在zigbee协议栈中,有规定了中断处理函数的规范,建议按照其规范来定义中断处理函数
在hal_mcu.h文件中,有如下定义👇

#define HAL_ISR_FUNC_DECLARATION(f,v)   _PRAGMA(vector=v) __near_func __interrupt void f(void)
#define HAL_ISR_FUNC_PROTOTYPE(f,v)     _PRAGMA(vector=v) __near_func __interrupt void f(void)
#define HAL_ISR_FUNCTION(f,v)           HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)

我们写中断处理函数时,应该按照如下格式👇

//P0_ISR:函数名,P0INT_VECTOR:中断向量
HAL_ISR_FUNCTION( P0_ISR, P0INT_VECTOR )
{
...
...
...
}

其实函数头HAL_ISR_FUNCTION是一个宏定义

#define HAL_ISR_FUNCTION(f,v)           HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)

它展开后又是2个宏定义HAL_ISR_FUNC_PROTOTYPE和HAL_ISR_FUNC_DECLARATION(🈲禁止套娃hhhh~)

这里的两部分代码“HAL_ISR_FUNC_PROTOTYPE”和“HAL_ISR_FUNC_DECLARATION”,第一部分代码为函数声明,第二部分代码为函数原型。这两部分的代码展开皆为

_PRAGMA(vector=v) __near_func __interrupt void f(void)

现在我们将HAL_ISR_FUNCTION( P0_ISR, P0INT_VECTOR )部分完全展开可得下列程序:

//函数声明
_PRAGMA(vector=P0INT_VECTOR ) __near_func __interrupt void P0_ISR(void)
//函数原型
_PRAGMA(vector=P0INT_VECTOR ) __near_func __interrupt void P0_ISR(void)
{
  /*先清除引脚标志位,再清除端口标志位,否则会不断进入中断*/
  P0IFG &= ~0x20;
  P0IF  &= ~0x20;  
  ...
  ...
  ...
}

附上中断向量表👇

/* ------------------------------------------------------------------------------------------------
 *                                        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             */

注意
按照上面说的步骤配置完后,可以进行测试。我在一开始测试时,发现无法进入中断处理函数,解决方法👇
在这里插入图片描述
P0_5也是同样原因,在我把HAL_KEY定义为FALSE后,就可以正常进入中断了~

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值