去某新能源大廠出了一次差,這次出差是為了升級程序解決Bug,需要給單片機重新燒錄.hex文件,用戶已經(jīng)將產(chǎn)品封裝起來,無法開蓋,只能使用CAN總線來更新程序,用Bootloader實現(xiàn)。其實就是通過上位機把.bin/hex文件以CAN通訊的方式發(fā)送給單片機并存儲在規(guī)定的Flash中。這個過程與手機端更新APP類似。

以STM8單片機為例,該如何實現(xiàn)Bootloader呢?今天和大家分享一下。
01
什么是Bootloader
Bootloader是一段用于更新自身應用軟件并獨立運行的代碼,常被用于升級產(chǎn)品和修復產(chǎn)品bug。STM8單片機如果要下載hex文件的話需要通過STVP和STLINK來實現(xiàn),單片機的引腳SWIM就是下載接口。如果產(chǎn)品在用戶端被封裝好了,無法通過SWIM來下載該怎么辦呢?就使用Bootloader,STM支持CAN和UART實現(xiàn)Bootloader。就是通過CAN通信或者UART通信將數(shù)據(jù)存放在STM8的Flash上。
02
劃分Flash區(qū)間
STM8的中斷向量跳轉(zhuǎn)地址是固定的,會跳轉(zhuǎn)到0x8000對應中斷的偏移地址,所以會把Bootloader存放在0x8000開始的空間內(nèi),比如給Bootloader代碼所劃分的空間為4k,那么空間起始地址為:0x8000-0x8FFF;那么應用代碼的起始地址就可以從0x9000開始。
03
修改中斷向量表
STM8的中斷向量表通過一段特定的代碼來實現(xiàn),并需要根據(jù)前文提到的空間劃分來修改。STM8的應用程序起始地址是0x8400,默認的向量表如下代碼所示:
__root const long reintvec[]@“.intvec”=
{
0x82008080,0x82008404,0x82008408,0x8200840c,
0x82008410,0x82008414,0x82008418,0x8200841c,
0x82008420,0x82008424,0x82008428,0x8200842c,
0x82008430,0x82008434,0x82008438,0x8200843c,
0x82008440,0x82008444,0x82008448,0x8200844c,
0x82008450,0x82008454,0x82008458,0x8200845c,
0x82008460,0x82008464,0x82008468,0x8200846c,
0x82008470,0x82008474,0x82008478,0x8200847c,
};
前文已經(jīng)將應用程序的起始地址修改為0x9000,所以,向量表的的修改方法為:除了第一個元素為,其余的元素將8改為9,修改完后代碼如下:
__root const long reintvec[]@“.intvec”=
{
0x82008080,0x82009404,0x82009408,0x8200940c,
0x82009010,0x82009014,0x82009018,0x8200901c,
0x82009020,0x82009024,0x82009028,0x8200902c,
0x82009030,0x82009034,0x82009038,0x8200903c,
0x82009040,0x82009044,0x82009048,0x8200904c,
0x82009050,0x82009054,0x82009058,0x8200905c,
0x82009060,0x82009064,0x82009068,0x8200906c,
0x82009070,0x82009074,0x82009078,0x8200907c,
};
04
修改ICF文件
ICF文件存放在編程環(huán)境的安裝目錄下,每個型號/系列的單片機都會對應一個ICF文件,需要修改一下ICF文件,這里需要根據(jù)flash空間的劃分來修改,前面將Bootloader的終止地址設置為0x9FFF,所以修改如下:
define region NearFuncCode = [from 0x8000 to 0x8FFF];
define block INTVEC with size = 0x80 { ro section .intvec };
place at start of NearFuncCode { block INTVEC };

05
跳轉(zhuǎn)命令
所謂跳轉(zhuǎn),就是在應用程序中跳轉(zhuǎn)到Boot中去升級;升級完成后需要跳轉(zhuǎn)到應用程序中,所跳轉(zhuǎn)的起始就是起始地址。Bootloader跳轉(zhuǎn)到應用程序的代碼如下:
asm(“LDW X, SP ”);
asm(“LD A, $FF”);
asm(“LD XL, A ”);
asm(“LDW SP, X ”);
asm(“JPF $9000”);
應用程序跳轉(zhuǎn)到Bootloader中的代碼如下
sm(“LDW X, SP ”);
asm(“LD A, $FF”);
asm(“LD XL, A ”);
asm(“LDW SP, X ”);
asm(“JPF $8000”);
06
編寫交互代碼
以上設置好之后,就可以編寫交互代碼了,所以交互代碼其實就是一套協(xié)議,規(guī)定了應用程序如何跳轉(zhuǎn)到Boot,在Boot中如何處理和存儲數(shù)據(jù),這需要上位機的支持。如果只是用于自家的產(chǎn)品,就可以自己定義協(xié)議。也可以使用標準的協(xié)議,比如汽車行業(yè)中的UDS(統(tǒng)一診斷服務)。Bootloader實現(xiàn)之后,就可以使用CAN/UART來實現(xiàn)產(chǎn)品固件的升級了。這就是Bootloader的關鍵內(nèi)容,本文你學會了嗎?留言討論一下吧。
原文標題:單片機的Bootloader,可以實現(xiàn)用戶輕松升級程序
文章出處:【微信公眾號:玩轉(zhuǎn)單片機】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
責任編輯:haq
-
單片機
+關注
關注
6078文章
45591瀏覽量
673978 -
bootloader
+關注
關注
2文章
245瀏覽量
48320
原文標題:單片機的Bootloader,可以實現(xiàn)用戶輕松升級程序
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
探索COP8SA系列8位單片機:特點、性能與應用優(yōu)勢
Infineon XC866 8位單片機:特性、功能與應用解析
Infineon XC886/888CLM 8位單片機:特性與應用詳解
Infineon XC87xCLM 8位單片機:功能特性與設計要點解析
瑞薩8位單片機740族:技術剖析與設計指南
瑞薩 8 位單片機 740 族指令系統(tǒng)與設計要點解析
浮思特 | 電子溫度計單片機如何選型?ABOV單片機提供幾點很關鍵!
單片機位數(shù)的思考(8位、16位、32位)
Bootloader固件升級的步驟
浮思特 | 如何通過現(xiàn)代(ABOV)8位單片機實現(xiàn)智能家居與工業(yè)控制的升級
怎么測單片機系統(tǒng)頻率
單片機怎么驅(qū)動電機?
STM8 C語言精品編程100例
你們還在用8位單片機嗎?
STM8單片機為例,如何實現(xiàn)Bootloader?
評論