無線傳感器網(wǎng)絡(luò)底層平臺的深層研究
引言
目前,對WSN(Wireless Sensor Netwoek)的研究主要集中在協(xié)議棧、定位算法、能耗管理以及體系結(jié)構(gòu)設(shè)計上,而針對無線傳感網(wǎng)絡(luò)操作系統(tǒng)的研究卻相對較少,尤其是對其底層平臺的研究更少,所以針對無線傳感網(wǎng)絡(luò)操作系統(tǒng)底層平臺的研究有十分廣闊的空間。本論文針對意法半導(dǎo)體STM32系列MCU和TI公司的CC2520無線模塊進(jìn)行介紹。主要描述了操作系統(tǒng)底層平臺的構(gòu)建,以及硬件驅(qū)動程序的實現(xiàn)。本論文的底層硬件抽象層是針對CC2520無線射頻模塊的,包括了平臺構(gòu)建、相關(guān)寄存器,以及外圍接口等各個部分。而硬件驅(qū)動程序主要是為完成無線通信所需的硬件驅(qū)動設(shè)計,這主要包括:相應(yīng)異步事件的中斷機(jī)制;和PC通信的USART驅(qū)動;連接MCU和CC2520的SPI驅(qū)動;完成超時計時的定時器等。這些模塊的有效組成,才能構(gòu)成一個完整的無線傳感器網(wǎng)絡(luò)最小通信系統(tǒng),完成節(jié)點間數(shù)據(jù)傳輸、數(shù)據(jù)處理,以及定位和導(dǎo)航等任務(wù)。
STM32系列MCU采用ARM公司V7架構(gòu)的Correx—M3內(nèi)核。CC2520是第二代ZigBee/IEEE 802.15.4收發(fā)器。
1 底層平臺研究
硬件抽象層的底層硬件模塊有很多,本節(jié)只簡單介紹和無線傳感器網(wǎng)絡(luò)相關(guān)的底層模塊設(shè)計。
1.1 定時器
STM32系列的CPU能提供8個定時器,其中TIM1和TIM8是高級定時器,可用于各種用途,包括測量輸入信號的脈沖長度(輸入捕捉)或產(chǎn)生輸出波形(輸出比較)等,它們的時鐘由APB2提供。TIM2~TIM7是普通定時器,時鐘由APB1提拱。圖1為STM32時鐘樹中有關(guān)定時器的部分。
從圖1可以看出,從系統(tǒng)設(shè)置的時鐘源產(chǎn)生的時鐘頻率輸入到AHB預(yù)分頻器,進(jìn)行分頻處理,然后經(jīng)過APB1預(yù)分頻器和APB2預(yù)分頻器給不同模塊提供不同的時鐘頻率。下面以定時器2作為例子說明。當(dāng)AHB預(yù)分頻器輸入頻率為72 MHz的時候,由于APB1支持的最大頻率為36 MHz,所以APB1預(yù)分頻器,設(shè)置必須大于或等于2,假設(shè)設(shè)置為2,則在APB1倍頻器中,頻率被設(shè)置為72 MHz(當(dāng)APB1分頻數(shù)=1的時候,APB1倍頻器加倍系數(shù)為1,當(dāng)APBl分頻數(shù)>1的時候,APB1倍頻器加倍系數(shù)為2),所以最終提供給定時器2~7的頻率為72 MHz。所以只需要設(shè)置APB1預(yù)分頻器和APB1倍頻器的值,便可以提供不同頻率的定時器。定時器采用計數(shù)溢出的方式觸發(fā)定時器中斷,因此想要使用定時器,必須先配置好定時器中斷。
1.2 中斷
對STM32系列MCU的中斷配置步驟如下:
①系統(tǒng)初始化:如系統(tǒng)時鐘初始化,使用固件模板中自帶的SystemInit()函數(shù)即可,此函數(shù)把主頻默認(rèn)調(diào)整到72 MHz。
②GPIO配置:配置觸發(fā)CPU中斷的引腳,務(wù)必注意打開相應(yīng)引腳的GPIO時鐘和AFIO時鐘。配置引腳的頻率和輸入模式,一般為浮空輸入模式。
③EXTI配置:首先指明當(dāng)前系統(tǒng)中使用哪個引腳作為觸發(fā)外部中斷的引腳,然后清除中斷標(biāo)志位,配置中斷請求和觸發(fā)方式(上升沿觸發(fā)或下降沿觸發(fā))。
④NVIC配置:主要配置中斷對應(yīng)的通道,并且設(shè)置優(yōu)先級別,最后需要對通道使能。
⑤編寫中斷服務(wù)程序:中斷服務(wù)程序是發(fā)生中斷時實際運行的程序,它打斷了正在運行的程序,對相應(yīng)中斷事件進(jìn)行相應(yīng)處理。由于中斷程序打斷了現(xiàn)有程序的運行,而且需要對中斷事件作出快速響應(yīng),所以要盡量短小,而且不能傳遞參數(shù),沒有返回值。
1.3 USART
USART模塊一般分為三大部分:數(shù)據(jù)發(fā)送器、數(shù)據(jù)接收器和時鐘發(fā)生器。所有模塊共享控制寄存器。時鐘發(fā)生器由波特率發(fā)生器和同步邏輯電路組成。
數(shù)據(jù)發(fā)送器部分由寫入緩沖寄存器(USART DR)、校驗位發(fā)生器、串行移位寄存器和控制邏輯電路構(gòu)成。使用寫入緩沖寄存器,可以連續(xù)快速地發(fā)送多幀數(shù)據(jù)。
數(shù)據(jù)接收器是USART模塊最復(fù)雜的部分最主要的是數(shù)據(jù)接收單元和時鐘。數(shù)據(jù)接收單元用作異步數(shù)據(jù)的接收。數(shù)據(jù)接收器還包括移位寄存器、控制邏輯、校驗位校驗器和接收緩沖器。數(shù)據(jù)接收器支持與數(shù)據(jù)發(fā)送器相同的幀結(jié)構(gòu),同時支持?jǐn)?shù)據(jù)溢出、幀錯誤和校驗錯誤的檢測。
無線節(jié)點可以通過USART與PC通信。本文只實現(xiàn)了簡單的USART功能。串口使用前需要完成初始化,主要設(shè)置字長、波特率、奇偶校驗位、傳輸模式、數(shù)據(jù)位數(shù)、流控制、打開串口時鐘和配置串口發(fā)送接收引腳等。
有了串口的輸入/輸出功能后,可以自己重寫庫函數(shù)printf,便于調(diào)試和觀察節(jié)點運行情況,讓節(jié)點終端輸出重定向到PC,然后在PC上通過串口工具顯示節(jié)點發(fā)送過來的數(shù)據(jù)信息,從而分析終端運行情況。具體函數(shù)設(shè)計是:如果節(jié)點輸出字符串?dāng)?shù)據(jù),則直接調(diào)用串口輸出字符串函數(shù),通過串口把字符串?dāng)?shù)據(jù)發(fā)送到PC顯示;如果是輸出數(shù)字,則先把數(shù)字按指定顯示進(jìn)制轉(zhuǎn)換成字符串,然后按照輸出字符串方式處理??梢灾貙慽toa()函數(shù),把輸入的數(shù)字按照任意進(jìn)制保存到字符串中。
1.4 SPI
SPI有三種寄存器:控制寄存器(SPI_CR)、狀態(tài)寄存器(SPI_SR)、數(shù)據(jù)寄存器(SPI_DR)。SPI接口包括4種信號:MOSI——從器件數(shù)據(jù)輸入,主器件數(shù)據(jù)輸出;MISO——從器件數(shù)據(jù)輸出,主器件數(shù)據(jù)輸入;SCLK——時鐘信號,由主器件產(chǎn)生;NSS——從器件選擇使能信號,由主器件控制,有的芯片廠家會標(biāo)注為CS(Chip Select)。
由于無線模塊CC2520必須通過SPI接口才能和MCU通信,所以必須先實現(xiàn)SPI接口,才能控制CC2520接收和發(fā)送數(shù)據(jù)。SPI接口的處理方式和USART接口的處理方式很像,本文只實現(xiàn)了簡單的SPI功能。SPI使用前必須初始化,主要工作包括設(shè)置主從模式、波特率、數(shù)據(jù)位數(shù)、數(shù)據(jù)幀格式、配置輸入/輸出引腳和時鐘信號的相位和極性等。
1.5 CC2520驅(qū)動
MCU通過SPI接口控制CC2520啟動、關(guān)閉、收發(fā)數(shù)據(jù)等。SPI接口由SI、SO、CSn和SCLK四個引腳構(gòu)成。在MCU和CC2520通信過程中,CC2520為SPI接口從設(shè)備,接收MCU發(fā)來的時鐘信號和片選信號,并在MCU的控制下執(zhí)行發(fā)送數(shù)據(jù)、接收數(shù)據(jù)等操作;STM32為接口主設(shè)備,可以通過SPI接口訪問CC2520內(nèi)部存儲區(qū)和寄存器。CC2520通過FIFO、FIFOP、SFD和CCA四個引腳來表示工作狀態(tài)。MCU可以通過讀取這些引腳的數(shù)據(jù)來獲得CC2520收發(fā)數(shù)據(jù)的狀態(tài)。SFD信號表示剛接收到或者剛發(fā)送完幀開始信號;FIFO信號表示一個或者多個字節(jié)在接收緩沖區(qū);FIFOP信號表示接收緩沖區(qū)中的字節(jié)數(shù)超出設(shè)置的門限或者接收到至少一幀完整的數(shù)據(jù);CCA信號表示信道空閑。
CC2520大概工作流程:首先是準(zhǔn)備工作。上層應(yīng)用程序中使用halRfInit()函數(shù)完成CC2520的一些初始化工作,如復(fù)位CC2520,關(guān)閉電壓調(diào)整器,根據(jù)CC2520數(shù)據(jù)手冊需要延時1100μs。延時完成后,開啟電壓調(diào)整器,再延時200μs,然后使能CC2520,完成后,申請SPI資源并初始化。開啟振蕩器,然后通過SPI接口配置CC2520中一些寄存器的默認(rèn)值,如TXPOWER、CCACTRL0、MAMCTRL0、MAMCTRL1等寄存器的值。然后對MCU和CC2520相連的引腳進(jìn)行初始配置,比如把RSTN、VREN和CSN配置為輸出模式,把FIFO、FIFOP、CCA和SFD配置為輸入模式。
上層應(yīng)用程序中使用basicRfInit()函數(shù)完成對信道、短地址和網(wǎng)絡(luò)ID的設(shè)置,并配置接收中斷處理函數(shù),用于接收到數(shù)據(jù)產(chǎn)生中斷時處理接收數(shù)據(jù)。
應(yīng)用程序執(zhí)行發(fā)送命令時,按照協(xié)議棧從上層一層層封裝好數(shù)據(jù)后,最終把數(shù)據(jù)交給basicRfSendPacket()函數(shù)處理。具體發(fā)送過程如圖2所示。
圖中封裝的格式按照協(xié)議要求,內(nèi)容主要包括數(shù)據(jù)長度、幀控制域(FCF)、目的地址、源地址、目的網(wǎng)絡(luò)ID、源網(wǎng)絡(luò)ID、發(fā)送數(shù)據(jù)、CRC(Cyclic Redundancy Check)校驗碼等。當(dāng)采用的是硬件CRC檢驗時,不需要用戶計算添加CRC檢驗碼,也不需要CRC檢驗數(shù)據(jù)寫入TXFIFO(CC2 520發(fā)送緩沖區(qū))中,有專門的寄存器存儲CRC檢驗數(shù)據(jù),由硬件完成檢驗和發(fā)送。當(dāng)采用軟件CRC檢驗時,需要用戶自己計算CRC檢驗數(shù)據(jù),并填寫在幀的最后兩字節(jié)中,隨幀中其他數(shù)據(jù)一起寫入TXFIFO。
分頻器相關(guān)文章:分頻器原理
評論