zigbee协议栈添加自己的硬件中断的注意点

今天自己定义了一个P0口P0.7的外部中断,在裸机上调试没问题,但放入协议栈的时候没有任何动作,在调试的时候,我把hal_board_cfg.h中的按键key的预编译改为FAULSE不通过,结果,自己定义的外中断就可以用了。那么问题肯定出在这了,经发现hal_key.c文件中存在

HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )

{

...

}

而我在自己的app文件中也定义了P0的中断

HAL_ISR_FUNCTION( P0_IRQ, P0INT_VECTOR )

{

...}

这就冲突了。

 

 

以下附网上转载的部分:

硬件中断的定义在协议栈中的hal_mcu.h文件中:




#ifdef __IAR_SYSTEMS_ICC__     //条件定义
#include              //包含CC2430输入输出头文件
#define HAL_COMPILER_IAR
     //定义IAR编译器宏
#define HAL_MCU_LITTLE_ENDIAN()   __LITTLE_ENDIAN__    //定义MCU小端模式
#define _PRAGMA(x) _Pragma(#x)     //定义预处理指令宏
#define HAL_ISR_FUNC_DECLARATION(f,v)   _PRAGMA(vector=v) __near_func __interrupt void f(void)      //IAR中断函数声明
定义格式宏
#define HAL_ISR_FUNC_PROTOTYPE(f,v)     _PRAGMA(vector=v) __near_func __interrupt void f(void)
      //IAR中断函数原型定义格式
#define HAL_ISR_FUNCTION(f,v)           HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)      //IAR中断函数定义格式宏


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



#else
#error "ERROR: Unknown compiler."
#endif


这里定义了在不同编译环境下的终端函数,我们可以看出ZigBee2006协议栈仅支持IAR和Keil两种编译环境,其他的编译器会当做未识别的编译器并报错("ERROR: Unknown compiler.")。我使用的是IAR编译环境,并对上面的代码进行注释。
红色字体标出的部分就是我们定义中断函数的格式要求,这三个宏的意思表明了对中断函数定义的规则:首先,要在文件代码顶端进行函数声明(格式:_PRAGMA(vector=v) __near_func __interrupt void f(void););然后,在相应的C文件里定义中断函数原型(格式:_PRAGMA(vector=v) __near_func __interrupt void f(void){...})。其实和C语言中定义函数一模一样,但是格式要按照协议栈规定的来写。
例如:
#include "ioCC2430.h"
_PRAGMA(vector=URX0_VECTOR) __near_func __interrupt void UART0_ISR(void);
...
_PRAGMA(vector=URX0_VECTOR) __near_func __interrupt void UART0_ISR(void)
{
....  //函数体
}


例子中浅蓝色的部分是可以自己来设定的,其他格式都是确定的,以上就是在协议栈中添加中断函数的方法,希望能对你有所帮助。

你可能感兴趣的:(zigbee)