康燕萍 程小輝 黃鵬
摘 要: 研究一種基于STM32系列單片機實現(xiàn)IAP升級固件的方案,此方案對比ST官網(wǎng)IAP升級固件方案有較大的改進。電子產品出廠燒錄固件時無需額外燒錄BootLoader引導代碼,出廠后的電子產品可使用USB線與電腦連接,通過USB接口把需要升級的固件拷貝到電子產品自帶的外部FLASH中。STM32讀取外部FLASH中的固件對自身的FLASH數(shù)據(jù)進行升級,整個升級過程中不受斷電影響。此升級方案可應用于智能家居產品、醫(yī)療電子產品、智能家電產品等。
關鍵詞: STM32; 在線應用編程; 固件; USB; 閃存
中圖分類號: TN911?34; TP311 文獻標識碼: A 文章編號: 1004?373X(2017)22?0142?03
Abstract: A research scheme of IAP firmware upgrading based on SCMs in STM32 series is introduced, which is improved greatly in comparison with the IAP firmware upgrading scheme shown in ST official website. The electronic product factory doesn′t need to burn the BootLoader guidance code in its electronic products additionally when burning the products′ firmwares. The final electronic product is connected with computer via USB cable. The firmware needing upgrade is copied into the external FLASH built?in electronic products through USB interface. The FLASH data of the firmware itself in external FLASH is read by means of STM32 for upgrade, and the whole upgrade process isn′t affected by power outage. This upgrade scheme can be applied to the intelligent household products, medical electronic products and intelligent appliances.
Keywords: STM32; IAP; firmware; USB; FLASH Memory
0 引 言
STM32控制器內嵌ARM Cortex?M3內核,具有高性能、低成本、低功耗等特點,受到越來越多電子開發(fā)人員青睞。STM32具有IAP功能,可實現(xiàn)用戶或售后技術人員對出廠后的電子產品進行固件升級。
IAP的具體應用可通過不同方式實現(xiàn)。對比文獻[1]方案和ST官網(wǎng)的IAP方案:文獻[1]方案與ST官網(wǎng)的IAP方案相同,將BootLoader代碼存放在FLASH中,執(zhí)行BootLoader之前先將BootLoader代碼拷貝到單片機的RAM中執(zhí)行,對整片F(xiàn)LASH進行數(shù)據(jù)升級[1];ST官網(wǎng)方案的缺點是固件升級過程中不能斷電,如果斷電將損壞原有的固件,導致STM32不能正常啟動。文獻[2?3]在ST官網(wǎng)的方案上進行改進,BootLoader代碼存放在FLASH中,并在FLASH中執(zhí)行BootLoader代碼,固件升級時跳過BootLoader代碼存儲區(qū),對BootLoader存儲區(qū)域之外的FLASH進行數(shù)據(jù)升級,確保BootLoader代碼的完整性,可解決固件升級過程中斷電損壞原有固件的問題[2?3]。但使用PC機的超級終端中的Ymodem協(xié)議通過串口發(fā)送固件。此方案在使用過程中存在較大的局限性,其要求PC機必須要有串口。如果PC機有串口,那么使用IAP升級的意義不大,因為通過串口可使用STM32已固化的BootLoader代碼進行ISP操作。文獻[4?5]對方案進一步改進使用SD卡或USB接口進行固件升級,這樣可以解決PC機串口局限性問題[4?5],但仍然使用兩個固件的方案,對于產品生產而言增加了固件燒錄的工作量,也不便于固件的維護。文獻[6]對兩個固件進行手工合并,將兩個固件合并成一個固件,可以解決固件燒錄的工作量大的問題[6]。但是由于手工操作,降低了固件合并的可靠性。文中方案對比上述方案有進一步改進。文中的改進方案在程序設計時也使用兩個工程,但最終將BootLoader程序工程的固件通過編譯器鏈接到應用程序工程代碼中,最終生成一個固件,減少產品生產燒錄固件的工作量。由于固件合并是由編譯器自動完成,增加了固件合并的可靠性。IAP升級固件時通過PC機的USB端口拷貝固件到電子產品的外部FLASH中,然后進行升級固件,解決了PC機要求有串口的局限性。BootLoader存放在0x08000000~0x08004FFF地址區(qū)域,上電后先執(zhí)行BootLoader代碼,滿足條件才跳轉至應用程序執(zhí)行,固件升級過程中跳過BootLoader存儲區(qū)域進行數(shù)據(jù)升級,保證BootLoader代碼的完整性,解決了固件升級過程中斷電損壞固件的問題。若STM32為互聯(lián)型產品可通過U盤連接到電子產品USB端口進行升級固件。文中以STM32F103VCT6[7]控制器為例,對IAP升級固件方案做詳細介紹。
1 硬件設計框圖
文中介紹的IAP升級固件方案需要一定的硬件電路支持。支持IAP升級固件的硬件框圖如圖1所示。endprint
由圖1可見所需要的硬件電路比較簡單:需要將STM32F103VCT6內嵌USB模塊的USB接口引出,用于連接PC機傳輸數(shù)據(jù);增加一個外部的FLASH存儲器。AT45DB041的最大存儲容量[8]為528 KB。此容量應大于STM32的FLASH容量,在IAP升級固件過程中用于存儲要升級的固件。
2 程序設計
2.1 程序架構
程序設計時分為兩個工程,分別為BootLoader程序工程和應用程序工程,程序架構如圖2所示。
BootLoader代碼里需要包含SPI驅動,AT45DB041器件驅動,F(xiàn)ats文件系統(tǒng)。BootLoader代碼是通過檢查AT45DB041存儲器中是否存在update.bin文件來判斷是否需要進行固件升級操作。由于BootLoader代碼最終需要鏈接到應用程序中執(zhí)行,應用程序的中斷被重新映射到0x08005000地址開始,因此BootLoader代碼里面需要關閉所有中斷,SPI模塊也只能通過查詢方式進行數(shù)據(jù)收發(fā)。
應用程序中需包含SPI驅動,AT45DB041器件驅動,F(xiàn)ats文件系統(tǒng),還需包含USB驅動。應用程序執(zhí)行過程中,若有用戶需要對電子產品進行固件升級,應用程序將啟動USB模塊,將電子產品用USB線連接到電腦,將固件改名為update.bin后拷貝到AT45DB041的模擬U盤中,重啟后可執(zhí)行固件升級操作。
2.2 FLASH存儲區(qū)域劃分
STM32F103VCT6為大容量產品,具有256 KB FLASH,48 KB RAM[7]。256 KB的FLASH存儲區(qū)共分為128頁,每頁大小為2 KB。將存儲區(qū)域分為兩部分,地址0x08000000~0x08004FFF共20 KB空間用于存放BootLoader代碼,地址0x08005000~0x0803FFFF共236 KB的空間用于存放電子產品實現(xiàn)功能的應用程序代碼。BootLoader程序代碼與應用程序代碼用兩個不同的工程編譯。BootLoader編譯完成之后生成bin固件,使用IAR編譯器鏈接到應用程序的工程文件中,最后生成一個最終的bin文件。最后的這個文件為產品生產或產品固件升級的程序固件。STM32 FLASH區(qū)域劃分如圖3所示。
2.3 固件升級流程
STM32系列的MCU上電啟動后會自動跳轉到0x08000000地址開始執(zhí)行[9]。由于BootLoader代碼位于0x08000000地址開始,因此每次上電都應開始運行BootLoader代碼。在BootLoader代碼里檢查是否有升級固件文件,若有則進行升級操作,升級完成后將固件文件刪除;若沒有則跳轉至應用程序代碼執(zhí)行[10]。固件升級工作流程如圖4所示。升級固件時需要注意一下幾點:
(1) 打開update.bin文件后讀取前20 KB數(shù)據(jù)丟棄,因為前20 KB數(shù)據(jù)是BootLoader代碼,此部分代碼不需要升級。
(2) 升級固件時應該從0x08005000地址開始寫FLASH,不能對0x08000000~0x08004FFF的地址區(qū)域進行寫FLASH操作,此區(qū)域為BootLoader代碼區(qū)域,如果進行寫操作,則會導致整個固件損壞[11]。
3 IAR編譯器相關配置
3.1 icf文件配置
每一款芯片的程序使用IAR編譯器編譯時都會使用到一個.icf后綴名的文件。此文件的作用是定義芯片的內存區(qū)域,一般情況下不需要修改此文件。STM32F103VCT6的FLASH被劃分為2個區(qū)域,分別用于存放不同功能的程序代碼。為了能將程序代碼存放到指定的FLASH區(qū)域,需要修改icf文件。由于BootLoader代碼與應用程序為不同的程序工程,因此需要修改2份icf文件。BootLoader程序工程的icf文件修改如下:
3.2 bin文件鏈接
改進方案的優(yōu)點在于將BootLoader的bin文件使用IAR編譯器鏈接到應用程序的工程中,最終生成一個bin文件。減少產品在生產上的程序燒錄工作和程序維護工作。將BootLoader工程生成的bin文件改名為bootloader.bin。并將此文件拷貝到應用程序的工程目錄下。然后打開應用程序工程,在workspace窗口選擇工程名,單擊鼠標右鍵選擇Option?>Linker?>Input。Bin文件鏈接配置如圖5所示。
Keep symbols可隨意填寫,文中填寫bootloader,此處與下面的symbols編輯框填寫一致。由于bootloader.bin放置在應用程序工程目錄文件路徑應該填寫$PROJ_DIR$\bootloader.bin。Section編輯框填寫.bootloader,與icf文件中配置的一致。鏈接后對工程進行編譯,如果不報錯,說明鏈接成功,可打開.map文件查看鏈接bin文件的地址分配。
4 結 語
經測試可用此方案對STM32F103VCT6進行固件升級。固件升級過程中對電子產品進行人為斷電,重新上電后可繼續(xù)重新升級,不受斷電影響。整個固件升級過程需要約1 min。對此方案還可進行延伸改進,如果STM32為互聯(lián)型產品,USB可支持OTG功能,可使用U盤連接到電子產品,將固件文件從U盤中拷貝到AT45DB041中,無需PC機參與。也可將AT45DB041改用SD卡,先將固件文件拷貝到SD中,再將SD卡插到電子產品中進行固件升級。
參考文獻
[1] 陳峰峰,胡毅,許艷.STM32F10x在應用中編程的實現(xiàn)方法[J].單片機與嵌入式系統(tǒng)應用,2009(9):25?27.
[2] 張舞杰,南亦明.基于STM32F103VB的應用編程技術的實現(xiàn)[J].計算機應用,2009,29(10):2820?2822.
[3] 李興鶴,蔡亮,宋吉波,等.STM32用戶基于IAP的程序更新技術[J].單片機與嵌入式系統(tǒng)應用,2012(1):74?75.
[4] 王黨利,寧生科,馬保吉.基于STM32F10x引導程序實現(xiàn)USB在應用中編程[J].應用天地,2010,29(11):68?70.
[5] 顏秋男,胡毅.STM32F103VB的SD卡在應用編程設計[J].單片機與嵌入式系統(tǒng)應用,2012(2):29?31.
[6] 唐小平,廖美英,張祥.基于STM32平臺的IAP設計實現(xiàn)[J].兵工自動化,2014,33(9):94?96.
[7] 陳宮,王三勝,張慶榮,等.基于STM32F103VCT6的微位移控制系統(tǒng)設計[J].現(xiàn)代電子技術,2012,35(3):144?146.
[8] 張杏珍,孫健.IC卡芯片AT45DB041的原理及應用[J].現(xiàn)代電子技術,2005,28(10):17?19.
[9] 程霄.基于邊坡監(jiān)測系統(tǒng)的無線傳感器網(wǎng)絡關鍵技術研究[D].重慶:重慶大學,2014:56.
[10] 周天兵,劉國忠.單片機程序遠程升級技術[J].儀表技術,2011(9):25?27.
[11] 李靜波.嵌入式系統(tǒng)固件升級的設計[J].今日電子,2013(10):53?55.endprint