為了解決數(shù)字產(chǎn)品在升級(jí)程序時(shí)需要反復(fù)帶電插拔燒錄器,參考了網(wǎng)上很多BootLoader的程序例程,通過(guò)這個(gè)帖子記錄自己一步一步搭建BootLoader升級(jí)框架。設(shè)計(jì)構(gòu)思如下(控制芯片用的是STM32F103VE):
1、對(duì)flash劃分為三個(gè)區(qū)域:
2、Flash運(yùn)行流程如下:
3、程序設(shè)計(jì)思路解釋:Flash區(qū)域劃分為BootLoader、UserCode、BackUp三個(gè)區(qū)域;通過(guò)燒錄器下載BootLoader程序后,即可通過(guò)串口通信升級(jí)程序;在對(duì)UserCode程序升級(jí)完成后,會(huì)在UserCode_Verfy的地址上寫上標(biāo)識(shí)碼代表已經(jīng)有用戶程序,同時(shí)把用戶程序拷貝到BackUp區(qū)域;如此大費(fèi)周章的設(shè)計(jì)BackUp備份區(qū)是非常有必要的,在升級(jí)UserCode區(qū)域代碼的時(shí)候,如果出現(xiàn)掉線,由于升級(jí)前會(huì)把UserCode的所有程序全部擦除才能進(jìn)行升級(jí),這時(shí)候就出現(xiàn)了UserCode的程序不完整無(wú)法運(yùn)行,機(jī)器就會(huì)變成磚頭;增加了BackUp區(qū)域之后,BootLoader程序?qū)serCode_Verfy區(qū)域進(jìn)行5次識(shí)別后,就會(huì)對(duì)BackUp_Verfy區(qū)域進(jìn)行識(shí)別,識(shí)別到有備份程序后,就會(huì)主動(dòng)將備份程序拷貝回UserCode區(qū)域,從而實(shí)現(xiàn)了即使在升級(jí)過(guò)程出現(xiàn)異常,機(jī)器仍然能退回上一次存儲(chǔ)的程序運(yùn)行。
4、編程準(zhǔn)備:
芯片型號(hào)
內(nèi)存地址分布
通過(guò)資料查詢,可以了解到STM32F103VE是一款100腳內(nèi)存512K的芯片;
考慮到我們的程序存儲(chǔ)量不會(huì)太大,對(duì)Flash劃分如下:
5、通過(guò)學(xué)習(xí)《STM32F10xxx閃存編程參考手冊(cè)》
對(duì)Flash擦除,程序如下:
對(duì)Flash編程,程序如下:
標(biāo)識(shí)碼的寫入,程序如下:
程序的拷貝,程序如下:
BootLoader處理UserCode和BackUp的識(shí)別
BootLoader跳轉(zhuǎn)到UserCode的程序代碼:
主函數(shù)入口:
6、升級(jí)測(cè)試
A.正常燒錄升級(jí)流程:
下載BootLoader
在線串口升級(jí)
Loader程序正常跳轉(zhuǎn)到用戶程序
B.燒錄過(guò)程掉線測(cè)試:
升級(jí)掉線:
備份區(qū)程序拷貝,重新運(yùn)行