|
關注+星標公眾號,不錯過精彩內容
4oncurk5byo6406081618.jpg (92.58 KB, 下載次數: 6)
下載附件
保存到相冊
4oncurk5byo6406081618.jpg
2024-9-26 07:22 上傳
作者 | Carter Liu
來源 | 瑞薩嵌入式小百科
隨著物聯網的發(fā)展,單片機產品在很多場景下都會用到OTA功能,今天就來結合RL78系列單片機給大家講講加載Bootloader做OTA實現的方法。
一、概述
RL78系列MCU有兩個boot cluster,支持多種編譯環(huán)境和多種方式的bootloader,本文以常用的CS+環(huán)境配合CC-RL編譯器,給大家介紹一種OTA的MCU端的實現方式。
二、基本原理
RL78系列MCU的內存映射,以64K flash的R5F100LE為例,如圖
5mu152iygcl6406081718.png (66.43 KB, 下載次數: 7)
下載附件
保存到相冊
5mu152iygcl6406081718.png
2024-9-26 07:22 上傳
可以看到分為2個boot Cluster:Boot cluster 0和Boot cluster 1。程序啟動時,從Boot cluster 0開始執(zhí)行。
這兩個Boot cluster在程序運行過程中可以通過調用瑞薩自編程庫(Flash Self-Programming Library)里面的boot swap函數來翻轉,即Boot cluster 0可以變成1而Boot cluster 1變成Boot cluster 0,基于此,我們可以將bootloader程序存放于boot cluster 1里面,應用程序則從Boot cluster 0執(zhí)行,當程序判斷相關條件,需要OTA時候,可以調用boot swap函數翻轉boot cluster,這樣翻轉后reset,則原來的bootloader段變成了Boot cluster 0,可以執(zhí)行OTA相關操作,將新程序的Boot cluster 0內容寫入Boot cluster 1,應用程序段寫入地址0x2000開始的flash;
OTA完成后,再調用boot swap,這時bootloader段自動翻轉到原來的Boot cluster 1區(qū)域,新程序的boot區(qū)域回到Boot cluster 0,其中斷向量表不受影響。
整個OTA過程:
vba1wjdrj2x6406081818.png (110.79 KB, 下載次數: 7)
下載附件
保存到相冊
vba1wjdrj2x6406081818.png
2024-9-26 07:22 上傳
三、實現方式
1
Bootloader程序編寫:代碼大小限制在1個boot cluster內(4k)
作用:用來接收新程序的代碼并擦除老程序、更新老程序。
Bootloader工程segment劃分:
nogr13qt4iy6406081918.png (23.33 KB, 下載次數: 7)
下載附件
保存到相冊
nogr13qt4iy6406081918.png
2024-9-26 07:22 上傳
需要注意檢查生成代碼應該在0-0xfff內,不能越界
2
Bootloader生成的hex文件轉換成.c文件(J-Link工具可用來轉換),輸出一個大數組,備用。
如下圖,保存為.c文件:
1pcagwcge0b6406082018.png (77.04 KB, 下載次數: 7)
下載附件
保存到相冊
1pcagwcge0b6406082018.png
2024-9-26 07:22 上傳
即可生成大數組:
22anh3c2drh6406082118.png (35.14 KB, 下載次數: 7)
下載附件
保存到相冊
22anh3c2drh6406082118.png
2024-9-26 07:22 上傳
3
Application應用程序段代碼編寫與集成bootloader:應用程序段的代碼編寫無需考慮中斷向量表偏移等問題,因為程序正常跑,與即將放在Boot cluster 1區(qū)的bootloader無關。但是需要將與boot swap相關的代碼放置在Boot cluster 0區(qū)域內。
App工程Segment劃分:
o1t3itspy4z6406082219.png (28.12 KB, 下載次數: 8)
下載附件
保存到相冊
o1t3itspy4z6406082219.png
2024-9-26 07:22 上傳
I. 0x1000-0x1fff不能存放其他數據,該區(qū)域為boot cluster 1,定義段為.constBOOTAREA_f,如上圖。程序代碼中,使用如下預編譯指令將bootloader放入Boot cluster 1中
#pragma section BOOTAREA__far const unsigned char bootloader[]={xx,xx};//bootloader itself#pragma section
II. 劃分一個App區(qū)域的boot區(qū),把這個區(qū)域放在0x0000 to 0xFFF. 如上圖,.BOOT_f段。程序中可以使用預編譯指令#pragma section來將相關代碼放入這個區(qū)域,例如在編寫代碼時候加入如下代碼:
#pragma section text .BOOT/* write your code here */#pragma section
III. 那么這段代碼會放入.BOOT_f區(qū)域。請注意,需要從生成的map文件去判斷這個區(qū)域不超過0xfff,即不與0x1000-0x1fff Boot cluster 1段重合。
4
Application代碼燒入MCU,則MCU內便集成了bootloader。
5
新的應用程序編寫:與第3步驟大致相同,但是不需要加入III的Boot cluster 1區(qū)域大數組。
6
有新的應用程序需要OTA更新,則先與Application程序握手成功,然后執(zhí)行第二章的OTA流程;也可在Boot cluster 0里完成握手,執(zhí)行OTA。
Note
使用fsl自編程庫和fdl data flash庫時候需要注意代碼段劃分。
------------ END ------------
ur2iclpdda26406082319.gif (71.87 KB, 下載次數: 6)
下載附件
保存到相冊
ur2iclpdda26406082319.gif
2024-9-26 07:22 上傳
●瑞薩RA8系列教程 | 初識瑞薩 RA8 系列單片機●瑞薩RA8系列教程 | 瑞薩 RA8 開發(fā)環(huán)境搭建●瑞薩RA8系列教程 | 基于 Keil 開發(fā) RA8單片機●瑞薩RA8系列教程 | 基于e2s實現RA8串口輸出配置 |
|