随着物联网的发展,单片机产品在很多场景下都会用到OTA功能,今天就来结合RL78系列单片机给大家讲讲加载Bootloader做OTA实现的方法。
一、概述
RL78系列MCU有两个boot cluster,支持多种编译环境和多种方式的bootloader,本文以常用的CS+环境配合CC-RL编译器,给大家介绍一种OTA的MCU端的实现方式。
二、基本原理
RL78系列MCU的内存映射,以64K flash的R5F100LE为例,如图
可以看到分为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过程:
三、实现方式
Bootloader程序编写:代码大小限制在1个boot cluster内(4k)
作用:用来接收新程序的代码并擦除老程序、更新老程序。
Bootloader工程segment划分:
需要注意检查生成代码应该在0-0xfff内,不能越界
Bootloader生成的hex文件转换成.c文件(J-Link工具可用来转换),输出一个大数组,备用。
如下图,保存为.c文件:
即可生成大数组:
Application应用程序段代码编写与集成bootloader:应用程序段的代码编写无需考虑中断向量表偏移等问题,因为程序正常跑,与即将放在Boot cluster 1区的bootloader无关。但是需要将与boot swap相关的代码放置在Boot cluster 0区域内。
App工程Segment划分:
I. 0x1000-0x1fff不能存放其他数据,该区域为boot cluster 1,定义段为.constBOOTAREA_f,如上图。程序代码中,使用如下预编译指令将bootloader放入Boot cluster 1中
#pragma section BOOTAREA
II. 划分一个App区域的boot区,把这个区域放在0x0000 to 0xFFF. 如上图,.BOOT_f段。程序中可以使用预编译指令#pragma section来将相关代码放入这个区域,例如在编写代码时候加入如下代码:
#pragma section text .BOOT
III. 那么这段代码会放入.BOOT_f区域。请注意,需要从生成的map文件去判断这个区域不超过0xfff,即不与0x1000-0x1fff Boot cluster 1段重合。
Application代码烧入MCU,则MCU内便集成了bootloader。
新的应用程序编写:与第3步骤大致相同,但是不需要加入III的Boot cluster 1区域大数组。
有新的应用程序需要OTA更新,则先与Application程序握手成功,然后执行第二章的OTA流程;也可在Boot cluster 0里完成握手,执行OTA。
Note
使用fsl自编程库和fdl data flash库时候需要注意代码段划分。
END
作者:Carter Liu
来源:瑞萨嵌入式小百科
推荐阅读
欢迎大家点赞留言,更多Arm技术文章动态请关注极术社区嵌入式客栈专栏欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。