電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 52|回復(fù): 0
收起左側(cè)

單片機(jī)加載Bootloader做OTA實(shí)現(xiàn)的方法

[復(fù)制鏈接]

305

主題

305

帖子

2325

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
2325
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-9-21 11:45:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)注+星標(biāo)公眾號(hào),不錯(cuò)過精彩內(nèi)容

作者 | Carter Liu
來源 | 瑞薩嵌入式小百科
隨著物聯(lián)網(wǎng)的發(fā)展,單片機(jī)產(chǎn)品在很多場景下都會(huì)用到OTA功能,今天就來結(jié)合RL78系列單片機(jī)給大家講講加載Bootloader做OTA實(shí)現(xiàn)的方法。
一、概述
RL78系列MCU有兩個(gè)boot cluster,支持多種編譯環(huán)境和多種方式的bootloader,本文以常用的CS+環(huán)境配合CC-RL編譯器,給大家介紹一種OTA的MCU端的實(shí)現(xiàn)方式。

二、基本原理
RL78系列MCU的內(nèi)存映射,以64K flash的R5F100LE為例,如圖

可以看到分為2個(gè)boot Cluster:Boot cluster 0和Boot cluster 1。程序啟動(dòng)時(shí),從Boot cluster 0開始執(zhí)行。
這兩個(gè)Boot cluster在程序運(yùn)行過程中可以通過調(diào)用瑞薩自編程庫(Flash Self-Programming Library)里面的boot swap函數(shù)來翻轉(zhuǎn),即Boot cluster 0可以變成1而Boot cluster 1變成Boot cluster 0,基于此,我們可以將bootloader程序存放于boot cluster 1里面,應(yīng)用程序則從Boot cluster 0執(zhí)行,當(dāng)程序判斷相關(guān)條件,需要OTA時(shí)候,可以調(diào)用boot swap函數(shù)翻轉(zhuǎn)boot cluster,這樣翻轉(zhuǎn)后reset,則原來的bootloader段變成了Boot cluster 0,可以執(zhí)行OTA相關(guān)操作,將新程序的Boot cluster 0內(nèi)容寫入Boot cluster 1,應(yīng)用程序段寫入地址0x2000開始的flash;
OTA完成后,再調(diào)用boot swap,這時(shí)bootloader段自動(dòng)翻轉(zhuǎn)到原來的Boot cluster 1區(qū)域,新程序的boot區(qū)域回到Boot cluster 0,其中斷向量表不受影響。
整個(gè)OTA過程:


三、實(shí)現(xiàn)方式
1
Bootloader程序編寫:代碼大小限制在1個(gè)boot cluster內(nèi)(4k)
作用:用來接收新程序的代碼并擦除老程序、更新老程序。
Bootloader工程segment劃分:

需要注意檢查生成代碼應(yīng)該在0-0xfff內(nèi),不能越界

2
Bootloader生成的hex文件轉(zhuǎn)換成.c文件(J-Link工具可用來轉(zhuǎn)換),輸出一個(gè)大數(shù)組,備用。
如下圖,保存為.c文件:

即可生成大數(shù)組:


3
Application應(yīng)用程序段代碼編寫與集成bootloader:應(yīng)用程序段的代碼編寫無需考慮中斷向量表偏移等問題,因?yàn)槌绦蛘E埽c即將放在Boot cluster 1區(qū)的bootloader無關(guān)。但是需要將與boot swap相關(guān)的代碼放置在Boot cluster 0區(qū)域內(nèi)。
App工程Segment劃分:

I. 0x1000-0x1fff不能存放其他數(shù)據(jù),該區(qū)域?yàn)閎oot cluster 1,定義段為.constBOOTAREA_f,如上圖。程序代碼中,使用如下預(yù)編譯指令將bootloader放入Boot cluster 1中
  • #pragma section BOOTAREA__far const unsigned char bootloader[]={xx,xx};//bootloader itself#pragma section
    II. 劃分一個(gè)App區(qū)域的boot區(qū),把這個(gè)區(qū)域放在0x0000 to 0xFFF. 如上圖,.BOOT_f段。程序中可以使用預(yù)編譯指令#pragma section來將相關(guān)代碼放入這個(gè)區(qū)域,例如在編寫代碼時(shí)候加入如下代碼:
  • #pragma section text .BOOT/* write your code here */#pragma section
    III. 那么這段代碼會(huì)放入.BOOT_f區(qū)域。請(qǐng)注意,需要從生成的map文件去判斷這個(gè)區(qū)域不超過0xfff,即不與0x1000-0x1fff Boot cluster 1段重合。

    4
    Application代碼燒入MCU,則MCU內(nèi)便集成了bootloader。
    5
    新的應(yīng)用程序編寫:與第3步驟大致相同,但是不需要加入III的Boot cluster 1區(qū)域大數(shù)組。
    6
    有新的應(yīng)用程序需要OTA更新,則先與Application程序握手成功,然后執(zhí)行第二章的OTA流程;也可在Boot cluster 0里完成握手,執(zhí)行OTA。

    Note
    使用fsl自編程庫和fdl data flash庫時(shí)候需要注意代碼段劃分。

    ------------ END ------------

    ●瑞薩RA8系列教程 | 初識(shí)瑞薩 RA8 系列單片機(jī)●瑞薩RA8系列教程 | 瑞薩 RA8 開發(fā)環(huán)境搭建●瑞薩RA8系列教程 | 基于 Keil 開發(fā) RA8單片機(jī)瑞薩RA8系列教程 | 基于e2s實(shí)現(xiàn)RA8串口輸出配置
  • 發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則

    關(guān)閉

    站長推薦上一條 /1 下一條


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表