最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

zigbee2006中断处理

来源:动视网 责编:小OO 时间:2025-10-03 09:52:55
文档

zigbee2006中断处理

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

2009-05-14 14:14:02 | 有关ZigBee2006协议栈中使用硬件中断函数的问题

 
最近一直在研究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)

{

....  //函数体

}

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

附:中断向量表

/* ------------------------------------------------------------------------------------------------

 *                                        Interrupt Vectors

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

 */

#define  RFERR_VECTOR   VECT(  0, 0x03 )   /*  RF TX FIFO Underflow and RX FIFO Overflow   */

#define  ADC_VECTOR     VECT(  1, 0x0B )   /*  ADC End of Conversion       */

#define  URX0_VECTOR    VECT(  2, 0x13 )   /*  USART0 RX Complete        */

#define  URX1_VECTOR    VECT(  3, 0x1B )   /*  USART1 RX Complete        */

#define  ENC_VECTOR     VECT(  4, 0x23 )   /* AES Encryption/Decryption Complete */

#define  ST_VECTOR      VECT(  5, 0x2B )   /*  Sleep Timer Compare              */

#define  P2INT_VECTOR   VECT(  6, 0x33 )   /*  Port 2 Inputs                        */

#define  UTX0_VECTOR    VECT(  7, 0x3B )   /*  USART0 TX Complete            */

#define  DMA_VECTOR     VECT(  8, 0x43 )   /*  DMA Transfer Complete        */

#define  T1_VECTOR      VECT(  9, 0x4B )   /*  Timer 1 (16-bit) Capture/Compare/Overflow   */

#define  T2_VECTOR      VECT( 10, 0x53 )   /*  Timer 2 (MAC Timer)              */

#define  T3_VECTOR      VECT( 11, 0x5B )   /*  Timer 3 (8-bit) Capture/Compare/Overflow    */

#define  T4_VECTOR      VECT( 12, 0x63 )   /*  Timer 4 (8-bit) Capture/Compare/Overflow    */

#define  P0INT_VECTOR   VECT( 13, 0x6B )   /*  Port 0 Inputs                    */

#define  UTX1_VECTOR    VECT( 14, 0x73 )   /*  USART1 TX Complete        */

#define  P1INT_VECTOR   VECT( 15, 0x7B )   /*  Port 1 Inputs                    */

#define  RF_VECTOR      VECT( 16, 0x83 )     /*  RF General Interrupts        */

#define  WDT_VECTOR     VECT( 17, 0x8B )  /*  Watchdog Overflow in Timer Mode  */

Written By Webdisk008       Test in IAR 7.20H

评论 (0) | 阅读(339)  |  

文档

zigbee2006中断处理

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

最新推荐

猜你喜欢

热门推荐

专题
Top