提前声明:本项目是基于芯片之家的[开源]从0到1教你制作网络数字变化时钟的项目代码进行修改,增加Bootloader和OTA升级的。获取源代码可加微信:RT-Thread2006

一、前期准备

硬件准备:

1. 一块LED电子数字时钟屏

2. 一根microusb线(安卓线)

3. 一个下载器(ST-Link或者Jlink 等)

软件准备:

4. MDK5软件

5. RT-Thread的ENV工具

6. LED电子时钟屏源项目工程代码

7. RT-Thread OTA打包工具

8. WebServer工具

 

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_固件

等待airkiss配网

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_分区表_02

airkiss配网成功

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_项目代码_03

正确显示日期和时间

二、主要说明

在本次操作中的LED电子数字时钟屏采用的主控芯片是STM32F401RCT6,FLASH为256K,焊接了一个外置SPI接口的 flash芯片;在添加bootloader功能前需要设计分区,对于分区操作有一定的要求说明,暂且不细说,参考RT-Thread官网的说明如下,可以对Boot有一定的了解。

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_串口_04img如何让开源LED电子时钟屏跑起Bootloader和OTA升级_分区表_05img

功能说明

Bootloader 的主要功能是更新 app 分区中的固件。

分区表介绍

通用 Bootloader 中的分区表包含如下三个分区:

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_命令行_06

通用 Bootloader 中的分区表包含如下三个分区:

升级固件功能

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

  1. Bootloader 启动时检查 download 分区和 app 分区中的固件版本。

  2. 如果两个固件版本相同,则跳转到 app 分区,Bootloader 运行结束。

  3. 固件版本不同则将 download 分区中的固件搬运到 app 分区。

  4. 在搬运的过程中 Bootloader 可以对固件进行校验、解密、解压缩等操作。

  5. 搬运完毕后,删除 download 分区中存储的固件。

  6. 重启系统跳转到 app 分区中的固件运行,Bootloader 运行结束。

Bootloader 工作过程如下图所示:

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_命令行_07

恢复固件功能

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

  1. Bootloader 启动时检查触发固件恢复的引脚是否为有效电平。

  2. 如果有效电平持续超过 10S 则将 factory 分区中的固件搬运到 app 分区中。

  3. 如果有效电平没有持续超过 10S 则继续进行 2.2 小节中介绍的启动步骤。

  4. 在搬运的过程中 Bootloader 可以对固件进行校验、解密、解压缩等操作。

  5. 搬运完毕后,保持 factory 分区中的固件不变。

  6. 重启系统跳转到 app 分区中的固件运行,Bootloader 运行结束。

以上资料来源:RT-Thread官方文档,详细可以参考:https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/

三、操作流程

分区说明:基于使用的STM32F401RCT6的内部Flash为256K,开源LED电子时钟屏的源程序的固件大小为124k,在设计分区的时候一般APP和download区是采用1:1的方式,还有bootloader分区一般设计为16K到32K,显然这样256K的内部FLASH不能满足要求,所以需要使用外部FLASH,设计分区表为:内部flash的前32K为bootloader分区,剩余的内部FLASH (256-32 = 224)224K为APP分区,download分区设在外部flash区。

在设计好分区表后,需要在原项目代码中添加spi的驱动,烧录boot,修改分区表,修改连接地址,添加 ota_downloader 的功能组件。

1.在源程序项目代码中配置添加spi——flash驱动。

(1)在项目代码的目录下,通过ENV工具进入命令行,在命令行中输入menuconfig,如下图1所示:

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_项目代码_08

图1 menuconfig配置界面

进入RT-Thread Components目录下的Device Drivers下选中Using generic GPIO device drivers和Using SPI Bus/Device device drivers 和Using Serial Flash Universal Driver 和Using auto probe flash JEDEC SFDP parameter 和Using defined support flash chip information tatble,如下图2所示:

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_命令行_09img

 

添加配置后,返回到主界面,修改CS的引脚号为20.

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_命令行_10

图2 配置SPI驱动和GPIO驱动

保存并退出,在env命令行下输入scons --target=mdk5 重新编译生成工程。

再用mdk5打开编译的项目工程,编译烧录到板子上,在启动信息可以判断外置flash已经添加驱动了,如下图3所示:

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_命令行_11

图3 启动打印spi flash芯片信息

(2) 添加ota_downloader和FAL_Packages软件包还有SFUD的配置。

在env工具的命令行中,输入menuconfig 进入配置界面,进入RT-Thread online packages 目录下的Iot - internet of things 目录下选中[]ota_downloader,进入ota_downloader目录下选中[] Enable OTA downloader debug和[]Enable HTTP/HTTPS OTA(并且配置默认的URL为本机的ip地址的路径)和[] Enable Ymodem OTA,如下图4和图5所示

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_固件_12

图 4 添加ota_downloader软件包

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_项目代码_13

图5 配置ota_downloader软件包添加ymodem_ota和http_ota

通过ESC按键返回到RT-Thread online packages 目录下system packages目录下选中fal: Flash Abrstraction layer…,如下图6所示

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_固件_14

图6 添加FAL 软件包

进入选中该项 fal目录下,选中FAL partition table config has defined on ‘fal_cfg,h’和FAL uses SFUD driver,并且修改name 为flash0 具体配置如下图7所示

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_分区表_15

图 7 配置fal 软件包

然后保存并退出。在ENV工具的命令行中输入 pkgs  --update 软件更新的指令,等下载完成后,就可以输入:scons --target=mdk5 重新编译生成新的工程。

(3) 添加fal_cfg.h和fal_flash_stm32f4_port.c和更新SFUD的驱动文件

由于原项目代码版本的问题,需要在新版的RT-Thread的源代码中复制两个文件到现工程代码中。把fal_cfg.h和fal_flash_stm32f4_port.c这两个文件复制到现代码项目中的driver目录下,并且把这两个文件添加到项目工程中;更新SFUD的驱动文件,对比新版git库中rt-thread/components/drivers/spi/spi_flash_sfud.c和rt-thread/components/drivers/spi/spi_flash_sfud.h的文件,可以直接复制覆盖这两个文件的内容。

(4) 烧写boot.bin文件,boot.bin文件可以是烧录附件中的boot.bin文件,也可以是RT-Thread官网上通过网页生成的boot.bin,下面主要使用附件中的boot.bin文件的使用。烧录boot.bin文件主要使用ST-Link Utility工具。

 

步骤1:打开STM32 ST-LINK Utility工具,打开附件中的bootloader.bin文件,如下图8所示

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_分区表_16

图8  使用ST-Link Unitity 工具烧录boot.bin

然后,选择菜单栏上的烧录按钮,设置start address 为0x08000000为默认地址,然后选择start按钮,开始烧录,如下图9所示。

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_串口_17

图 9 设置boot.bin的起始地址

烧录完成后,在串口中会打印boot的信息,如分区表的信息等,如下图10所示

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_串口_18

图 10 烧录boot.bin后启动

由于APP固件的启动地址还没有修改,所以会提示找不到APP分区,到此bootloader已经成功启动了,下面开始APP固件的启动地址进行修改。

(5) APP固件分区的的启动地址修改

 

步骤1: 在main.c中添加FAL 初始化代码和修改中断向量跳转地址,添加版本打印信息,具体操作如下图11所示。

 

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_项目代码_19图  11 

步骤2: 修改APP启动地址为0x08008000,如下图12所示。

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_固件_20

图 12

步骤3 :添加屏蔽中断向量跳转到默认地址的语句,如下图13所示

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_项目代码_08

图 13

(6)分区表fal_cfg.h的修改

步骤参考,如下图14所示:

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_固件_22

图 14

到此为止,bootloader和ota升级功能已经添加完成,重新编译工程,下载到板子上即可看到程序正常运行。板子启动打印的信息如下图所示,验证了bootloader已经正常工作,而且成功跳转到了app固件分区中,如下图15所示。

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_固件_23

图15

而且在程序的命令行中也看到了ymodem_ota和http_ota的指令,如下图16所示。

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_命令行_24

图 16

四、功能验证

1.ymodem_ota升级功能验证。

操作步骤:

(1)采用在项目代码目录下面的packages\ota_downloader-latest\tools\ota_packager文件夹下双击运行rt_ota_packaging_tool.exe,如下图17所示

 

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_固件_25

图 17

在软件中的配置如下图18所示,点击选择固件,指定项目工程代码编译生成的rtthread-stm32f4xx.bin文件,采用不加密不压缩的方法,固件分区名为”app”,固件版本为数字序号以区分不同的版本,然后点击开始打包,即可在固件目录下生成一个rbl后缀的文件。

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_分区表_26

图 18

打包生成的rbl文件,如下图19所示。

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_串口_27

图 19

(2)在板子的串口终端中输入:ymodem_ota 命令,如下图20所示

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_串口_28

图 20

然后,利用串口终端的Ymodem传输工具发送,方法为在Xshell串口终端中,鼠标右键选择传输,再选择YMODEM,再选择YMODEM发送,指定发送的rbl文件即可。

接下来就会自动进入下载程序到板子上进行升级,部分过程图如下图21所示。

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_分区表_29img如何让开源LED电子时钟屏跑起Bootloader和OTA升级_分区表_30img如何让开源LED电子时钟屏跑起Bootloader和OTA升级_固件_31img如何让开源LED电子时钟屏跑起Bootloader和OTA升级_固件_32

图 21

到此,ymodem_ota升级完成,重启后会进入等待配网界面,airkiss配网完成后就可以显示正确的日期时间。

2.http_ota升级功能验证。

操作步骤:

(1)把板子和pc连接在同一个局域网,在给电子时钟airkiss配网的时候配置和pc同一个局域网即可。

 

(2)在PC上搭建web_server服务器,这里使用MyWebServer V3.6.21 Unicode工具,打开该软件,设置服务器的根目录,然后启动。点击浏览按钮指定rbl文件的路径目录,然后点击启动,如下图22所示。

 

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_串口_33

图22

在板子的串口终端中的命令行操作,输入http_ota url 指定rbl的地址 的命令,就会进入下载个更新app固件,如下图23所示,

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_命令行_34

图 23

固件下载完成后,开始更新app固件,如下图24所示。

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_项目代码_35

图 24

到此,让电子时钟跑起BootLoader和支持OTA升级的功能就完成了。

能坚持看到这里的小伙伴都是棒棒的。

 

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_分区表_36

NOW

如何让开源LED电子时钟屏跑起Bootloader和OTA升级_固件_37

RT-Thread


让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。

长按二维码,关注我们