顧東袁,傅曉婕,陳愛軍,盧 瑾
基于STM32的Bootloader實驗系統設計
顧東袁1,傅曉婕2,陳愛軍1,盧 瑾1
(1. 浙江工業大學 信息工程學院,浙江 杭州 310023;2. 浙江長征職業技術學院 計算機與信息技術系,浙江 杭州 310023)
設計了一套基于STM32的Bootloader實驗系統。該系統主要完成引導加載和用戶交互兩大功能,存儲方式采用“多系統存儲”的結構設計,引導加載過程中設計了3種不同的工作模式,用戶交互部分分權限設計了不同的指令。該系統為不同層次的學生提供相應難度的實踐鍛煉,引導學生鞏固理論知識、積極探索、提高創新能力。
嵌入式系統;實驗系統;STM32;Flash
嵌入式系統是一門把“硬件、軟件融合在一起”和具有較強實踐性的課程,傳統的8051單片機教學和“ARM+Linux”的嵌入式教學方式亟待改進,當前嵌入式已成為消費電子領域的主流技術,課程實驗的內容更應體現互聯網、物聯網時代的最新應用[1]。
隨著近年來物聯網的飛速發展,具有聯網功能的智能硬件設備不斷涌現,設備中的固件需頻繁在線更新,在此類應用中Bootloader發揮著非常重要的作用[2-4]。目前Bootloader大多針對高性能處理器和存儲器資源充裕的嵌入式平臺,功能強大、全面,但相對復雜[5],對于實驗教學來說很難做到讓學生全面、深入地了解,大多僅停留在使用層面,無法滿足實驗教學的要求[6-7]。
為此,本文結合當前主流的高性能、低成本、低功耗的STM32微處理器,設計了一套面向低端嵌入式平臺的Bootloader實驗系統。該系統采用“多系統存儲”的結構設計,同時結合物聯網應用中的特點,對傳統的引導加載過程進行了優化調整,進一步保證嵌入式硬件設備運行可靠性??紤]到實驗中的難易程度,在軟件實現上對一些操作進行了函數封裝供學生調用,滿足不同層次學生的實驗要求。
嵌入軟件系統一般由引導加載程序(Bootloader)和用戶應用系統這兩部分代碼構成,Bootloader是設備上電后最初要運行的代碼[8]。一般首先要完成硬件資源的初始化,實現處理器內部寄存器和部分相關設備的初始化,使其處于確定和可訪問狀態。初始化完成后,Bootloader系統會主動獲取設備的狀態,并根據各狀態選擇直接引導至用戶應用系統或啟動Bootloader主程序,進入用戶交互界面。其引導基本過程見圖1。

圖1 Bootloader程序引導過程
在嵌入式系統應用環境中,Bootloader對于硬件配置有很強的依賴性。因此,在嵌入式應用環境中建立一個通用的Bootloader幾乎是不可能[8-9]。實驗過程中將使用自制的STM32實驗開發板作為硬件平臺,實物圖見圖2。該實驗開發板主要面向互聯網創新應用實驗和學生創新實踐,采用了ST公司基于ARM Cortex-M4內核的STM32F427作為主控MCU,該MCU具有高達180 MHz處理速度和1 MB片內存儲,同時配置了片外Flash存儲和TF存儲。片外Flash存儲采用華邦SPI Flash芯片W25Q64,將用于存儲程序和數據的容量擴展到了8 MB;TF存儲使用常見的micro SD卡,利用MCU提供的SDIO接口實現。上述硬件資源的配置完全滿足Bootloader實驗開展的基本要求。

圖2 實驗平臺設備實物圖
以往Bootloader通常需完成用戶程序引導和升級固件下載兩塊功能,升級固件下載一般通過USB DFU協議和串口YModem協議等方式實現[10-11]。但在物聯網、互聯網相關應用中,原本Bootloader中的升級固件下載功能基本移到了用戶應用程序中實現,Bootloader僅需在系統重啟后完成新程序的引導[12]。這樣可大大簡化Bootloader的設計,同時可應用于更多的低端MCU中。
本文設計的Bootloader系統主要完成引導加載和用戶交互兩大功能,存儲方式采用了“多系統存儲”結構設計,可有效地避免因程序更新失敗或其他問題導致嵌入式設備無法啟動。Bootloader整體的架構如圖3所示,交互指令主要以選單(菜單)的方式提供管理、模式設置等功能;引導加載根據參數標志位進行應用程序的重定位;系統在無法進行正常引導的情況下,可恢復出廠設置。

圖3 Boot Loader架構圖
根據“多系統存儲”結構設計和實驗硬件平臺的特點,將實驗開發板中的STM32F427微處理器片內的1 MB Flash分為Bootloader引導加載程序區32 KB、應用程序1區384 KB、應用程序2區384 KB、參數區16 KB以及保留區128 KB,片外W25Q64的8 MB Flash存放出廠固件程序512 KB和參數備份區16 KB。存儲分區結構如圖4所示。
(1)引導加載程序區為Bootloader引導程序,地址為0X08000000-0X08007FFF。
(2)參數區分2塊存儲,一塊位于片內Flash,緊跟Bootloader引導程序,地址為0X08008000- 0X0800BFFF;另一塊為參數的備份區,位于片外Flash,緊跟出廠固件程序,地址為0X080000-0X083FFF。
(3)應用程序區分3塊區域存儲:位于片內Flash中的應用程序1區和應用程序2區,用于升級過程中固件的切換;片外Flash存儲出廠固件,主要用于固件備份。應用程序1區地址0X08020000—0X0807FFFF,應用程序2區地址0X08080000—0X080DFFFF,出廠固件地址0X000000—0X07FFFF。

圖4 存儲分區圖
參數區中存儲的各個參數由應用程序與Bootloader引導程序共同維護,作為兩部分程序通信的橋梁。參數區中各字段含義見表1。

表1 參數區各字段含義說明
在Bootloader程序啟動并完成必要的硬件資源初始化后,等待串口的輸入信息執行不同的指令。系統提供了如表2所示的各類指令。同時考慮到有些指令除了使MCU更好地工作外,也能破壞MCU正常運行及代碼的保護,系統中設置了普通和管理員兩種工作權限。

表2 菜單功能說明表
引導加載是Bootloader的核心功能,系統中將加載過程分為3種模式:正常模式、升級模式和異常模式。執行流程如圖5所示,通過檢查參數區中的FlagUpgrade和EnableAPP來決定執行的動作。

圖5 引導加載執行流程
(1)正常模式。正常模式中不對參數區中的參數做任何修改,只根據有效APP號在取得應用程序的首地址后實現跳轉。
(2)升級模式。在應用程序中已實現了新固件的下載、校驗和存儲,該模式中僅需更改參數區的有效APP號,再執行正常模式的流程。
(3)異常模式。當兩塊應用程序區都無法正常運行時,通過異常模式進行預置出廠固件的恢復。該模式中將片外出廠預置的固件拷貝至片內應用程序1區,并更改參數區的各參數,最后通過軟復位重啟設備。如遇預置的出廠固件有問題時,可通過外部TF卡內的固件恢復到出廠固件區,作為最后一道安全保障。
本系統開發環境選用MDK KEIL工具軟件,采用C語言編程。考慮到學生實驗過程中對代碼的可復用性,對核心部分的實現代碼進行了不同程度的封裝,整個Bootloader的軟件開發包含了大量的參數邏輯判斷、Flash操作和程序跳轉,對該部分內容做了重點優化設計。
在Bootloader整個過程中,大部分地方都涉及各類參數的讀取、更新等操作。為了使代碼結構更為清晰、簡潔,對圖5中的各參數用結構體進行如下封裝:
typedef struct _PARM_CONFIG{
uint8_t ucFlagUpgrade;/*升級標志位*/
uint8_t ucEnableAPP; /*當前有效APP號*/
uint32_t unAPP1Version;/*應用程序1區固件版本號*/
……
}parm_config;
整個開發過程中涉及到片內、片外的Flash寫入、擦除、讀取操作,考慮到STM32的Flash操作比較繁瑣、復雜,對Flash的3種操作進行了函數封裝,學生只需傳入必要的參數即可實現,讓學生的注意力更多地集中在Bootloader工作流程上。
Flash擦除函數:IoT_Flash_Erase(eiot_partition partition, uint32_t off_set, uint32_t size);
Flash寫入函數:IoT_Flash_Write(eiot_partition partition, volatile uint32_t* off_set, uint8_t* inbuffer, uint32_t inbuffer_length);
Flash讀取函數:IoT_Flash_Read(eiot_partition partition, volatile uint32_t* off_set, uint8_t* outbuffer, uint32_t outbuffer_length);
程序跳轉是Bootloader最基本且最重要的功能,參照官方STM32的IAP技術原理,使用匯編語言編寫[13],跳轉函數為Iap_Load_App(uint32_t appxaddr)。
void Iap_Load_App(uint32_t appxaddr){
if(((*(vu32*)appxaddr) & 0x2FFE0000) == 0x20000000){
/*確定復位中斷向量起始地址*/
MSR_MSP(*(vu32*)appxaddr);
Jump_to_App(); //跳轉到用戶程序
}
}
實驗過程中,需事先編寫好2個簡單的應用程序bin文件,如通過GPIO控制LED燈的常亮和常滅,并將編譯好的bin文件通過仿真器燒錄到起始地址為0X08020000和0X08080000兩塊區域中。計算機通過USB數據線與開發板的串口USB連接,使用串口助手進行監聽,實驗場景如圖6所示。Bootloader程序啟動后會在串口助手中打印出提示信息并等待用戶指令的輸入,根據輸入不同的指令實現所設計的功能,最終實現用戶應用程序的引導。圖7為普通權限的指令界面,圖8為管理員權限指令界面,實現了應用程序區和出廠固件區中固件的相互拷貝復制功能。


圖7 普通權限的指令執行界面

.
基于STM32的Bootloader實驗系統已在本科生創新實踐環節和研究生必選的工程實踐課中應用,取得了良好的效果。通過設計不同難度梯度的實驗內容,可適用不同層次的學生,也為學生在既定的實驗內容下預留了一定的拓展空間。該實驗系統緊密結合物聯網、互聯網相關應用,能很好調動學生的積極性,通過實際動手操作來鞏固嵌入式系統等課程的理論知識,引導學生積極探索、提高其創新能力。
[1] 周世杰,李玉柏,李平,等.新工科建設背景下“互聯網+”復合型精英人才培養模式的探索與實踐[J].高等工程教育研究,2018(5): 11–16.
[2] 李強,羅超,夏威,等. FPGA遠程更新系統[J].儀表技術與傳感器,2014(7): 72–74.
[3] SHEN L, LI N, WANG S. Optimization on ZigBee OTA Technique[C]//Advanced Information Management, Communicates, Electronic & Automation Control Conference. IEEE, 2017: 119–122.
[4] KANG Y, CHEN J, LI B. Generic Bootloader Architecture Based on Automatic Update Mechanism[C]//2018 IEEE 3rd International Conference on Signal and Image Processing (ICSIP). IEEE, 2018: 586–590.
[5] GUO J, CHEN W. BOOTLOADER Analysis Construction and U-BOOT Porting Based on S3C2440[C]//2018 2nd IEEE Advanced Information Management, Communicates, Electronic and Automation Control Conference (IMCEC). IEEE, 2018: 1893–1897.
[6] 陳凱,魏文博,鄧明.嵌入式系統教學實驗板開發[J].實驗技術與管理,2016, 33(1): 82–85.
[7] 姚莉,倪波.基于OBE的嵌入式Linux系統開發課程教學改革研究[J].軟件導刊(教育技術),2017, 16(12): 7–11.
[8] 范蟠果,邢保毫,米曉亮,等.基于嵌入式S3C2440系統Bootloader設計與實現[J].計算機測量與控制,2016, 24(9): 12–14.
[9] KANG Y, CHEN J, LI B. Generic Bootloader Architecture Based on Automatic Update Mechanism[C]//2018 IEEE 3rd International Conference on Signal and Image Processing (ICSIP). IEEE, 2018: 586–590.
[10] 鄧中亮,孫靜.嵌入式設備在線系統升級的設計與實現[J].計算機工程與設計,2009, 30(13): 3085–3087.
[11] 陳紹煒,魏剛,王子. TMS320C6416程序以太網遠程更新技術研究[J].現代電子技術,2014, 37(12): 125–128.
[12] CHANDRA H, ANGGADJAJA E, WIJAYA P S, et al. Internet of Things: Over-the-Air (OTA) firmware update in Lightweight mesh network protocol for smart urban development[C]// Communications (APCC), 2016 22nd Asia-Pacific Conference on. IEEE, 2016: 115–118.
[13] “STM32F427/437”[EB/OL]. [2019-01-16]. https://www.st.com/ en/microcontrollers/stm32f427-437.html?querycriteria=productId=LN1789.
Design of Bootloader experimental system based on STM32
GU Dongyuan1, FU Xiaojie2, CHEN Aijun1, LU Jin1
(1. College of Information Engineering, Zhejiang University of Technology, Hangzhou 310023, China; 2. Department of Computer and Information Technology, Zhejiang Changzheng Vocational and Technical College, Hangzhou 310023, China)
A set of Bootloader experimental system based on STM32 is designed. This system mainly completes two functions such as the boot loading and user interaction. The storage mode adopts the structure design of “multi-system storage” to design the three different working modes in the boot loading process and set up different instructions in the user interaction part with different privileges. This system provides practical exercises with corresponding difficulty for students at different levels, and guides them to consolidate theoretical knowledge, actively explore and improve their innovative ability.
embedded system; experimental system; STM32; Flash
TP368.2;G642
A
1002-4956(2019)11-0089-05
10.16791/j.cnki.sjg.2019.11.022
2019-03-11
浙江省自然科學基金項目(LY16F050009);浙江省公益技術應用研究計劃項目(2017C33149);浙江工業大學創新性實驗項目(“基于互聯網的積木式嵌入式系統實驗設計”);浙江工業大學課堂教學改革項目(KG201814)
顧東袁(1980—),男,浙江海寧,碩士,實驗師,主要研究方向為嵌入式系統、物聯網技術。E-mail: star918@163.com