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