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

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

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

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

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

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

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

01

什么是Bootloader

Bootloader是一段用于更新自身應(yīng)用軟件并獨立運行的代碼,常被用于升級產(chǎn)品和修復(fù)產(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對應(yīng)中斷的偏移地址,所以會把Bootloader存放在0x8000開始的空間內(nèi),比如給Bootloader代碼所劃分的空間為4k,那么空間起始地址為:0x8000-0x8FFF;那么應(yīng)用代碼的起始地址就可以從0x9000開始。

03

修改中斷向量表

STM8的中斷向量表通過一段特定的代碼來實現(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)境的安裝目錄下,每個型號/系列的單片機都會對應(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è)置好之后,就可以編寫交互代碼了,所以交互代碼其實就是一套協(xié)議,規(guī)定了應(yīng)用程序如何跳轉(zhuǎn)到Boot,在Boot中如何處理和存儲數(shù)據(jù),這需要上位機的支持。如果只是用于自家的產(chǎn)品,就可以自己定義協(xié)議。也可以使用標(biāo)準(zhǔn)的協(xié)議,比如汽車行業(yè)中的UDS(統(tǒng)一診斷服務(wù))。

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

-END-

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

作者 | 劉小舒

責(zé)任編輯:haq

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

    關(guān)注

    6040

    文章

    44594

    瀏覽量

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

    關(guān)注

    57

    文章

    2762

    瀏覽量

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

    關(guān)注

    30

    文章

    4810

    瀏覽量

    68827
收藏 人收藏

    評論

    相關(guān)推薦

    單片機怎么寫入程序

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

    8位單片機,32位單片機編程和應(yīng)用優(yōu)勢

    軟件更新即可實現(xiàn)功能升級和錯誤修復(fù),無需復(fù)雜的硬件更換過程。這種后期維護的便捷性,是傳統(tǒng)硬件所無法比擬的。 此外,單片機還支持在線編程和調(diào)試,開發(fā)者可以在不中斷系統(tǒng)運行的情況下進行
    發(fā)表于 09-26 11:45

    如何開發(fā)不帶Flash API 的Bootloader實現(xiàn)在線升級

    電子發(fā)燒友網(wǎng)站提供《如何開發(fā)不帶Flash API 的Bootloader實現(xiàn)在線升級.pdf》資料免費下載
    發(fā)表于 09-12 09:41 ?0次下載
    如何開發(fā)不帶Flash API 的<b class='flag-5'>Bootloader</b><b class='flag-5'>實現(xiàn)</b>在線<b class='flag-5'>升級</b>

    keil可以讀出單片機程序

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

    單片機燒錄程序用什么軟件

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

    單片機燒錄程序可以重新燒嗎

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

    單片機燒錄程序的線比單片機上的少還能燒錄嗎

    單片機燒錄原理 單片機燒錄是指將編寫好的程序代碼通過一定的方式傳輸?shù)?b class='flag-5'>單片機的存儲器中,使其能夠按照程序的指令運行。這個過程通常需要使用燒錄器
    的頭像 發(fā)表于 09-02 09:54 ?569次閱讀

    單片機燒錄程序的基本步驟是什么

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

    stm32單片機燒錄程序會擦除原來的程序

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

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

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

    單片機學(xué)到什么程度可以找工作?

    這個話題老生常談了,找工作需要具備一定的技術(shù)實力,但是究竟學(xué)到什么程度就可以呢?單片機作為嵌入式系統(tǒng)的核心,具有廣泛的應(yīng)用場景,因此掌握單片機編程技能確實能為您打開就業(yè)之門。然而,要想通過單片
    的頭像 發(fā)表于 03-28 08:04 ?1632次閱讀
    <b class='flag-5'>單片機</b>學(xué)到什么程度<b class='flag-5'>可以</b>找工作?

    幾種常用單片機的在線升級能力比較

    電子發(fā)燒友網(wǎng)站提供《幾種常用單片機的在線升級能力比較.pdf》資料免費下載
    發(fā)表于 03-24 09:39 ?2次下載

    做一個TC23X單片機Bootloader程序需要準(zhǔn)備哪些方面的知識?

    各位,問一下,上位用現(xiàn)成的,做一個TC23X單片機Bootloader程序需要準(zhǔn)備哪些方面的知識?需要看數(shù)據(jù)手冊的哪些章節(jié)?還有能否給一個具體的步驟,感謝。
    發(fā)表于 02-18 08:33

    單片機中斷功能及其應(yīng)用

    單片機中斷功能及其應(yīng)用? 單片機中斷是指在程序執(zhí)行過程中,根據(jù)特定的條件或事件自動暫時中斷當(dāng)前程序的執(zhí)行,轉(zhuǎn)而執(zhí)行特定的中斷服務(wù)程序。中斷是
    的頭像 發(fā)表于 01-30 14:45 ?5702次閱讀

    請問IMC101T-038是否支持bootloader下載程序?

    想請問一下,038這款MCU是否支持bootloader下載程序呢?現(xiàn)在用這款芯片作為內(nèi)置的風(fēng)機驅(qū)動板,但用戶后期想升級程序,請問一下
    發(fā)表于 01-23 07:07