最近一直在研究ZigBee2006協(xié)議棧,,需要用到硬件,。有關(guān)硬件的頭文件和C文件基本上都在HAL文件夾里,這里面有各個(gè)硬件,,如鍵盤(pán),、LCD、串口等外設(shè)的頭文件,,在hal/target/2430BB,、2430DB、2340EB文件夾里有相應(yīng)的C文件,。如果你自己寫(xiě)了相關(guān)硬件的函數(shù),,那么請(qǐng)將這些函數(shù)及其定義放在相應(yīng)的hal_頭文件和C文件里。下面,,我以串口0中斷的應(yīng)用為例,,介紹如何在協(xié)議棧中添加中斷。 首先,,要對(duì)串口進(jìn)行初始化:使能相應(yīng)管腳,設(shè)定波特率,、串口工作模式等,。然后使能串口中斷和全部中斷,,即打開(kāi)串口中斷。 其次,,我們需要找到中斷函數(shù)的定義,,這個(gè)文件的名字叫做hal_mcu.h,在hal/target/2430BB,、2430DB,、2340EB文件夾里都有,可以在IAR的hal/target/2430BB/includes(hal/target/2430DB/includes和hal/target/2430EB/includes里也有)文件夾里找到,。雙擊打開(kāi),,我們可以看到很多宏定義,其中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) //定義預(yù)處理指令宏 #define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) //IAR中斷函數(shù)聲明定義格式宏 #define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) //IAR中斷函數(shù)原型定義格式宏 #define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) //IAR中斷函數(shù)定義格式宏 /* ---------------------- 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 這里定義了在不同編譯環(huán)境下的終端函數(shù),,我們可以看出ZigBee2006協(xié)議棧僅支持IAR和Keil兩種編譯環(huán)境,,其他的編譯器會(huì)當(dāng)做未識(shí)別的編譯器并報(bào)錯(cuò)("ERROR: Unknown compiler.")。我使用的是IAR編譯環(huán)境,,并對(duì)上面的代碼進(jìn)行注釋,。 用紅色字體標(biāo)出的部分就是我們定義中斷函數(shù)的格式要求,這三個(gè)宏的意思表明了對(duì)中斷函數(shù)定義的規(guī)則:首先,,要在文件代碼頂端進(jìn)行函數(shù)聲明(格式:_PRAGMA(vector=v) __near_func __interrupt void f(void);),;然后,在相應(yīng)的C文件里定義中斷函數(shù)原型(格式:_PRAGMA(vector=v) __near_func __interrupt void f(void){...}),。其實(shí)和C語(yǔ)言中定義函數(shù)一模一樣,,但是格式要按照協(xié)議棧規(guī)定的來(lái)寫(xiě)。 例如: #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) { .... //函數(shù)體 } 例子中淺藍(lán)色的部分是可以自己來(lái)設(shè)定的,,其他格式都是確定的,,以上就是在協(xié)議棧中添加中斷函數(shù)的方法,希望能對(duì)你有所幫助,。 附:中斷向量表 /* ------------------------------------------------------------------------------------------------ * 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 */ |
|