李玉秋,吳玲玲
(亳州職業技術學院,安徽 亳州 236800)
嵌入式系統是以應用為中心,根據實際應用需求軟硬件可裁剪的計算機系統,但又不同于通用的計算機,適用于對成本、功能、體積等有嚴格要求的場合。嵌入式設備在數字通信、家用電器、交通運輸、醫療設備、工業控制等各種智能控制的場合無處不在[1-3]。由于嵌入式設備的種類繁多,設計者很難滿足每一位客戶的需求,可以根據客戶的實際需要,把設備升級作為附加值給用戶。通過IAP(in-application programming)技術,嵌入式設備可以重新獲取新代碼并對用戶程序重新編程,即用程序來改變程序,完成設備的固件升級[4]。本文采用了在嵌入式設備中應用較多的ARM Cortex-M3 內核的32位微控制器STM32F103為硬件,以keil為開發環境,利用IAP技術,實現嵌入式設備的固件升級。設備的固件升級可以在智能家居產品、汽車導航、智能醫療設備產品、工業過程控制等領域中應用。
設備硬件平臺為STM32F103,ARM Cortex-M3 內核的32位微控制器,高性能、低功耗;嵌套矢量中斷控制器,對中斷事件快速響應;多個標準的通信接口,支持I2C,CAN,USB,USART等多種通信協議,便于選擇多種數據傳輸手段;內置flash為512 k,RAM空間64 k,最高工作頻率76 MHz。
IAP是指MCU可以在系統中獲取新代碼并對APP區重新編程,即可用程序來改變程序。IAP技術從結構上將flash存儲器分為兩個存儲空間,整個系統程序拆分成boot(引導加載程序)和APP(用戶應用程序)兩層程序,分別運行于flash的不同位置[5]。STM32 flash基于映射起始地址是0x08000000, Boot運行于 0x08000000—0x08020000區域,大小為128 k;APP運行于0x08020000—0x08040000區域,大小為128 k。后備程序存放于0x08040000—0x08060000區域,以便及時跳轉到備份程序區域,防止整個系統運行死機,最大程度地維護系統穩定性。STM32F103RF內置flash為512 k,對flash空間進行劃分(見圖1)。
圖1 flash的分區
由圖1可見boot區和用戶程序APP區運行在flash的不同區域,彼此互不干擾。STM32程序flash起始地址0x08000000[6],上電系統取址0x08000000,對應的是boot區程序;boot區可以執行擦除、燒寫APP區,從而實現對APP區的升級。
開發環境選用keil實現boot和APP的分區。Boot區正常配置,APP區配置如下:打開keil軟件,點擊options for target(見圖2)。
圖2 APP的配置
IROM1代表程序起始地址,keil會通過編譯,鏈接確定程序的起始地址為0x08020000,配置后形成鏈接腳本。在APP區已下載的前提下,為了確保從boot區跳轉到APP區需要確認幾個條件:
(1)需要判斷PC指針是否位于Code區,超過該區域則表明指針越界,該APP程序不可用。
(2)判斷棧頂指針是否位于0x20000000—0x3FFFFFFF區域,超過該區域則表明指針越界,該APP程序不可用。
程序先判斷PC指針,再去判斷棧頂指針,以確定程序是否正確,指針是否越界。這兩步由boot完成后,便可跳轉到APP區。如果上述兩步出錯,則程序跳轉至備用程序區,保證系統正常運行,以便進行下一次升級操作。APP區因為運行地址已經被改變,需要在程序里面指定中斷向量表的起始地址,程序默認可通過中斷向量表去尋址PC指針和棧頂指針[4],在程序里體現如下:
#define APPLICATION_ADDRESS 0x080200000
if(((*(vu32*)(APPLICATION_ADDRESS+4))&0xFF000000)=0x08000000)//判斷PC指針
if(((*(vu32*)APPLICATION_ADDRESS)&0x2FFE0000)=0x20000000)// 判斷MSP指針
APP:設置中斷向量表地址
#define FLASH_BASE((uint32_t)0x08000000)
SCB->VTOR=FLASH_BASE|0X20000; //gy for iap updata
中斷向量見表1所示,至此,從boot跳轉APP步驟結束。由上可知,0x08020000地址存放是APP區的中斷向量表[7]。
表1 中斷向量表
由表1可知從0x08020004的地址中取出復位向量,取出PC指針,PC指針對應于程序當前的指向,判斷PC指針無誤以后[8],boot進入跳轉APP層操作,否則APP區程序寫入出錯,打印出錯信息。參數appxaddr是0x08020000,下面代碼表示從APP區取出MSP的初始值。
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)
{
jump2app=(iapfun)*(vu32*)(appxaddr+4);
__set_MSP(*(__IO uint32_t *)appxaddr);
jump2app();
}
}
RAM的起始地址是0x20000000,是由STM32尋址決定的。STM32劃分了不同區域用于尋址不同的內容。由上述代碼可知,boot先判斷棧頂指針值是否正確,如不正確,中斷操作,打印錯誤信息,視為APP區程序燒寫不成功;如果MSP指針位于RAM區域,設置棧頂指針,跳轉到PC指針上,就能跳轉到APP區。
設置MSP指針
__ASM void __set_MSP(uint32_t mainStackPointer)
{
msr msp, r0
bx lr
}
升級方式可以用串口升級,也可以用網絡升級。兩者區別在于下載方式的不同。網絡升級通過HTTP協議獲取FTP服務器上的數據,本方案采用串口升級,串口傳輸文件常用的協議有xmodem、ymodem、zmodem這三種協議,在PC端使用這些協議傳輸文件只需要PC的超級終端或者終端工具SecureCRT即可[9-10]。方案測試用按鍵是否按下來表示是否需要升級提示,采用ymodem協議接收工程中生成的bin文件,bin文件包含文件大小等信息,通過串口接收到的bin文件信息判斷需要接收文件大小,然后根據文件大小判斷需要下載多少包數據,分包獲取數據寫入flash,直至整個文件全部燒寫到APP區flash中,燒寫完畢以后從boot區跳轉到新APP區,設備升級流程圖(見圖3)。
圖3 升級流程圖
基于STM32的嵌入式設備固件升級方案,利用IAP技術可以方便快捷的實現用戶程序更新升級。相比傳統的固件升級方式,不需要拆卸設備,通過串口(串口不是遠程方式)、以太網等遠程方式解決。
嵌入式設備一般固件比較小,通過串口或者無線方式獲取升級包,串口和無線(比如4G)速率較快,下載時間較短。本方案由于固件采用加密方式,MCU性能有限,硬件AES解密需要花費時間,升級過程3 min左右,升級期間不能進行任何其他操作,不能斷電。
隨著萬物互聯的智慧生活漸行漸近,智能家居、智能車載、移動醫療設備、可穿戴設備等嵌入式智能設備走進人們日常的生活,那么在不需要拆卸設備僅通過遠程加載軟件就能實現用戶功能的更新,維護方便,有較好的實用價值。