0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)的Bootloader可以實(shí)現(xiàn)用戶輕松升級程序

工程師 ? 來源:玩轉(zhuǎn)嵌入式 ? 作者: 劉小舒 ? 2020-10-23 16:57 ? 次閱讀

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

STM8單片機(jī)為例,該如何實(shí)現(xiàn)Bootloader呢?今天和大家分享一下。

01

什么是Bootloader

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

02

劃分Flash區(qū)間

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

03

修改中斷向量表

STM8的中斷向量表通過一段特定的代碼來實(shí)現(xiàn),并需要根據(jù)前文提到的空間劃分來修改。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,所以,向量表的的修改方法為: 除了第一個元素為,其余的元素將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)境的安裝目錄下,每個型號/系列的單片機(jī)都會對應(yīng)一個ICF

文件,需要修改一下ICF文件,這里需要根據(jù)flash空間的劃分來修改,前面將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中去升級;升級完成后需要跳轉(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

編寫交互代碼

以上設(shè)置好之后,就可以編寫交互代碼了,所以交互代碼其實(shí)就是一套協(xié)議,規(guī)定了應(yīng)用程序如何跳轉(zhuǎn)到Boot,在Boot中如何處理和存儲數(shù)據(jù),這需要上位機(jī)的支持。如果只是用于自家的產(chǎn)品,就可以自己定義協(xié)議。也可以使用標(biāo)準(zhǔn)的協(xié)議,比如汽車行業(yè)中的UDS(統(tǒng)一診斷服務(wù))。

Bootloader實(shí)現(xiàn)之后,就可以使用CAN/UART來實(shí)現(xiàn)產(chǎn)品固件的升級了。這就是Bootloader的關(guān)鍵內(nèi)容,本文你學(xué)會了嗎?留言討論一下吧。

-END-

來源 | 玩轉(zhuǎn)嵌入式

作者 | 劉小舒

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6026

    文章

    44456

    瀏覽量

    631000
  • CAN
    CAN
    +關(guān)注

    關(guān)注

    57

    文章

    2686

    瀏覽量

    462936
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4697

    瀏覽量

    68091
收藏 人收藏

    評論

    相關(guān)推薦

    單片機(jī)怎么寫入程序

    程序通常涉及以下幾個步驟: 選擇單片機(jī)和開發(fā)環(huán)境 : 確定項(xiàng)目需求,選擇合適的單片機(jī)型號。 安裝相應(yīng)的開發(fā)環(huán)境,如Keil、IAR、MPLAB等。 硬件連接 : 將單片機(jī)連接到開發(fā)板或
    的頭像 發(fā)表于 10-21 11:21 ?94次閱讀

    keil可以讀出單片機(jī)程序

    表述存在一定的誤解,因?yàn)镵eil主要是用于編寫、編譯和調(diào)試單片機(jī)程序的工具,而不是直接從單片機(jī)中讀取已編程代碼的工具。 一、Keil的主要功能 編程開發(fā) :Keil允許用戶使用C語言或
    的頭像 發(fā)表于 09-02 10:32 ?472次閱讀

    單片機(jī)燒錄程序用什么軟件

    單片機(jī)燒錄程序單片機(jī)開發(fā)過程中的一個重要環(huán)節(jié),涉及到將編寫好的程序代碼通過燒錄器寫入單片機(jī)的ROM中,以
    的頭像 發(fā)表于 09-02 10:05 ?541次閱讀

    單片機(jī)燒錄程序可以重新燒嗎

    好的程序代碼通過特定的方式寫入單片機(jī)的存儲器中,使其能夠按照預(yù)定的邏輯執(zhí)行任務(wù)。單片機(jī)燒錄程序可以重新燒錄,這是
    的頭像 發(fā)表于 09-02 10:04 ?620次閱讀

    單片機(jī)燒錄程序的基本步驟是什么

    單片機(jī)燒錄程序單片機(jī)開發(fā)過程中非常重要的一步,它涉及到將編寫好的程序代碼通過一定的方式傳輸?shù)?b class='flag-5'>單片機(jī)內(nèi)部的存儲器中,使
    的頭像 發(fā)表于 09-02 09:47 ?473次閱讀

    stm32單片機(jī)燒錄程序會擦除原來的程序

    在STM32單片機(jī)燒錄程序的過程中, 通常情況下會擦除原來的程序 ,并將新程序寫入單片機(jī)的閃存(Flash)中。這一過程是通過燒錄工具(如S
    的頭像 發(fā)表于 09-02 09:42 ?810次閱讀

    藍(lán)牙模塊如何實(shí)現(xiàn)單片機(jī)和手機(jī)端數(shù)據(jù)互傳

    藍(lán)牙模塊實(shí)現(xiàn)單片機(jī)和手機(jī)端數(shù)據(jù)互傳的過程可以分為以下幾個步驟: 硬件準(zhǔn)備 : 確保你有一個支持藍(lán)牙通信的單片機(jī)開發(fā)板,如Arduino、Raspberry Pi等。 準(zhǔn)備一個兼容的藍(lán)牙
    的頭像 發(fā)表于 07-24 17:59 ?1842次閱讀
    藍(lán)牙模塊如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>單片機(jī)</b>和手機(jī)端數(shù)據(jù)互傳

    STM32單片機(jī)實(shí)現(xiàn)固件在線升級(IAP)

    1,固件升級方案綜述單片機(jī)的固件升級方式有很多種。1、ICP:簡單說就是在單片機(jī)開發(fā)時使用燒錄器升級程序
    的頭像 發(fā)表于 12-16 08:00 ?4420次閱讀
    STM32<b class='flag-5'>單片機(jī)</b><b class='flag-5'>實(shí)現(xiàn)</b>固件在線<b class='flag-5'>升級</b>(IAP)

    pic單片機(jī)匯編程序實(shí)例

    。 以下是一個簡單的PIC單片機(jī)匯編程序示例,這個程序實(shí)現(xiàn)一個LED閃爍的功能。 配置PIC單片機(jī)的引腳 在PIC
    的頭像 發(fā)表于 12-14 11:01 ?1610次閱讀

    GD32單片機(jī)STM32遠(yuǎn)程下載手機(jī)程序升級固件下載局域網(wǎng)網(wǎng)頁升級工具

    GD32、STM32單片機(jī),是我們最常見的一種MCU。通常我們在使用STM32單片機(jī)都會遇到程序在線升級下載的問題。 GD32/STM32單片機(jī)
    發(fā)表于 11-10 15:03

    如何使用vc++制作51單片機(jī)的上位機(jī)?

    我想實(shí)現(xiàn)用VC++程序來控制51單片機(jī)的各個接口,同時也能讀取單片機(jī)的中斷。目前市面上單片機(jī)都是使用CH340來連接電腦,通過相應(yīng)
    發(fā)表于 11-10 06:51

    GD32單片機(jī)STM32遠(yuǎn)程下載手機(jī)程序升級固件下載局域網(wǎng)網(wǎng)頁升級工具

    GD32、STM32單片機(jī),是我們最常見的一種MCU。通常我們在使用STM32單片機(jī)都會遇到程序在線升級下載的問題。使用該方法可以完成手機(jī)網(wǎng)
    的頭像 發(fā)表于 11-09 12:31 ?1872次閱讀
    GD32<b class='flag-5'>單片機(jī)</b>STM32遠(yuǎn)程下載手機(jī)<b class='flag-5'>程序</b><b class='flag-5'>升級</b>固件下載局域網(wǎng)網(wǎng)頁<b class='flag-5'>升級</b>工具

    stc51單片機(jī)程序存儲區(qū)不夠用,可否在程序存儲區(qū)寫一個bootloader,用戶程序放入自身的EEPROM?

    stc51單片機(jī)程序存儲區(qū)不夠用,可否在程序存儲區(qū)寫一個bootloader,用戶程序放入自身的
    發(fā)表于 11-09 07:09

    怎樣給單片機(jī)編寫bootloader?

    怎樣給單片機(jī)編寫bootloader
    發(fā)表于 10-30 07:45

    單片機(jī)BootLoader與APP如何合并?

    單片機(jī)BootLoader與APP如何合并?
    的頭像 發(fā)表于 10-25 17:17 ?1068次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>BootLoader</b>與APP如何合并?