zigbee学习笔记六——添加中断向量

zigbee

zigbee学习笔记六——添加中断向量

2011-11-17 11:43

最近一直在研究ZigBee2006协议栈,需要用到硬件。有关硬件的头文件和C文件基本上都在HAL文件夹里,这里面有各个硬件,如键盘、LCD、串口等外设的头文件,在hal/target/2430BB、2430DB、2340EB文件夹里有相应的C文件。如果你自己写了相关硬件的函数,那么请将这些函数及其定义放在相应的hal_头文件和C文件里。下面,我以串口0中断的应用为例,介绍如何在协议栈中添加中断。

首先,要对串口进行初始化:使能相应管脚,设定波特率、串口工作模式等。然后使能串口中断和全部中断,即打开串口中断。

其次,我们需要找到中断函数的定义,这个文件的名字叫做hal_mcu.h,在hal/target/2430BB、2430DB、2340EB文件夹里都有,可以在IAR的hal/target/2430BB/includes

(hal/target/2430DB/includes和hal/target/2430EB/includes里也有)文件夹里找到。双击打开,我们可以看到很多宏定义,其中Compiler Abstraction部分代码如下:

/* ------------------------------------------------------------------------------------------------ * Compiler Abstraction

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

*/

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

#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中断函数定义格式宏

/* ---------------------- 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

这里定义了在不同编译环境下的终端函数,我们可以看出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学习笔记六——添加中断向量相关文档

最新文档

返回顶部