引言
隨著對系統功能、性能要求的不斷提高,或為了消除缺陷,用戶常常需要對嵌入式終端設備軟件進行升級。目前嵌入式終端軟件升級方法有專用工具燒寫、在系統編程(ISP)和在應用編程(IAP)等。前兩種方式需要專門的人員到達現場、甚至拆卸設備才能進行軟件升級。IAP方式可由開發人員根據實際應用進行靈活設計,例如使用串口升級、USB升級等。
由于車載終端具有移動性、分布廣泛、無法集中召回等特點,傳統軟件升級方案顯得束手無策。遠程軟件升級方案能夠為系統維護提供極大的方便,目前主流使用基于GPRS的IAP方式,但通常需要支付給運營商一定的費用。
根據某單位車輛管理系統的實際情況,本文設計出一種基于WiFi的遠程軟件升級方法。具有簡單、便捷、可靠、成本低等優點。
1 系統原理
系統結構如圖1所示。該單位有若干分部,每個分部獨立管轄所屬的車輛,每個車輛裝載一套終端,用于記錄車輛行駛信息。當車輛外出執行任務及返回經過車場門口時,與車場門口的數據采集設備通過WiFi進行數據交互。各分部數據采集設備連接至互聯網與總部進行數據交互。
終端設備MCU采用STM32F107芯片,該芯片是意法半導體公司基于ARM Cortex—M3的32位嵌入式處理器,主頻達72 MHz、90DMIPS。它具有256 KB閃存程序存儲器、20KB的數據存儲器及64 KB RAM。外圍接口豐富,價格僅與8位單片機相當,性價比極高。
WiFi模塊采用RedPine公司的RS9110-N-11-02模塊,該模塊通過SPI接口與MCU通信。RS9110-N11-02模塊為IEEE 802.11b/g/n WLAN設備,集成MAC、基帶處理器、幅值可調RF收發器、頻率參考和天線等。硬件模塊嵌入了網絡協議棧、WLAN協議和配置功能,構成一個完整的802.11n WLAN解決方案。
系統軟件升級工作過程如下:
①通過以太網把編譯好的新軟件傳輸到各分部數據采集設備上;
②車輛外出或返回時途經車場門口數據采集設備WiFi網絡覆蓋區域;
③車輛終端設備通過WiFi網絡連接到數據采集設備,如需要則進行新軟件下載;
④車輛終端執行新軟件。
2 軟件升級方法及流程
STM32F107內部FLASH存儲器地址以0x08000000開始,共256K。為了在線升級,將該FLASH存儲器如圖2所示劃分為BOOT區、應用程序區、臨時區、參數存儲區。
其中BOOT區用于存放系統自舉程序,應用程序區用于存放用戶應用軟件,臨時區用于臨時存儲正在下載的軟件,參數存儲區用于存儲程序升級時所使用的標志及其他系統參數。
軟件升級標志定義如下:正常模式、升級模式及拷貝模式。正常模式標志著無需進行軟件升級,直接跳轉到應用程序區執行;升級模式標志著終端需要下載新的應用程序;拷貝模式用于在軟件下載完畢后拷貝到應用程序區,將該部分功能獨立出來是為了在軟件下載完畢后拷貝到應用程序區時出現突然斷電等故障時進行故障恢復。
終端處于WiFi信號范圍時,接入WiFi網絡與數據采集設備進行信息交互。如圖3所示,軟件升級流程如下:
①接收到版本號查詢指令,回復本終端軟件版本號給數據采集設備;
②若版本號為最新,流程結束,否則會接收到數據采集設備發來的軟件升級指令;
③修改參數存儲區存儲的軟件升級標志為升級模式,復位MCU;
④MCU從BOOT區啟動;
⑤讀取軟件升級標志,如是“正常模式”,判斷應用程序區是否有應用程序,若有則跳轉到應用程序區執行,若無則置軟件升級標志為“升級模式”,復位MCU,跳轉到步驟④;
⑥若軟件升級標志是“拷貝模式”,拷貝臨時區軟件到應用程序區,修改軟件升級標志為正常模式,復位MCU,跳轉到步驟④;
⑦若軟件升級標志是“升級模式”,則掃描并接入WiFi網絡;
⑧使用TFTP協議下載新軟件到臨時區;
⑨校驗新軟件是否正確,若不正確則跳轉到步驟⑧,若正確則執行下一步;
⑩修改軟件升級標志為“拷貝模式”,復位MCU,跳轉到步驟④。
3 軟件實現
升級軟件主要由版本號比較、軟件復位、軟件下載及校驗、拷貝軟件到應用程序區、軟件跳轉到應用程序區幾部分組成。
(1)版本號比較
每個版本的軟件需要有不同的版本號,按照一定規則遞增,如數據采集設備上有2.0版本軟件比本終端1.0版本高,則據此進行軟件升級。
(2)軟件復位
根據本設計,軟件需要復位進入BOOT區進行一系列操作。通過使STM32內部中斷應用和復位控制寄存器中的SYSRESETREQ位置1,即可實現軟件復位。
(3)軟件下載及校驗
采用TFTP協議下載應用軟件到MCU臨時區。TFTP用于發送較小的文件時實現簡單,可靠性高。其下層使用UDP協議,發送使用UDP 69端口,每次發送的最大分組為512字節,發送雙方采用超時重傳機制。數據傳輸模式可選為octet模式(二進制模式)。
TFTP支持6種類型的數據包,分別是:
①Read rcquest(RRQ);
②Write rcquest(WRQ);
③Data(DATA);
⑤Error(ERROR);
⑥OACK。
目前常用的是前5種。由于系統只需實現終端從數據采集設備上下載軟件文件,無需實現完整的TFTP協議,僅實現上述第1、3、4、5類數據包功能即可。主要定義以下4個接口函數:
①RRQ發送接口函數定義:
void tftpReadQuerry(void);
該函數用于終端發送讀文件請求,數據采集設備收到該包將發送文件數據包給終端;
②數據包接收接口函數定義:
void tftp_recvpacket(void);
該函數用于接收數據采集設備發送到的包,根據包類型分別對ERROR包、DATA包進行處理。如果是ERROR包則需要重新傳輸文件,本次傳輸失敗。如果是DATA包,則校驗后根據包號存儲到FLASH指定位置,然后調用發送ACK函數回復ACK。掉包、錯包等的錯誤處理也在該函數執行;
③ACK發送接口函數定義:
void tftpSendAck(unsigned char BlockNo[2]);
該函數用于根據接收到的包的編號回復ACK。
④ERROR包接口函數定義:
void tftpSendErr(unsigned char BlockNo[2]);
該函數用于返回傳輸錯誤信息。
文件傳輸實現流程如下:
①數據采集設備在端口為69的UDP上等待終端發出讀文件請求包;
②終端通過UDP發送符合TFTP請求格式的RRQ包給數據采集設備;
③數據采集設備收到終端的這個請求包后,將直接發送DATA包給終端,這個DATA包中含數據采集設備選擇的TID作為UDP的源端口和終端的TID作為UDP目標端口,起始包號為1,往后包號逐次加1。
④終端接收來自數據采集設備的DATA包并回復ACK。直到請求完成。
傳輸過程中的掉包或包錯誤會導致重傳,重傳不超過三次,否則認為傳輸失敗。傳輸過程中的錯誤,會觸發發送ERROR包。ERROR包的錯誤代碼值供程序員分析使用。
(4)拷貝軟件到應用程序區
軟件正確的下載到臨時區后,需要拷貝到應用程序區。該部分關鍵部分在于STM32內嵌FLASH的擦除與讀寫。
STM32F107內嵌FLASH是通過分頁機制來實現對尋址空間的擴展和FLASH頁面的使用和管理的。所以對FLASH的擦除操作需要按頁進行擦除。即擦除FLASH不能擦除某一字節或一次擦除小于一頁(2048字節)。
FLASH擦除的具體步驟:
①解鎖FLASH編程控制寄存器;
②定位要擦除的扇區;
③寫扇區擦除命令;
④等待命令執行完成;
⑤鎖定FLASH編程控制寄存器。
對FLASH執行寫操作步驟如下:
①解鎖FLASH編程控制寄存器;
②向指定的地址寫若干字數據;
③等待上一條命令執行完成;
④如果未寫完數據,則遞增源地址和目標地址,重復步驟②和③;
⑤鎖定FLASH編程控制寄存器。
(5)軟件跳轉應用程序區
應用程序準備好后,程序需要從BOOT區跳轉到應用程序區首地址處執行應用程序。這里分為兩步:
①修改中斷向量表位置。由于STM32F107采用ARM Cortex—M3內核,該內核的系統控制空間中寫中斷向量表的寄存器地址NVIC_VectTaD_ Addr為0xE000ED08,在該地址寫入應用程序起始地址即可,本程序應用程序起始地址APP_START_ADDRESS為0x08005000。設計如下:
ldr r0,=0x08005000
ldr r1,=0xe000ed08
Str r0, [r1]
②跳轉到應用程序首地址處執行應用程序。該步驟完成堆棧指針和程序指針(PC)的修改。在上述匯編代碼之后,通過以下方式實現:
;從應用程序向量表中載入堆棧指針
ldr r1, [r0]
mov sp,r1
;從應用程序向量表中初始化程序指針(PC),并跳轉到應用程序
;入口
ldr r0, [r0,#4]
bx r0
為保證軟件升級錯誤不導致系統崩潰,將終端程序隔離為引導程序(BOOT區程序)及應用程序兩部分,如單次軟件升級失敗仍可進行再次升級。兩部分程序分別在Keil中編譯,并把BOOT區程序燒寫在FLASH首地址0x08005000處,以便終端啟動直接進入BOOT區。用于應用程序編譯吋需設定燒寫地址為應用程序區首地址,并生成bin文件以便直接下載到FLASH中即可運行。
結語
該方法實現了采用WiFi通信方式,通過TFTP協議將編譯后的軟件文件下載到終端設備,完成軟件升級的功能。在嵌入式系統領域,程序升級可以方便地對程序缺陷進行彌補和修改,或對程序功能進行擴充,運用該方法可極大提高產品的生存周期,節省對項目的維護成本和提高了開發效率。
基于該方法已成功設計出可遠程在線升級程序的車輛管理系統。使用情況表明,該系統能穩定、可靠地工作,且為系統的維護節省了大量的工作量,對同類型的嵌入式設備軟件在線升級設汁有很好的參考價值。
評論
查看更多