RT-thread应用讲解——OTA

RT-thread应用讲解——OTA

前言

OTA(空中下载技术)是通过移动通信的空中接口实现对移动终端设备进行远程管理和升级的技术。我们调试硬件设备的时候通常是通过数据线进行固件的烧录,如果是在办公室的环境下这种方式是很方便的,但是如果设备距离较远,有线的方式就有很大的局限性。因此,远程升级技术就显得很重要了。
RT-thread有一套OTA的方案可以参考,今天主要就介绍这套方案的使用以及优缺点。

RT-thread官方介绍:
Bootloader:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/application-note/system/rtboot/an0028-rtboot
OTA Downloader:http://packages.rt-thread.org/detail.html?package=ota_downloader

特别说明:本教程的配置如下:

配置 说明
MCU STM32F429VET6
FLASH W25Q32
RT-thread源码版本 v4.0.3

一、OTA升级原理介绍

OTA升级的固件必须要有一个存储设备来存放,如果固件比较小,可以存放在MCU内部FLASH(未使用的区域),如果固件较大则需要挂载一个外置的FLASH。
要进行OTA升级,我们需要使用Bootloader,它的主要功能是作为引导程序,更新app分区中的固件或者跳转到app应用程序。

Bootloader作为一个引导程序,我们自己编写的代码作为一个应用程序,把两个固件都烧录到MCU里面(固件存放的位置不同)之后,MCU启动时会先运行Bootloader,检查片外flash是否有可升级的固件,如果有则升级固件,如果没有则跳转到应用程序运行的起始地址,然后正常的运行我们的应用程序。
具体流程如下:
1.Bootloader启动时检查download分区和app分区中的固件版本。
2.如果两个固件版本相同,则跳转到app分区,Bootloader运行结束。
3.固件版本不同则将download分区中的固件搬运到app分区。
4.在搬运的过程中Bootloader可以对固件进行校验、解密、解压缩等操作。
5.搬运完毕后,删除download分区中存储的固件。
6.重启系统跳转到app分区中的固件运行,Bootloader运行结束。

1

二、生成Bootloader

我这边主要介绍的是RT-Thread开发团队提供的通用Bootloader。
Bootloader的功能前面也有介绍了,它作为一个引导程序,更新app分区中的固件或者跳转到app应用程序。

Bootloader可以通过网页端在线生成的方式来获取。开发者根据自己使用的芯片,填写相关参数,然后点击生成按钮,即可在线生成Bootloader。
Bootloader在线获取地址: http://iot.rt-thread.com

关于Bootloader的使用在RT-Thread官网有非常详细的教程,我觉得就没有更详细的教程了,这里就没必要再抄一遍了,你们可以直接看官网的教程,我只说一下这里面的一些重点。
Bootloader:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/application-note/system/rtboot/an0028-rtboot

提示:
1:串口输出引脚、FLASH引脚和恢复出厂引脚的引脚号要根据自己的情况填写,串口输出建议使用,通过输出的log可以清楚看到设备运行的情况,也便于查找问题。
2:FLASH引脚一定要对好,不然是不能正常加载片外flash的。
3:恢复出厂要在flash单独分一个区域用来存放固件,根据自己是情况选择要不要使用按键恢复。
4:分区表配置要和你实际的分区保持一致。
5:Bootloader固定为128k,因此MCU片内FLASH的0x08000000-0x0801FFFF是用来存放bootloader的,app要从0x08020000开始。
下图仅供参考,不是实际使用的配置。

请添加图片描述
我实际使用的配置如下:

硬件配置:

说明 配置
芯片 stm32f4
ROM 512k
RAM 192k
串口输出 PA9
SPI Flash CS:PA4, CLK:PA5, MISO:PA6, MOSI:PA7
按键引脚 PE7 低电平有效

分区表配置:

分区名 所处设备 偏移地址 大小
app 片内Flash 0x20000 384k
download 片外Flash 0x00000 256k
factory 片外Flash 0x40000 384k

加密压缩:

说明 配置
固件加密 不使用
固件压缩 gzip

logo和邮箱:

说明 配置
logo
邮箱 自己使用的邮箱

配置好参数之后直接生成bootloader即可。

三、制作app固件

1、挂载FLASH

首先我们要把这个片外flash挂载上。这个我之前的教程已经介绍过了,不知道的同学可以先看下我之前的博客。
RT-thread应用讲解——norflash

2、配置分区

我们在实际的应用中片外flash可能会同时使用多个功能,比如OTA,easyflash、文件系统等,这个时候为了避免数据冲突,我们就要先把flash分成几个区域。

关于FLASH分区的内容,请参考我另外一篇博客。
RT-thread应用讲解——FLASH分区

我这里的分区具体如下:

分区名 FLASH设备名 偏移地址 内存大小 说明
“bootload” “onchip_flash_16k” 0 128 * 1024 字节 bootload引导程序
“app” “onchip_flash_128k” 0 384 * 1024 字节 应用程序
“download” “norflash0” 0 256 * 1024 字节 OTA升级固件
“factory” “norflash0” 256 * 1024 384 * 1024 字节 恢复出厂固件
“cmb_log” “norflash0” 640 * 1024 128 * 1024 字节 运行日志
“filesystem” “norflash0” 896 * 1024 15488 * 1024 字节 文件系统

提示:实际上本教程的片外flash只使用了download分区,你们可以根据自己的情况分区。

3、下载ota_downloader软件包

1)打开ota_downloader软件包。

在这里插入图片描述
2)根据自己的情况选择升级的方式。
提示:我这里没有连接网络,所以只选择串口升级。想通过网络升级的话要先把网络模块和webclient调试好,能正常使用http的话就可以打开这个配置使用网络升级。
在这里插入图片描述

3)保存配置,更新软件并重新生成新的工程。
这个应该不用我多说了吧,会用env的同学应该都清楚,不清楚的可以翻下我之前的博客,很多教程都有讲到。

4、修改app固件配置

1)修改固件的链接地址
stm32f429在运行的时候是先从0x08000000地址开始的,前128k我们是用来存放bootloader的,app是从0x08020000开始运行的,所以我们要把固件的链接地址修改为0x08020000。
提示:地址根据自己的实际情况配置。

在这里插入图片描述
在这里插入图片描述

2)修改中断向量表的跳转基地址
在工程里面添加下面这段代码,作用是重新设定中断向量跳转地址为 app 分区的地址。
示例代码:

/**
 * Function    ota_app_vtor_reconfig
 * Description Set Vector Table base location to the start addr of app(RT_APP_PART_ADDR).
*/
static int ota_app_vtor_reconfig(void)
{
    
    
    #define RT_APP_PART_ADDR 0x8020000   // app运行的起始地址,根据自己的实际情况定义
    #define NVIC_VTOR_MASK   0x3FFFFF80
    /* Set the Vector Table base location by user application firmware definition */
    SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK;

    return 0;
}
INIT_BOARD_EXPORT(ota_app_vtor_reconfig);

3)添加版本信息
为了方便查看设备运行的版本,最好在启动的时候打印设备的版本号。
我这里直接在main函数里面写了。
示例如下:
在这里插入图片描述

四、烧录固件

固件烧录分成两部分,bootloader和app。烧录可以通过ST-Link也可以通过J-Link,具体的烧录方法这里就不说了,只需要注意烧录的地址即可。

参考示例:
bootloader固件烧录地址为0x08000000。
app固件烧录地址为0x08020000。
提示:app可以直接通过keil uvision烧录。

在这里插入图片描述

两个固件都烧录完成之后硬件重启即可。

五、运行测试

正常运行的日志如下:
先运行bootloader再跳转到app应用。

在这里插入图片描述

六、升级测试

1、打包要升级的固件

我们先把要升级的程序调试好,确保程序没问题,然后通过打包工具打包。

参考示例:
我这里先改一个v1.1.0版本的固件,编译。

在这里插入图片描述
然后在工程目录下ota的软件包里面找到打包工具并运行。
注意:工具所在的路径不能有中文。
在这里插入图片描述

打开打包工具,选择自己要更新的固件,根据自己的情况修改配置,打包。
打包后的升级固件为rbl格式。

在这里插入图片描述

2、升级测试

使用Ymodem协议升级固件时,推荐使用Xshell终端。
在msh命令行中输入ymodem_ota命令后,点击鼠标右键,然后在菜单栏找到用YMODEM发送选项发送文件,如下图所示:
1.选择Ymodem方式发送升级固件。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

七、注意事项

1:分区要合理。
分区大小和app固件大小有直接关系,比如我用的这款芯片ROM是512k,前128k用来存放bootloader,那就只剩384k了,所以我后面编写的app固件大小(bin文件)不能超过384k。如果你用的不是片外flash而是MCU的片内flash的话,那你的分区就更加要注意了,因为除了app区还有download分区,要保证两个固件都不超过分区的大小。

2:升级固件的bin文件大小要比app分区小,rbl文件要比download分区小。
bin文件前面已经解释过了,但是还有一个地方要注意,就是如果你的rbl是进过压缩的,那实际大小会比bin文件小,存放的时候只要比download分区小即可,但是升级的时候rbl文件是会解压的,解压后的的大小等于这个固件bin文件的大小,因此,你的app分区一定要大于解压后的文件大小。

3:升级固件的版本不能相同。
如果设备已经进行过一次升级,那设备就会有版本记录(版本号是打包固件时的版本,和你在app代码里面定义的版本号不是同一个),那下一次升级的固件版本号(打包时的版本号)必须和之前升级的那个固件版本不同,否则会直接跳过升级流程,哪怕这个app固件实际上的代码不一致。(升级与否只看打包时的版本号)

八、进阶学习

通过串口升级的这种方式在实际的使用中还是有很大的局限性,为了增加升级的距离,可以对升级的流程进行优化。
比如:串口升级的方式可以使用RS485,485的通讯距离很远,在没有网络的情况下可以考虑这种方式。另外,上面的示例是用命令行启动之后才会进入升级,实际使用中可以通过其他方式实现,比如按键触发。

除了串口之外可以考虑通过网络或者U盘来进行升级,因为这两种方式涉及到的东西还是比较多的,我就不详细的把每个步骤都写出来了,大概讲一下思路吧。
其实不管用哪种方式,最后OTA升级那部分都是一样的,我们只要把升级的固件存储到flash的download分区然后重启就可以了,区别只在于怎么把固件存进去。

理清思路之后其实就很简单了,U盘升级和串口升级基本一样,串口升级是通过数据线从PC端传输固件,而U盘升级则是从U盘传输固件,只要我们把U盘挂载到虚拟文件系统,然后把U盘的升级固件拷贝到flash即可,后面的升级步骤都是一样的。
U盘升级我之前做了一个例程,感兴趣的同学可以下载来玩一下。
usb固件升级代码:https://download.csdn.net/download/ShenZhen_zixian/12880749

同样的思路,通过网络升级也是一样的,首先我们需要一个网络模块,连接上网络之后通过http从网页上下载升级固件到flash里面,然后再重启升级即可。因为我这边实际的应用是公司量产的设备,用的也是公司的服务器和平台,所以代码就不太方便拿出来分享了,我只讲一下思路,感兴趣的同学可以自己尝试。
大致的流程如下:
1:设备连接网络
2:通过http定时发送请求(上传设备当前的设备号和版本号到平台)
3:平台那边根据设备上传的设备号和版本号判断是否要升级,如果要升级则下发固件的下载地址
4:设备下载固件并升级

九、结束语

OTA是非常使用的一门技术,特别是通过网络升级,对设备的升级迭代来说是非常方便的,RT-thread的这套方案总体上还是很好用的,也不复杂,缺点就是bootloader占用的内存比较大,希望后面可以优化一下。

好了,关于OTA的介绍就到这里,如果还有什么问题,欢迎在评论区留言。如果这篇文章能够帮到你,就给我点个赞吧,如果想了解更多RT-thread和单片机的内容,可以关注一下博主,后续我还会继续分享更多的经验给大家。

教程相关源码:
https://pan.baidu.com/s/1N2D8dM31deKIqNqaIQfPiA
提取码:7nsx

RT-thread相关教程汇总:https://blog.csdn.net/ShenZhen_zixian/article/details/120563891

猜你喜欢

转载自blog.csdn.net/ShenZhen_zixian/article/details/120991604