您的位置:首页 > 其它

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

2013-07-11 16:22 246 查看
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口的外部中断就定义成功了,亲测有效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: