單片機的Bootloader,可以實現用戶輕鬆升級程序

今年的雨水天氣使得夏天並不像以往那麼炎熱,反倒是立秋之後,天氣開始炎熱起來,南京的夏天是真的熱,在大熱天裏穿梭於江蘇和福建之間,又熱又累。早上4點起牀,6點多的火車,到福建12點;晚上又從溫州轉車至南京,回來已經半夜12點多了。多希望能有一陣涼爽的風呀,《今夜的風》分享一下,願在炎熱的夏季能有絲絲涼風帶走酷暑。

這次出差是爲了升級程序解決Bug,用戶已經將產品封裝起來,無法開蓋,只能使用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 section .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(統一診斷服務)
































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章