丁鵬飛 法 林
(西安郵電大學電子工程學院,陜西 西安 710121)
隨著嵌入式終端技術的發展,嵌入式系統在化工、機電、國防等領域的應用越來越廣泛,嵌入式系統在現代工業中無處不在[1]。在石油化工行業中,用于設備運行狀態檢測和數據采集的智能儀器儀表的內部軟件需要定期或不定期地進行升級[2],用于滿足電網中配電變壓器的自動化裝置對系統的遠程升級與維護提出的要求[3]。遠程升級技術通過遠程升級儀器的應用程序,滿足應用過程提出的新的應用要求,降低系統升級的成本。
本文利用通用無線分組業務(general packet radio service,GPRS),設計了基于 STM32F205VB處理器的遠程升級系統。系統使用GPRS模塊實現升級代碼的傳輸,具有價格低廉、網絡覆蓋范圍廣、無線傳輸等特點[4]。系統通過升級程序將接收的升級代碼寫入程序存儲區,實現系統的遠程升級,避免了工作人員到現場進行設備的升級,節約了時間和人力。
在微處理器中,程序存儲器的編程方法通常有3種[5]:并行編程模式、通過串口或JTAG等接口進行編程的在系統編程(in system programming,ISP)模式,以及在應用程序控制下的在應用編程(in application programming,IAP)模式。
并行編程是較早單片機的編程方式。該模式通過專用的編程器對單片機進行程序的燒寫,需要額外的編程器,且花費較多的開發時間,這種單片機已被淘汰。ISP編程模式由于其調試的方便性得到眾多廠家的廣泛支持。IAP是應用Flash程序存儲器的一種編程模式[6]。IAP模式是將Flash程序存儲區化分為兩個不同程序區域(程序區域1和程序區域2)。運行于程序區域1的應用程序為引導加載程序,即Bootloader程序;運行于程序區域2的應用程序為用戶應用程序。Bootloader程序是一段引導程序,它駐留在處理器的程序存儲器,當處理器上電或復位后在用戶應用程序之前運行。Bootloader程序檢測升級標志位確定是否需要對用戶應用程序進行升級。如果不需要升級應用程序時,直接運行用戶應用程序;如果需要升用戶級應用程序時,Bootloader程序通過Flash存儲器的擦除、讀、寫機制對程序區域2進行擦除,并將需要更新的程序寫入程序區域2,即寫入應用程序區域。當程序區域2的應用程序更新完畢后,跳轉到程序區域2運行新用戶程序,從而實現程序的升級。
本文針對意法半導體(ST)公司所開發的基于ARM Cortex-M3內核的STM32F205VB處理器,研究遠程升級功能的實現方法。該方法將STM32F205VB處理器的 Flash存儲器分為3個區:升級引導程序(Bootloader)區、用戶應用程序區以及升級代碼+升級標志區。每次上電后,Bootloader根據升級標志判斷是否需要升級用戶程序。當需要升級應用程序時,Bootloader將接收的升級代碼寫入用戶程序區,并刪除升級標志并運行用戶應用程序;當不需要升級應用程序時,直接運行用戶應用程序。STM32F205VB處理器通過GPRS模塊與遠程控制中心實現無線連接,并通過GPRS模塊接收控制中心的控制命令和升級代碼。遠程升級的連接框圖如圖1所示。

圖1 遠程升級連接框圖Fig.1 Block diagram of the remote upgrading system
STM32F205VB處理器是意法半導體公司生產的基于ARM 32位Cortex-M3內核的處理器,其自適應實時加速器使Flash存儲器的程序無等待執行,時鐘頻率高達120 MHz。該處理器集成了3路12位A/D轉換器、2路12位D/A轉換器、通用DMA控制器、高達17個定時器,支持串行線調試(serial wire debug,SWD)和聯合測試測試行動小組(joint test action group,JTAG)接口協議。該處理器具有128 kB程序存儲器和64 kB SRAM,支持I2C、SPI、CAN等通信方式。
STM32F205VB處理器有1片統存儲器區,地址為:0x1FFF0000~0x1FFF7A0F。該存儲器區域為處理器的引導空間,即通過串口下載用戶程序的內置引導程序。處理器的引導模式選擇管腳(BOOT1、BOOT0)決定處理器的啟動模式。當BOOT1=X、BOOT0=0時,運行用戶程序;當 BOOT1=0、BOOT0=1時,運行內置引導程序實現應用程序的下載;當BOOT1=1、BOOT0=1時,運行內置SRAM中的程序。運行用戶應用程序時,BOOT0=0;運行內置引導程序下載用戶應用程序時,BOOT0=1。因此,通過內置引導程序升級用戶程序時必須改變BOOT0管腳的電平,而當程序下載完成時需再次改變BOOT0管腳的電平。應用內置引導程序進行程序的下載需要對BOOT0關鍵進行短接,而“短接”動作與“遠程”直接矛盾[7]。因此,基于STM32F205VB處理器應用系統的遠程升級必須通過自己的引導程序實現應用程序的更新。
為實現應用系統的遠程升級,將STM32F205VB處理的程序分為用于實現用戶應用程序升級的Bootloader程序和用戶應用程序。在升級應用程序前,需要接收用于系統升級的程序代碼。因此,實現遠程升級功能涉及Bootloader程序、用戶應用程序的設計和升級代碼的存儲。充分考慮STM32F205VB存儲器內置了128 kB的Flash存儲器,將Flash存儲器劃分為Bootloader程序存儲區、用戶程序存儲區和升級代碼存儲區。STM32F205VB將Flash存儲器將存儲區劃分為5個扇區,存儲地址從0x80000000開始,第0~3扇區分別為16 kB,第4扇區為64 kB,共128 kB(如果需要更多的存儲空間,可以選擇Flash存儲空間更大的處理器,如STM32F205ZG的Flash存儲空間為1 MB)。扇區的擦除是以扇區為單位進行的。為此,根據Bootloader和用戶程序的大小,將Flash存儲器空間進行分配,分配值如表1所示。

表1 STM32F205VB Flash存儲器分配Tab.1 STM32F205VB Flash memory allocation
系統升級程序設計成用于接收升級代碼的升級代碼接收程序和更新應用程序的Bootloader兩個部分。系統升級程序的流程圖如圖2所示。系統上電后,首先運行Bootloader程序,Bootloader程序通過讀取升級標志位確認是否對系統程序進行升級。當升級標志位置位時,Bootloader讀取升級代碼并將升級代碼寫入用戶程序區,升級代碼寫入完畢后,啟動應用程序。當應用程序接收到升級代碼時,應用程序接收升級代碼并存儲到升級代碼區,升級代碼接收完畢后判斷接收代碼是否完整、正確。當判斷升級代碼接收完畢且完整無誤時,置位升級標志位并復位處理器。處理器復位后運行Bootloader將接收的升級代碼寫入用戶程序區實現系統程序的升級。

圖2 系統升級程序流程圖Fig.2 Flowchart of the system upgrading program
Bootloader設計是遠程升級的重點,如何避免升級過程中出現的各種意外情況,是遠程升級的基礎。很多遠程升級系統通過Bootloader接收升級程序數據[6-9],而在升級程序數據傳輸過程中有以下兩種常見的原因導致傳輸時間較長:①由于傳輸傳輸鏈路不穩定可能導致同一包數據需要多次發送;②升級程序數據量大,而傳輸速率較低。這種遠程升級系統方案在升級過程中應用程序停止運行,用戶應用程序因較長時間不能處理設備的任務而不能滿足實時性要求較高的場合。本文通過改變以往遠程升級的數據傳輸方式,通過用戶升級代碼接收程序接收升級代碼。升級代碼數據準確接收后,設置程序升級標志,并重啟處理器由Bootloader完成應用程序的升級,從而減少升級任務的處理時間,滿足系統實時性的要求。Bootloader程序流程圖如圖3所示。

圖3 Bootloader程序流程圖Fig.3 Flowchart of the Bootloader
升級代碼接收程序完成升級代碼的接收。該程序通過接收數據中斷啟動,不影響應用程序的正常運行,保證了升級代碼接收階段系統的正常運行。升級代碼接收程序的流程圖如圖4所示。

圖4 升級代碼接收程序流程圖Fig.4 Flowchart of the upgrading code receiving program
系統應用程序的升級必須保證升級數據的正確性和升級代碼的完整性。不完整的升級代碼或不正確的升級代碼都將使系統癱瘓。通過遠程升級的抗掉電、抗誤碼和合法性等措施,保證了系統升級的可靠性和安全性。
在進行升級的過程中,難免會出現突然掉電的情況,所以必須有可靠的機制避免因突然掉電而導致程序升級失敗的情況。在程序升級的過程中,突然掉電可能發生在以下兩種情況:①數據接收過程中;②數據已接收完畢,Bootloader正將升級程序復制到應用程序區。在第一種情況下,應用程序不會置位升級標志位,原來的應用程序區域保持不變,重新上電后,處理器運行老的應用程序,不會出現因升級的應用程序不完整而使系統癱瘓的情況。在第二種情況下,重新上電后,Bootloader讀取升級標志位并重新復制應用程序,完成應用程序的升級,從而保證寫入程序存儲區的程序是完整的。
升級代碼接收程序將升級代碼存儲到Flash存儲器,充分保證在第二種情況發生時能進行應用程序的正常升級。在接收升級代碼期間,系統應用程序正常工作,大大減少了因系統升級而不能工作的時間。
升級代碼接收程序接收的升級代碼數據是處理器運行的代碼,很小的傳輸錯誤都會造成升級后的系統癱瘓。因此,消除升級錯誤傳輸碼的升級程序是保證系統升級后正常運行的關鍵,為此,采用帶CRC校驗的通信協議解決。
為保證接收數據的正確性,設計升級代碼的傳輸幀格式表2所示。

表2 升級代碼的傳輸幀格式Tab.2 The transmission frame format of upgrading code B
表2中,起始標志表示幀頭;功能碼表示該幀是升級命令幀,收到該幀數據表示接收的數據為遠程升級代碼;總幀數表示升級代碼的總幀數;當前幀表示當前為升級代碼的第幾幀;數據表示升級代碼數據;校驗位表示數據幀中前1028個數據的CRC校驗碼。當傳輸最后一幀數據時,有可能升級代碼不足1024 B,不足的字節在數據幀中用0xff填充,從而保證所有幀中數據的個數為1024 B。發送升級代碼端在發送完一幀數據后等待下位機的應答數據幀,若收到正確的回應幀,則繼續發送下一幀數據;若收到請求重發回應幀,則重發剛才發送的數據幀;3次等待超時則停止發送。
在遠程升級的控制中心,可能因為操作人員的誤操作將非升級代碼的BIN文件當作升級程序文件進行了升級操縱。在誤發送升級代碼的情況下,接收端在升級了錯誤的升級代碼后導致系統癱瘓,必須由技術人員到現場進行修復。因此,升級程序合法性檢查是保證系統升級后正常運行的重要手段。為此,采取以下方式保證升級程序的合法。
①對發送升級代碼端的應用程序設置登錄密碼,并設置登錄人員的使用權限。只有授權進行遠程升級的用戶,才能進行遠程升級操作。
②在應用程序設計過程中,定義用于程序合法性的字符串常量,并將該常量定位到某個固定的地址,當控制中心打開升級代碼的BIN文件時,檢查固定地址的合法性字符串常量。當檢測到字符串為非法時,拒絕執行遠程升級操作;當字符串合法時,才允許操作人員執行遠程升級操作。
通過升級程序合法性檢查措施,杜絕了因操作人員的非法操縱或誤操作導致的系統癱瘓,大大提高了遠程升級的安全性和可靠性。
本文所設計的基于STM32F205VB的遠程升級技術,通過Flash存儲器的合理劃分、抗掉電設計、抗誤碼設計和程序合法性檢查等手段,保證了該升級技術的高度穩定性和可靠性。該設計方案巧妙地將升級代碼接收程序作為系統應用程序的一部分并通過中斷方式啟動,在升級代碼接收結束后運行Bootloade實現系統的升級,解決了升級過程中系統長時間不能工作的難題,滿足了系統實時性的要求。該遠程升級技術可以應用于其他控制系統,具有廣泛的應用前景和較高的使用價值。
[1]Shi Wenchang.Implementing operating system support for extended trusted path in TPM-capable environments[J].Journal of Natural Sciences,2006,11(6):1493 -1497.
[2]張宏建,蒙建波.自動檢測技術與裝置[M].北京:化學工業出版社,2004.
[3]韋文詳,劉曉莉,張桂玉.一種嵌入式遠程配變監控終端的研究與設計[J].自動化儀表,2007,28(3):13 -16.
[4]陳新,劉慧威,趙彥平,等.單片機程序遠程升級的研究與實現[J].電子質量,2011(12):53 -56,78.
[5]田日才,王國鵬,梁學東.ATMEGA128單片機的軟件遠程升級[J].電子技術應用,2003(11):23-25.
[6]李衛紅,張凌云,陳天喜,等.基于IAP程序遠程更新設計在車載乘客信息顯示中的應用[J].機車電傳動,2012(2):79-81.
[7]尹恒,嚴華.一種針對嵌入式遠程升級安全的存儲解決方案[J].計算機應用,2011,31(4):942 -944,998.
[8]孫鋼,朱忠常,景振興.煤礦安全監控分站遠程升級方案[J].工礦自動化,2012(3):58 -60.
[9]楊晶,何鵬舉,朱升林,等.具有遠程升級功能的網絡化智能溫控器[J].測控技術,2012,31(11):6-10.