日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机的Bootloader,可以实现用户轻松升级程序

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机的Bootloader,可以实现用户轻松升级程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

以STM8單片機為例,該如何實現Bootloader呢?今天和大家分享一下。

01

什么是Bootloader

Bootloader是一段用于更新自身應用軟件并獨立運行的代碼,常被用于升級產品和修復產品bug。STM8單片機如果要下載hex文件的話需要通過STVP和STLINK來實現,單片機的引腳SWIM就是下載接口。如果產品在用戶端被封裝好了,無法通過SWIM來下載該怎么辦呢?就使用Bootloader,STM支持CAN和UART實現Bootloader。就是通過CAN通信或者UART通信將數據存放在STM8的Flash上。

02

劃分Flash區間

STM8的中斷向量跳轉地址是固定的,會跳轉到0x8000對應中斷的偏移地址,所以會把Bootloader存放在0x8000開始的空間內,比如給Bootloader代碼所劃分的空間為4k,那么空間起始地址為:0x8000-0x8FFF;那么應用代碼的起始地址就可以從0x9000開始。

03

修改中斷向量表

STM8的中斷向量表通過一段特定的代碼來實現,并需要根據前文提到的空間劃分來修改。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,? };

前文已經將應用程序的起始地址修改為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文件存放在編程環境的安裝目錄下,每個型號/系列的單片機都會對應一個ICF

文件,需要修改一下ICF文件,這里需要根據flash空間的劃分來修改,前面將Bootloader的終止地址設置為0x9FFF,所以修改如下:

define?region?NearFuncCode?=?[from?0x8000?to?0x8FFF]; define?block?INTVEC?with?size?=?0x80?{?ro?p?.intvec?}; place?at?start?of?NearFuncCode??{?block?INTVEC?};

05

跳轉命令

所謂跳轉,就是在應用程序中跳轉到Boot中去升級;升級完成后需要跳轉到應用程序中,所跳轉的起始就是起始地址。Bootloader跳轉到應用程序的代碼如下:

asm("LDW?X,??SP?"); asm("LD??A,??$FF"); asm("LD??XL,?A??"); asm("LDW?SP,?X??"); asm("JPF?$9000");

應用程序跳轉到Bootloader中的代碼如下

sm("LDW?X,??SP?"); asm("LD??A,??$FF"); asm("LD??XL,?A??"); asm("LDW?SP,?X??"); asm("JPF?$8000");

06

編寫交互代碼

以上設置好之后,就可以編寫交互代碼了,所以交互代碼其實就是一套協議,規定了應用程序如何跳轉到Boot,在Boot中如何處理和存儲數據,這需要上位機的支持。如果只是用于自家的產品,就可以自己定義協議。也可以使用標準的協議,比如汽車行業中的UDS(統一診斷服務)

Bootloader實現之后,就可以使用CAN/UART來實現產品固件的升級了。這就是Bootloader的關鍵內容,本文你學會了嗎?留言討論一下吧。

推薦閱讀:

專輯|Linux文章匯總

專輯|程序人生

專輯|C語言

我的知識小密圈

總結

以上是生活随笔為你收集整理的单片机的Bootloader,可以实现用户轻松升级程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。