[uCOS/RTOS] 如何让开源LED电子时钟屏跑起Bootloader和OTA升级

[复制链接]
393|10
 楼主 | 2019-5-7 00:10 | 显示全部楼层 |阅读模式
本帖最后由 shadow12 于 2019-5-7 09:15 编辑
如何让开源LED电子时钟屏跑起BootloaderOTA升级

提前声明:本项目是基于芯片之家的[开源01教你制作网络数字变化时钟的项目代码进行修改,增加bootloaderOTA升级的。
led3.jpg
等待airkiss配网
led2.jpg
airkiss配网成功
led1.jpg
正确显示日期和时间
一、前期准备
硬件准备:
1. 一块LED电子数字时钟屏
2. 一根microusb线(安卓线)
3. 一个下载器(ST-Link或者Jlink 等)
软件准备:
4. MDK5软件
5. RT-Thread的ENV工具
6. 源代码项目
7. RT-Thread OTA打包工具
8. WebServer工具

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

one.jpg

two.jpg
功能说明
Bootloader 的主要功能是更新 app 分区中的固件。
分区表介绍
通用 Bootloader 中的分区表包含如下三个分区:
分区名
起始地址
分区大小
分区位置
介绍

app
自定义
自定义
片内 Flash
存储 app 固件

download
自定义
自定义
片内 Flash 或者片外 SPI Flash
存储待升级固件

factory
自定义
自定义
片内 Flash 或者片外 SPI Flash
存储出厂固件

升级固件功能
当系统需要升级固件时,Bootloader 将从 download 分区将固件搬运到 app 分区,主要功能流程如下所示:
1. Bootloader 启动时检查 download 分区和 app 分区中的固件版本。
2. 如果两个固件版本相同,则跳转到 app 分区,Bootloader 运行结束。
3. 固件版本不同则将 download 分区中的固件搬运到 app 分区。
4. 在搬运的过程中 Bootloader 可以对固件进行校验、解密、解压缩等操作。
5. 搬运完毕后,删除 download 分区中存储的固件。
6. 重启系统跳转到 app 分区中的固件运行,Bootloader 运行结束。
Bootloader 工作过程如下图所示:
three.jpg
恢复固件功能
当系统中的固件损坏,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所示:
Picture1.jpg
                                                                           图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所示:
Picture2.jpg

添加配置后,返回到主界面,修改CS的引脚号为20.
Picture3.jpg
2 配置SPI驱动和GPIO驱动

保存并退出,在env命令行下输入scons --target=mdk5 重新编译生成工程。
再用mdk5打开编译的项目工程,编译烧录到板子上,在启动信息可以判断外置flash已经添加驱动了,如下图3所示:
Picture4.jpg
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所示

Picture5.jpg

4 添加ota_downloader软件包
Picture6.jpg
5 配置ota_downloader软件包添加ymodem_ota和http_ota
通过ESC按键返回到RT-Thread online packages 目录下system packages目录下选中fal: Flash Abrstraction layer...,如下图6所示
Picture7.jpg
6 添加FAL 软件包
进入选中该项 fal目录下,选中FAL partition table config has defined on ‘fal_cfg,h’和FAL uses SFUD driver,并且修改name 为flash0 具体配置如下图7所示
Picture8.jpg
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所示
Picture9.jpg
8  使用ST-Link Unitity 工具烧录boot.bin

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


烧录完成后,在串口中会打印boot的信息,如分区表的信息等,如下图10所示
Picture11.jpg
                                                                                               图10 烧录boot.bin后启动
由于APP固件的启动地址还没有修改,所以会提示找不到APP分区,到此bootloader已经成功启动了,下面开始APP固件的启动地址进行修改。
(5)APP固件分区的的启动地址修改
步骤1: 在main.c中添加FAL 初始化代码和修改中断向量跳转地址,添加版本打印信息,具体操作如下图11所示。
Picture12.jpg
                                                                                                   图11
步骤2: 修改APP启动地址为0x08008000,如下图12所示。

Picture13.jpg
                                                                                                   图12
步骤3 添加屏蔽中断向量跳转到默认地址的语句,如下图13所示
Picture14.jpg
                                                                                                    图13
(6)分区表fal_cfg.h的修改
步骤参考,如下图14所示:
Picture15.jpg
                                                                                                   图14
到此为止,bootloader和ota升级功能已经添加完成,重新编译工程,下载到板子上即可看到程序正常运行。板子启动打印的信息如下图所示,验证了bootloader已经正常工作,而且成功跳转到了app固件分区中,如下图15所示。
Picture16.jpg
                                                                                                  图15


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

四、功能验证
1. ymodem_ota升级功能验证。
操作步骤:
(1)采用在项目代码目录下面的packages\ota_downloader-latest\tools\ota_packager文件夹下双击运行rt_ota_packaging_tool.exe,如下图17所示
Picture18.jpg
                                                                                                   图17


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

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

Picture20.jpg
                                                                                                   图19

(2)在板子的串口终端中输入:ymodem_ota 命令,如下图20所示
Picture22.jpg
                                                                                                   图20
然后,利用串口终端的Ymodem传输工具发送,方法为在Xshell串口终端中,鼠标右键选择传输,再选择YMODEM,再选择YMODEM发送,指定发送的rbl文件即可。
接下来就会自动进入下载程序到板子上进行升级,部分过程图如下图21所示。
Picture23.jpg
   Picture24.jpg
Picture25.jpg
                                                                                                图21

2.  http_ota升级功能验证。
操作步骤:
1. 把板子和pc连接在同一个局域网,在给电子时钟airkiss配网的时候配置和pc同一个局域网即可。
2. PC上搭建web_server服务器,这里使用MyWebServer V3.6.21 Unicode工具,打开该软件,设置服务器的根目录,然后启动。
点击浏览按钮指定rbl文件的路径目录,然后点击启动,如下图22所示。
Picture26.jpg
       图22

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

Picture27.jpg
                                                                                                  图23

固件下载完成后,开始更新app固件。

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


能坚持看到这里的小伙伴都是棒棒的。。。。
下一步,将会实现功能扩展,增加天气显示。。。。。
Picture21.jpg

使用道具

评论回复
 楼主 | 2019-5-7 00:17 | 显示全部楼层
第一次写教程帖,欢迎各位指点一下。。。。

使用道具

评论回复
| 2019-5-7 09:24 | 显示全部楼层
太棒了

使用道具

评论回复
| 2019-5-7 09:34 | 显示全部楼层
顶起来!!写的真好

使用道具

评论回复
| 2019-5-7 21:16 | 显示全部楼层
你好,我的那个时钟经常连不上服务器,导致3天后,时间就不准了,请问你遇到过吗?

使用道具

评论回复
 楼主 | 2019-5-8 17:08 | 显示全部楼层
月无缺 发表于 2019-5-7 21:16
你好,我的那个时钟经常连不上服务器,导致3天后,时间就不准了,请问你遇到过吗? ...

时钟经常连不上服务器?会不会是网络问题?我这边连接服务器还算稳定,偶尔出现一两次连不上服务器的,时钟是有RTC的就算没有联网的情况下应该也不会偏差很大的。

使用道具

评论回复
| 2019-5-12 11:08 | 显示全部楼层
shadow12 发表于 2019-5-8 17:08
时钟经常连不上服务器?会不会是网络问题?我这边连接服务器还算稳定,偶尔出现一两次连不上服务器的,时 ...

我都是按教程添加的组件,然后联网就是不行,你方便给一下代码吗?或者给一下你之前看的教程也可以,看看是不是我添加组件的时候出错了。

使用道具

评论回复
 楼主 | 2019-5-12 15:48 | 显示全部楼层
月无缺 发表于 2019-5-12 11:08
我都是按教程添加的组件,然后联网就是不行,你方便给一下代码吗?或者给一下你之前看的教程也可以,看看 ...

我也是按照教程添加的组件,关于联网部分我没有做任何修改,是在开源LED电子时钟的开源项目上直接使用的。

使用道具

评论回复
| 2019-5-12 17:51 | 显示全部楼层
shadow12 发表于 2019-5-12 15:48
我也是按照教程添加的组件,关于联网部分我没有做任何修改,是在开源LED电子时钟的开源项目上直接使用的 ...

你的这个开源项目,在哪里可以看到?是芯片之家的微信公众号,还是别的地方?

使用道具

评论回复
 楼主 | 2019-5-13 14:36 | 显示全部楼层
月无缺 发表于 2019-5-12 17:51
你的这个开源项目,在哪里可以看到?是芯片之家的微信公众号,还是别的地方? ...

从芯片之家的微信公众号看到的。

使用道具

评论回复
| 2019-5-13 23:41 | 显示全部楼层
shadow12 发表于 2019-5-13 14:36
从芯片之家的微信公众号看到的。

那应该是师出同门呀,咋我的就是不行呢

使用道具

评论回复
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /5 下一条

快速回复 返回顶部 返回列表