项目上需要做设备的远程升级更新程序,从而避免每次更新程序时都需要去现场烧录的麻烦。从而学习探索了RT提供的OTA功能。

RT-Thread 开发团队提供了通用的 Bootloader。开发者通过该 Bootloader 即可直接使用 RT-Thread OTA 功能,轻松实现对设备端固件的管理、升级与维护。"  引用于官方资料文档。

主要参考资料:

1.官方文档资料 https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/

2.论坛网友制作中遇到的问题以及解决办法 https://www.rt-thread.org/qa/forum.php?mod=viewthread&tid=12241&highlight=boot

移植使用平台和工具:

STM32F103ZET6   512K FLASH    64K RAM  (建议在FLASH小于256K 不外置SPI FLASH的情况下就别使用OTA了)

J-Flash V4.90  用于生成的烧录OTA固件

J-Link STM32 Unlock  有时自己误操作可能会导致芯片锁死,用于解锁芯片

Xshell 配置为串口,便于查看输出情况。其他的串口调试助手也可以,但是推荐Xshell, 因为RT的ulog输出支持各种格式,Xshell      显示更加直观。

  • 获取Bootloader

这一点的描述在官方文档的描述已经非常详细,具体请认真阅读参看官网文档。只是需要注意自己在配置参数的部分,根据自己所需要进行配置相关参数。

以下是我keil5工程编译出来的一些情况:

Program Size: Code=105170 RO-data=13866 RW-data=1324 ZI-data=6316  

由此可知 下载到FLASH中的大小 = Code + RO Data + RW Data = 117 K   。以下是我配置图。

我并没有使用外部FLASH,全部使用芯片内部的FLASH。也没有配置相依的固件恢复分区。而是只配置了app分区和download分区。其中app分区的偏移地址为0x10000,Bootloader实际是从0x8000000开始存储的,设置0x10000偏移地址实际是给Bootloader的固件预留了64K的空间(实际32K足以),所以app分区是从0x8010000起始,往后占用192K大小。同理download分区也一样,由于前面已经占用了256K空间(预留bootloader 64k + 192k app分区),所以偏移地址设置为0x40000。特别注意分区的设置合理性,很多bootloader不能使用大部分都是分区的原因。

关于官网上关于分区的设置,我开始疑惑了好久。最后我才发现自己被自己惯性思维误导了。

一直以为最开始设置的app就是第一个分区,其实不是关键还是看偏移地址。实际上,上面图片的第一个分区是download分区。

这部分剩下的跟着官网资料操作应该没什么问题了。

  • 烧录 Bootloader

我使用的是J-FLASH,官网上还有使用 ST-LINK Utility 工具烧录的方法。由于官网上使用的J-FLASH版本有点高,自己是4.9版本的。所以小部分操作也不同,所以还是记录一下。就怕万一哪天我也忘了,直接上图。参考着官网资料上看吧。

这个时候 需要按快捷键F3 先进行对擦除芯片。再进行F5烧录程序即可。

如果中途报错或者失败。使用J-Link STM32 Unlock进行解锁后再进行重复操作。

烧录成功后连接上串口1 (PA9),使用xshell进行查看。如下就是成功烧录了bootloader。

  • 制作 app 固件

按官网资料的操作,在ENV工具中开启相应的选项。

接下来是 配置 FAL 分区(这是重点),我之前在这里卡了挺久的。

这部分 和官网资料有些少部分操作不同,因为官网上是F4的芯片,和F1在FLASH 地址上有点点区别,F4芯片也是从0x8000000地址开始,但是前128K为保留。前128K不能用于分区配置,那我们只有用来装bootloader了。

这是时候的工程编译会报错,缺少相应的fal_cfg.h文件,这个文件需要自己手动添加进去。在自己的BSP目录下\packages\fal-latest\samples\porting中找到fal_cfg.h文件。我是按以下方法进行添加的。

在board文件夹中新建了一个ports文件,将\packages\fal-latest\samples\porting下面的全部拷贝过来。然后再添加路劲到SConscript脚本文件中去。添加内容如下:

再次编译依然会报错,这个时候我们需要修改fal_cfg.h的内容。

具体修改为如下:

第2项代表了程序启动运行地址,根据前面的设置 app 地址为0x08010000 (重点)

第4项中是我们在第一节网页上设置的分区表,按照对应的设置即可。

"bl" 为保留分区 从地址大小0开始(实际为0x8000000),保留分区大小为64K,用于存放bootloader。

"app" 分区 和 "download"分区依次论推。

  • 修改 app 固件配置

由于 app 分区的起始地址为 0x08010000,app 固件如果想运行在该地址,就需要修改链接脚本和中断向量的跳转地址。

1.修改链接脚本地址

2.修改中断向量的跳转地址

这部分和官网资料一致,借鉴下官网图片。修改中断向量表的跳转基地址为 0x8010000。

首先在 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 函数中添加版本信息打印,如下图所示:

之前忘记了添加 fal的初始化,如上添加进去。我自己的配置如下

接下来编译下载程序。

固件就会被烧录到 app 分区。Bootloader 启动后将跳转到 app 分区运行,如下图所示:看到了打印的版本号是1.0.0

剩下的部分采用xshell进行发送固件升级,就不在累述了,跟着官网文档操作一步一步来就可以成功。实现界面如下,看到已经成功升级为AIS 2.0.0版本了。另外官网还提供了中HTTP/HTTPS的升级方法,我也准备使用这种,还在探索中。。。不过原理和上述的方法大致相同。

不过,bootloader RT并没有开源。只能用,看不到源码。

但是,好消息是 有网友大神Spunky 制作了个,还弄成了软件包,留下个论坛链接地址。此等大佬,只有膜拜。。。

https://www.rt-thread.org/qa/thread-422812-1-1.html

2020.2.22 附加

采用HTTP的形式+Air720H 4G模块 进行远程升级的方法可以参考这篇博文。https://blog.csdn.net/ylzmm/article/details/104315914

RT_thread STM32通用Bootloader 做OTA升级相关推荐

  1. STM32通用Bootloader——FOTA

    1.固件升级简述 固件升级,通常称为 OTA(Over the Air)升级或者 FOTA(Firmware Over-The-Air)升级,即固件通过空中下载进行升级的技术. 1.1 bootloa ...

  2. stm32cubemx中文_用 STM32 通用定时器做微秒延时函数(STM32CubeMX版本)

    概述 ​ 在使用 DHT11 的时候,时序通信需要微秒来操作,STM32CubeMX 自带一个系统时钟,但是实现的是毫秒级别的.因此就自己用通用计时器实现一个. 文章目录 环境: 开发板:STM32F ...

  3. stm32 通用bootloader_STM32通用Bootloader

    STM32 通用 Bootloader 简介 为了能让开发者快速掌握 OTA 升级这把利器,RT-Thread 开发团队提供了通用的 Bootloader.开发者通过该 Bootloader 即可直接 ...

  4. STM32构建BootLoader实现多系统OTA

    STM32构建BootLoader实现多系统OTA 目录 STM32构建BootLoader实现多系统OTA 引言 一.基本概念 二.基础参考 三.认识STM32内置存储器扇区分布 四.构建BootL ...

  5. AT32F437制作Bootloader然后实现Http OTA升级

    首先创建一个AT32F437的工程,然后发现调试工程配置这里的型号和创建工程选的型号不一致,手动更改一下,使用PW Link下载程序的话还要配置一下pyocd.exe的路径. 打开drv_clk.c文 ...

  6. stm32通用定时器用做外部脉冲计数器的例程

    最近几天要用到stm32对外部输入脉冲进行计数,很自然想到定时器,可是手上资料没有讲解stm32定时器如何用作外部计数器的,在网上找例程,也没找到几个正确的,自己硬着头皮仔细研究参考手册,终于知道如何 ...

  7. STM32通用FLASH管理软件包——SFUD/FAL

    本次介绍的两个软件包SFUD/FAL都与FLASH有关,并且都可以独立使用或者结合在一起使用,两个软件包都对操作系统无依赖,可以使用裸机移植,也很方便移植到各种系统. 这两个软件包的作者都是armin ...

  8. 58 ESP32 OTA升级(双OTA分区无factory APP)

    1 引言 产品功能实现后,就要对产品的维护进行考虑.产品出来后,卖了N台出去,如果突然发现自己一行代码写错了,怎么办,肯定不能去现场吧N台设备,免费出差旅游也累啊,所以一般需要有远程升级设备的功能,此 ...

  9. 【STM32】BootLoader介绍、编写 以及 OTA常见方案分析(差分升级 全量升级 AB面升级)

    参考博客:STM32 BootLoader升级固件_cyang's blog-CSDN博客 STM32固件升级详解(BootLoader)_EmbeddedOsprey-CSDN博客_stm32升级b ...

最新文章

  1. Spring Boot(二)应用实例
  2. RocketMQ的安装与配置
  3. 音视频技术开发周刊 72期
  4. image vb6 图片自适应_请问如何实现图片在窗体上的大小自适应?
  5. libevent源码深度剖析十
  6. 一个例子带你搞懂python作用域中的global、nonlocal和local
  7. ssl1217-删边【图论,dfs】
  8. LeetCode 132. 分割回文串 II(DP)
  9. linux 时间同步的2种方法(转)
  10. java collection 常用类_分析Collection常用的实现类
  11. android drawable-hdpi 分辨率,android – 设置可用于不同分辨率的drawable文件夹
  12. 诗词收集——用于人文素养扫盲
  13. matlab 12脉波变压器,12脉波整流电路MATLAB-Simulink仿真及谐波分析
  14. Office小知识(一)——word插入各种方向和条件个数的大括号{ }
  15. BP神经网络求解异或算法
  16. 楼氏电子推出Raspberry Pi 开发工具包,为新物联网应用和行业语音整合提供支持
  17. 从制造中来到制造中去 华为要做更懂制造的“懂行人”
  18. 荟研新材料 毕克BYK024 毕克BYK028 有机硅消泡剂 丙烯酸酯 聚氨酯 水性印刷油墨 罩光清漆 水性UV体系消泡剂
  19. NoSuchMethodError 错误——包冲突解决办法
  20. Excel自定义排序(可按某一列排序)

热门文章

  1. pageCache和bufferCache
  2. 浅析缓冲区溢出漏洞的利用与Shellcode编写
  3. Nvidia Tesla A100 驱动安装方法
  4. 数学题库python_GitHub Python项目推荐|一个拍照做题程序|数学计算题识题|opencv...
  5. 一文读懂css的相对定位【relative position】以及相对定位为什么要设置偏移量?
  6. Python 读取HTML表格 pd.read_html()
  7. 亚马逊站外引流如何做?解析厨电大卖的高曝光秘诀
  8. LINUX设备驱动之设备模型一kobject
  9. 整理chinaUnix上【你职业生涯中最难忘的误操作】
  10. 段誉和男人们的普遍困境