关注+星标公众号,不错过精彩内容
4oncurk5byo6406081618.jpg
作者 | Carter Liu
来源 | 瑞萨嵌入式小百科
随着物联网的发展,单片机产品在很多场景下都会用到OTA功能,今天就来结合RL78系列单片机给大家讲讲加载Bootloader做OTA实现的方法。
一、概述
RL78系列MCU有两个boot cluster,支持多种编译环境和多种方式的bootloader,本文以常用的CS+环境配合CC-RL编译器,给大家介绍一种OTA的MCU端的实现方式。
二、基本原理
RL78系列MCU的内存映射,以64K flash的R5F100LE为例,如图
5mu152iygcl6406081718.png
可以看到分为2个boot Cluster:Boot cluster 0和Boot cluster 1。程序启动时,从Boot cluster 0开始执行。
这两个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执行,当程序判断相关条件,需要OTA时候,可以调用boot swap函数翻转boot cluster,这样翻转后reset,则原来的bootloader段变成了Boot cluster 0,可以执行OTA相关操作,将新程序的Boot cluster 0内容写入Boot cluster 1,应用程序段写入地址0x2000开始的flash;
OTA完成后,再调用boot swap,这时bootloader段自动翻转到原来的Boot cluster 1区域,新程序的boot区域回到Boot cluster 0,其中断向量表不受影响。
整个OTA过程:
vba1wjdrj2x6406081818.png
三、实现方式
1
Bootloader程序编写:代码大小限制在1个boot cluster内(4k)
作用:用来接收新程序的代码并擦除老程序、更新老程序。
Bootloader工程segment划分:
nogr13qt4iy6406081918.png
需要注意检查生成代码应该在0-0xfff内,不能越界
2
Bootloader生成的hex文件转换成.c文件(J-Link工具可用来转换),输出一个大数组,备用。
如下图,保存为.c文件:
1pcagwcge0b6406082018.png
即可生成大数组:
22anh3c2drh6406082118.png
3
Application应用程序段代码编写与集成bootloader:应用程序段的代码编写无需考虑中断向量表偏移等问题,因为程序正常跑,与即将放在Boot cluster 1区的bootloader无关。但是需要将与boot swap相关的代码放置在Boot cluster 0区域内。
App工程Segment划分:
o1t3itspy4z6406082219.png
I. 0x1000-0x1fff不能存放其他数据,该区域为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区域的boot区,把这个区域放在0x0000 to 0xFFF. 如上图,.BOOT_f段。程序中可以使用预编译指令#pragma section来将相关代码放入这个区域,例如在编写代码时候加入如下代码:
#pragma section text .BOOT/* write your code here */#pragma section
III. 那么这段代码会放入.BOOT_f区域。请注意,需要从生成的map文件去判断这个区域不超过0xfff,即不与0x1000-0x1fff Boot cluster 1段重合。
4
Application代码烧入MCU,则MCU内便集成了bootloader。
5
新的应用程序编写:与第3步骤大致相同,但是不需要加入III的Boot cluster 1区域大数组。
6
有新的应用程序需要OTA更新,则先与Application程序握手成功,然后执行第二章的OTA流程;也可在Boot cluster 0里完成握手,执行OTA。
Note
使用fsl自编程库和fdl data flash库时候需要注意代码段划分。
------------ END ------------
ur2iclpdda26406082319.gif
●瑞萨RA8系列教程 | 初识瑞萨 RA8 系列单片机●瑞萨RA8系列教程 | 瑞萨 RA8 开发环境搭建●瑞萨RA8系列教程 | 基于 Keil 开发 RA8单片机●瑞萨RA8系列教程 | 基于e2s实现RA8串口输出配置 |