這次出差是為了升級(jí)程序解決Bug,用戶已經(jīng)將產(chǎn)品封裝起來(lái),無(wú)法開(kāi)蓋,只能使用CAN總線來(lái)更新程序,用Bootloader實(shí)現(xiàn)。其實(shí)就是通過(guò)上位機(jī)把.bin/hex文件以CAN通訊的方式發(fā)送給單片機(jī)并存儲(chǔ)在規(guī)定的Flash中。 這個(gè)過(guò)程與手機(jī)端更新APP類似。
以STM8單片機(jī)為例,該如何實(shí)現(xiàn)Bootloader呢?今天和大家分享一下。
01
什么是Bootloader
Bootloader是一段用于更新自身應(yīng)用軟件并獨(dú)立運(yùn)行的代碼,常被用于升級(jí)產(chǎn)品和修復(fù)產(chǎn)品bug。STM8單片機(jī)如果要下載hex文件的話需要通過(guò)STVP和STLINK來(lái)實(shí)現(xiàn),單片機(jī)的引腳SWIM就是下載接口。如果產(chǎn)品在用戶端被封裝好了,無(wú)法通過(guò)SWIM來(lái)下載該怎么辦呢?就使用Bootloader,STM支持CAN和UART實(shí)現(xiàn)Bootloader。就是通過(guò)CAN通信或者UART通信將數(shù)據(jù)存放在STM8的Flash上。
02
劃分Flash區(qū)間
STM8的中斷向量跳轉(zhuǎn)地 址是固定的,會(huì) 跳轉(zhuǎn)到0x8000對(duì)應(yīng)中斷的偏移地址,所以會(huì)把Bootloader存放在0x8000開(kāi)始的空間內(nèi),比如給Bootloader代碼所劃分的空間為4k,那么空間起始地址為:0x8000-0x8FFF;那么應(yīng)用代碼的起始地址就可以從0x9000開(kāi)始。
03
修改中斷向量表
STM8的中斷向量表通過(guò)一段特定的代碼來(lái)實(shí)現(xiàn),并需要根據(jù)前文提到的空間劃分來(lái)修改。STM8的應(yīng)用程序起始地址是0x8400,默認(rèn)的向量表如下代碼所示。
__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)將應(yīng)用程序的起始地址修改為0x9000,所以,向量表的的修改方法為: 除了第一個(gè)元素為,其余的元素將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)境的安裝目錄下,每個(gè)型號(hào)/系列的單片機(jī)都會(huì)對(duì)應(yīng)一個(gè)ICF
文件,需要修改一下ICF文件,這里需要根據(jù)flash空間的劃分來(lái)修改,前面將Bootloader的終止地址設(shè)置為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),就是在應(yīng)用程序中跳轉(zhuǎn)到Boot中去升級(jí);升級(jí)完成后需要跳轉(zhuǎn)到應(yīng)用程序中,所跳轉(zhuǎn)的起始就是起始地址。Bootloader跳轉(zhuǎn)到應(yīng)用程序的代碼如下,
asm(“LDW X, SP ”);asm(“LD A, $FF”);asm(“LD XL, A ”);asm(“LDW SP, X ”);asm(“JPF $9000”);
應(yīng)用程序跳轉(zhuǎn)到Bootloader中的代碼如下
sm(“LDW X, SP ”);asm(“LD A, $FF”);asm(“LD XL, A ”);asm(“LDW SP, X ”);asm(“JPF $8000”);
06
編寫(xiě)交互代碼
以上設(shè)置好之后,就可以編寫(xiě)交互代碼了,所以交互代碼其實(shí)就是一套協(xié)議,規(guī)定了應(yīng)用程序如何跳轉(zhuǎn)到Boot,在Boot中如何處理和存儲(chǔ)數(shù)據(jù),這需要上位機(jī)的支持。如果只是用于自家的產(chǎn)品,就可以自己定義協(xié)議。也可以使用標(biāo)準(zhǔn)的協(xié)議,比如汽車行業(yè)中的UDS(統(tǒng)一診斷服務(wù))。
Bootloader實(shí)現(xiàn)之后,就可以使用CAN/UART來(lái)實(shí)現(xiàn)產(chǎn)品固件的升級(jí)了。這就是Bootloader的關(guān)鍵內(nèi)容,本文你學(xué)會(huì)了嗎?留言討論一下吧。
-END-
來(lái)源 | 玩轉(zhuǎn)嵌入式
作者 | 劉小舒
責(zé)任編輯:haq
-
單片機(jī)
+關(guān)注
關(guān)注
6043文章
44622瀏覽量
638540 -
CAN
+關(guān)注
關(guān)注
57文章
2769瀏覽量
464383 -
代碼
+關(guān)注
關(guān)注
30文章
4825瀏覽量
69046
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
單片機(jī)怎么寫(xiě)入程序
8位單片機(jī),32位單片機(jī)編程和應(yīng)用優(yōu)勢(shì)
如何開(kāi)發(fā)不帶Flash API 的Bootloader實(shí)現(xiàn)在線升級(jí)
![如何開(kāi)發(fā)不帶Flash API 的<b class='flag-5'>Bootloader</b><b class='flag-5'>實(shí)現(xiàn)</b>在線<b class='flag-5'>升級(jí)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
單片機(jī)加wifi模塊可以做什么
keil可以讀出單片機(jī)的程序嗎
單片機(jī)燒錄程序用什么軟件
單片機(jī)燒錄程序可以重新燒嗎
單片機(jī)燒錄程序的線比單片機(jī)上的少還能燒錄嗎
單片機(jī)燒錄程序的基本步驟是什么
stm32單片機(jī)燒錄程序會(huì)擦除原來(lái)的程序嗎
藍(lán)牙模塊如何實(shí)現(xiàn)單片機(jī)和手機(jī)端數(shù)據(jù)互傳
![藍(lán)牙模塊如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>單片機(jī)</b>和手機(jī)端數(shù)據(jù)互傳](https://file1.elecfans.com/web2/M00/FF/17/wKgaomagzkeAd9gtAAAaFxHI0pw392.png)
單片機(jī)學(xué)到什么程度可以找工作?
![<b class='flag-5'>單片機(jī)</b>學(xué)到什么程度<b class='flag-5'>可以</b>找工作?](https://file.elecfans.com/web2/M00/9B/3D/poYBAGQjnauAVXOgAABFcEbXdEE684.png)
幾種常用單片機(jī)的在線升級(jí)能力比較
單片機(jī)的BootLoader高階玩法
![<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>BootLoader</b>高階玩法](https://file1.elecfans.com/web2/M00/C4/3F/wKgaomXqqXiAbDHrAAASpNrqnqs745.jpg)
評(píng)論