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) {
.... //函数体
}
你可能喜欢
- 学习信息
- Z-Stack
- 学习资料
- 串口通信
- 系统框架
- 学习雷锋信息1页
- 六单元 综合性学习 用信息 写报告17页
- 学习 《信息技术在学科教学中的应用》心得1页
- 团委学习信息1页
- 社保相关学习信息1页
- 学习雷锋学习信息2页
- Z-Stack建立绑定关系之二------终端绑定请求方式】感谢frank的精辟讲解!15页
- Z-Stack中绑定分析4页
- Z-Stack协议学习笔记1-----发送函数AF_DataRequest7页
- Z-Stack_开发指南17页
- 基于Z-Stack2006的简单应用开发11页
- 深入浅出Z-Stack 2006 OSAL多任务资源分配机制8页
- 基于MatlabGUI的串口通信编程实现4页
- VB串口通信程序设计典型实例37页
- verilog串口通信程序34页
- 串口通信 实验八 8251串行通信6页
- 串口通信2页
- 串口的多机通信15页
- 企业系统框架8页
- 电力系统的组织框架3页
- J2ee分布式系统框架设计11页
- 工程类企业报表系统框架3页
- CIS系统框架35页
- 会议系统框架3页


