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

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

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

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

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

這次出差是為了升級(jí)程序解決Bug,用戶已經(jīng)將產(chǎn)品封裝起來,無法開蓋,只能使用CAN總線來更新程序,用Bootloader實(shí)現(xiàn)。其實(shí)就是通過上位機(jī)把.bin/hex文件以CAN通訊的方式發(fā)送給單片機(jī)并存儲(chǔ)在規(guī)定的Flash中。 這個(gè)過程與手機(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文件的話需要通過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)地 址是固定的,會(huì) 跳轉(zhuǎn)到0x8000對(duì)應(yīng)中斷的偏移地址,所以會(huì)把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,所以,向量表的的修改方法為: 除了第一個(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空間的劃分來修改,前面將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

編寫交互代碼

以上設(shè)置好之后,就可以編寫交互代碼了,所以交互代碼其實(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來實(shí)現(xiàn)產(chǎn)品固件的升級(jí)了。這就是Bootloader的關(guān)鍵內(nèi)容,本文你學(xué)會(huì)了嗎?留言討論一下吧。

-END-

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

作者 | 劉小舒

責(zé)任編輯:haq

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

    關(guān)注

    6023

    文章

    44376

    瀏覽量

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

    關(guān)注

    57

    文章

    2663

    瀏覽量

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

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67767
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    stc51單片機(jī)程序存儲(chǔ)區(qū)不夠用,可否在程序存儲(chǔ)區(qū)寫一個(gè)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 ?951次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>BootLoader</b>與APP如何合并?

    基于51單片機(jī)PWM波實(shí)現(xiàn)拖尾燈的程序

    電子發(fā)燒友網(wǎng)站提供《基于51單片機(jī)PWM波實(shí)現(xiàn)拖尾燈的程序.doc》資料免費(fèi)下載
    發(fā)表于 10-24 10:00 ?1次下載
    基于51<b class='flag-5'>單片機(jī)</b>PWM波<b class='flag-5'>實(shí)現(xiàn)</b>拖尾燈的<b class='flag-5'>程序</b>

    單片機(jī)復(fù)位的條件 單片機(jī)可以復(fù)位多少次 程序會(huì)導(dǎo)致單片機(jī)復(fù)位嗎

    單片機(jī)復(fù)位的條件 單片機(jī)可以復(fù)位多少次 程序會(huì)導(dǎo)致單片機(jī)復(fù)位嗎? 單片機(jī)復(fù)位的條件: 1. 上電
    的頭像 發(fā)表于 10-17 16:44 ?2865次閱讀