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裏也有)文件夾裏找到。雙擊打開,我們可以看到很多宏定義,其中CompilerAbstraction部分代碼如下:



#ifdef__IAR_SYSTEMS_ICC__    //條件定義
#include            //包含CC2430輸入輸出頭文件
#define HAL_COMPILER_IAR
    //定義IAR編譯器宏
#defineHAL_MCU_LITTLE_ENDIAN()  __LITTLE_ENDIAN__   //定義MCU小端模式
#define _PRAGMA(x)_Pragma(#x)    //定義預處理指令宏
#defineHAL_ISR_FUNC_DECLARATION(f,v)  _PRAGMA(vector=v) __near_func __interrupt voidf(void)     //IAR中斷函數聲明
定義
格式宏
#defineHAL_ISR_FUNC_PROTOTYPE(f,v)    _PRAGMA(vector=v) __near_func __interrupt voidf(void)
     //IAR中斷函數原型定義格式
#defineHAL_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
#defineHAL_ISR_FUNC_DECLARATION(f,v)  void f(void) interrupt v
#defineHAL_ISR_FUNC_PROTOTYPE(f,v)    void f(void)
#defineHAL_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 voidf(void););然後,在相應的C文件裏定義中斷函數原型(格式:_PRAGMA(vector=v) __near_func __interrupt voidf(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)
{
.... //函數體
}


例子中淺藍色的部分是可以自己來設定的,其他格式都是確定的,以上就是在協議棧中添加中斷函數的方法,希望能對你有所幫助。

附:中斷向量表

#define RFERR_VECTOR  VECT(  0, 0x03)  
#define ADC_VECTOR    VECT(  1, 0x0B)  
#define URX0_VECTOR   VECT(  2, 0x13)  
#define URX1_VECTOR   VECT(  3, 0x1B)  
#define ENC_VECTOR    VECT(  4, 0x23 )  
#define ST_VECTOR     VECT(  5, 0x2B)  
#define P2INT_VECTOR  VECT(  6, 0x33)  

#define UTX0_VECTOR   VECT(  7, 0x3B)  

#define DMA_VECTOR    VECT(  8, 0x43)  
#define T1_VECTOR     VECT(  9, 0x4B)  
#define T2_VECTOR     VECT( 10, 0x53 )  
#define T3_VECTOR     VECT( 11, 0x5B )  
#define T4_VECTOR     VECT( 12, 0x63 )  
#define P0INT_VECTOR   VECT( 13, 0x6B)  
#define UTX1_VECTOR   VECT( 14, 0x73 )  
#define P1INT_VECTOR   VECT( 15, 0x7B)  
#define RF_VECTOR     VECT( 16, 0x83)    
#define WDT_VECTOR    VECT( 17, 0x8B ) 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章