CC2530芯片在TI协议栈中自定义外部中断

CC2530芯片在TI协议栈中自定义外部中断

学过单片机或写过CC2530裸板程序的同学都知道,外部中断的处理是通过中断服务程序实现的。

CC2530裸板程序中,我们可以这样实现。

#pragma vector = P0INT_VECTOR

__interrupt void P0_ISR(void)    //假设P0口全部定义为中断模式

{

  if(P0IFG >>4 & 0x01) //P0IFG是CC2530的中断标志位

  {

    led2 = ~led2;         //P0_4触发中断

  }

  if(P0IFG >>5 & 0x01) //P0_5触发中断

  {

    led1 = ~led1; 

  }

  P0IFG = 0;

  P0IF = 0;  

}


 

裸板上外部中断的触发是非常简单的,那么当cc2530上移植了TI协议栈后,如果写外部中断呢。首先我们可以在协议栈中hal_muc.h文件中找到格式的定义。

 

/* ------------------------------------------------------------------------------------------------

 *                                     Compiler Abstraction

 * ------------------------------------------------------------------------------------------------

 */


/* ---------------------- IAR Compiler ---------------------- */

#ifdef __IAR_SYSTEMS_ICC__

#include 

#define HAL_COMPILER_IAR

#define HAL_MCU_LITTLE_ENDIAN()   __LITTLE_ENDIAN__

#define _PRAGMA(x) _Pragma(#x)

#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)


/* ---------------------- Keil Compiler ---------------------- */

#elif defined __KEIL__

#include 

#define HAL_COMPILER_KEIL

#define HAL_MCU_LITTLE_ENDIAN()   0

#define HAL_ISR_FUNC_DECLARATION(f,v)   void f(void) interrupt v

#define HAL_ISR_FUNC_PROTOTYPE(f,v)     void f(void)

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


/* ------------------ Unrecognized Compiler ------------------ */

#else

#error "ERROR: Unknown compiler."

#endif

我用的是IAR编译器,所以格式为HAL_ISR_FUNCTION(P0_IRQ,P0INT_VECTOR)

所以我们在一个文件中通过下面语句进行中断的声明。

_PRAGMA(vector=P0INT_VECTOR) __near_func __interrupt void P0ISR(void);

通过如下格式书写中断服务程序。

HAL_ISR_FUNCTION(P0_IRQ,P0INT_VECTOR)

{

  if(P0IFG >>4 & 0x01) //P0IFG是CC2530的中断标志位

  {

    led2 = ~led2;         //P0_4触发中断

  }

  if(P0IFG >>5 & 0x01) //P0_5触发中断

  {

    led1 = ~led1; 

  }

  P0IFG = 0;

  P0IF = 0;  

}

 

如果用户完成了这个操作后,可能发现还是触发不了中断服务程序。我通过一个比较偏门的方法测试成功了。TI协议栈中,定义了按键的驱动和中断。我们首先在在onbroad.c文件中使能按键中断,找到以下语句。

 OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE;

然后在hal_key.c中把按键的中断服务程序关闭掉。直接全部注释。。

这样的话P0口的外部中断就定义成功了,亲测有效。

你可能感兴趣的:(zigbee,模块化编程)