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 协议栈实现每秒发送一次串口数据,你可以按照以下步骤进行操作: 1. 初始化串口:首先,你需要初始化 Zigbee 设备的串口模块,包括波特率、数据位、停止位和校验位等设置。 2. 配置定时器:接下来,你需要配置一个定时器,使其以适当的频率生成中断。你可以设置定时器的计数值和预分频器,以实现每秒触发一次中断。 3. 中断处理函数:定义一个中断处理函数,在定时器中断发生时被调用。在该函数中,你可以编写代码来发送串口数据。 4. 启用定时器和中断:最后,你需要启用定时器和相关的中断,以便定时器中断能够正常触发。 以下是一个示例代码框架,可帮助你实现每秒发送一次串口数据: ```c // 串口初始化函数 void uart_init() { // 配置串口参数 // ... } // 定时器中断处理函数 #pragma vector = TIMER_VECTOR __interrupt void timer_isr(void) { // 发送串口数据 // ... } // 主函数 int main() { // 初始化串口 uart_init(); // 配置定时器 TCCR1B = /* 设置定时器计数值和预分频器等 */; TIMSK1 = (1 << TOIE1); // 允许定时器溢出中断 // 启用总中断 sei(); while (1) { // 主循环 // ... } } ``` 请根据你的具体需求和硬件设置,适当修改上述代码,并确保在修改代码之前对其进行适当的测试。此外,你还需要根据 Zigbee 协议栈的规范和文档来添加相应的功能和接口,以实现串口数据的发送。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值