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 <ioCC2530.h>
#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 <CC2530.h>
#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口的外部中断就定义成功了,亲测有效。