RT-Thread STM32 OTA使用


背景

设备在完成开发后,往往后续会有 BUG 修复和功能更新等需求,这就需要对设备固件进行升级,但此时已经无法使用调试器进行烧录,所以给设备加上 OTA 功能显得非常必要。

RT-Thread STM32 通用 Bootloader

RT-Thread 为 STM32 提供了通用的 Bootloader,通过网页简单配置即可生成相应的 Bootloader 固件,烧录即可使用。但此 Bootloader 不开源,以 BIN 文件的方式提供,但并不影响使用,Bootloader 本身只负责检测升级请求,搬运固件等功能,一般也不需要修改。

RT-Thread 通用 Bootloader 有如下特点:
- 以 bin 文件的形式提供,无需修改即可使用
- 资源占用小,ROM 最小只需要 16KB,最大 32KB
- 适用于多系列 STM32 芯片(目前支持 F1 和 F4 系列 )
- 支持各种 SPI Flash 存储固件
- 支持固件加解密功能
- 支持多种固件压缩方式
- 支持恢复出厂固件功能
- 以上功能均可自由配置

当系统需要升级固件时,Bootloader 将从 download 分区将固件搬运到 app 分区,主要功能流程如下所示:

  • Bootloader 启动时检查 download 分区和 app 分区中的固件版本。
  • 如果两个固件版本相同,则跳转到 app 分区,Bootloader 运行结束。
  • 固件版本不同则将 download 分区中的固件搬运到 app 分区。
  • 在搬运的过程中 Bootloader 可以对固件进行校验、解密、解压缩等操作。
  • 搬运完毕后,删除 download 分区中存储的固件。
  • 重启系统跳转到 app 分区中的固件运行,Bootloader 运行结束。

Bootloader 工作过程如下图所示:

当系统中的固件损坏,Bootloader 将从 factory 分区将固件搬运到 app 分区,主要功能流程如下所示:

  • Bootloader 启动时检查触发固件恢复的引脚是否为有效电平。
  • 如果有效电平持续超过 10S 则将 factory 分区中的固件搬运到 app 分区中。
  • 如果有效电平没有持续超过 10S 则继续进行 2.2 小节中介绍的启动步骤。
  • 在搬运的过程中 Bootloader 可以对固件进行校验、解密、解压缩等操作。
  • 搬运完毕后,保持 factory 分区中的固件不变。
  • 重启系统跳转到 app 分区中的固件运行,Bootloader 运行结束。

获取 Bootloader

打开Bootloader 在线获取地址: http://iot.rt-thread.com

注册并登陆账号->新建产品->进入产品管理->固件升级->生成Bootloader

硬件配置按照对应的硬件选择即可,串口引脚使用串口1的 PA9

打开stm32fXXXXXhal_msp.c查看片外 FLASH 使用的 SPI 引脚

分区表的配置根据需求,Bootloader 的大小由 RT-Thread 固定为128KB,所以 APP 起始地址为 0x8020000,我使用了剩下的所有 ROM 作为 APP 分区,因为本身程序编译出来就已经有将近 300KB 了,所以 download 分区必须使用外挂的片外 FLASH,我的片外 FLASH 的前 512KB 分给了 EasyFlash,所以起始地址为 0x00080000,大小直接给了 512KB。

加密和邮箱自行配置即可,这里暂时没有启用加密,注意启用加密后密钥必须与打包器的配置一致。

完成后可以得到一个rtboot_f4.bin文件,使用 J-flash 或者其它工具烧录到设备,可以看到正常运行。

用户应用配置

启用 ota_downloader 软件包

通过 Env 工具启用软件包,可按需要启用 Ymodem 功能,这个主要是通过串口更新固件。

配置分区表

分区表主要需要注意的是要和 Bootloader 保持一致,这里直接省去了 Bootloader 分区的部分,因为正常 APP 程序不应该涉及到此部分 FLASH。

修改链接脚本

修改固件的链接地址为 APP 起始地址

修改中断向量表

在 main.c 文件中添加如下代码,这段代码的功能是重新设定中断向量跳转地址为 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 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);

测试

然后在 main 函数中添加版本信息打印,如下图所示:

注意 FLASH Download 设置为擦除块

烧录运行后可以看到当前版本为 1.0

修改版本为 1.1 ,编译得到 bin 文件

打开 ota_downloader 软件包 tools 里的 OTA 打包器,完成打包

得到 rbl 文件,我把 rbl 文件直接上传到了我的云服务器,也可以使用 MyWebServer 这个软件在电脑上运行本地服务器。

运行命令

msh />http_ota http://www.datasheep.cn/rtthread.rbl

开始下载

下载完成后重启进入 Bootloader,开始搬运固件

升级完成进入 APP 程序

可以看到 APP 版本目前为 1.1,升级成功

  • 分享:
评论
还没有评论
    发表评论 说点什么