stm32 esp8266 ota系列文章:
stm32 esp8266 ota-快速搭建web服务器之docker安装openresty
stm32 esp8266 ota升级-tcp模拟http
stm32 esp8266 ota升级-hex合并-烧录-bin生成
stm32 esp8266 ota升级-qt bin文件处理工具
stm32 esp8266 ota升级-自建mqtt和文件服务器动态AB面方式
stm32 esp8266 ota升级-自建mqtt和文件服务器全量升级
stm32 esp8266 ota升级-自建mqtt和文件服务器全量升级
本文通过自建mqtt和文件服务器,动态获取升级配置,然后进行全量升级。有部分代码截图示例。
1.mqtt升级消息包含version,file_name ,host,port等字段,程序可根据这些字段,动态配置固件名,升级服务器和端口号。
2.升级所用的bin文件,是每隔512字节进行crc16校验,并将校验值插入其后,进而保证了数据传输的稳定性。
通过挂表2天2夜循环升级测试,该实现方案,稳定可靠。
环境介绍
硬件
- stm32F103系列flash 128K以上;
- esp8266-01s
软件
qt bin文件处理工具:
用于生成crc校验后的bin文件,作为升级使用。
思路主要是对bin文件,每隔512字节进行crc16校验,并将两个字节的校验值,插入其后。
具体实现请参阅博文https://blog.csdn.net/a554521655/article/details/128455446
文件服务:
升级bin文件存储,http GET请求方式获取。
具体文件服务器搭建请参阅博文:https://blog.csdn.net/a554521655/article/details/128422637
mqtt服务器
用于mqtt消息管理和转发。
具体搭建(仅参考emqx部分即可),请参阅博文:https://blog.csdn.net/Apple_Coco/article/details/121500546
app 程序
mqtt消息订阅与发布,进行iot控制处理,如蜂鸣器、led、继电器等开发,温湿度传感器上报等,用户可根据自己产品在此app基础上进行改进。
升级处理:主要完成ota升级
BootLoader
引导启动app程序。有升级,则进行程序code拷贝,无升级,则正常启动;
OTA常见方案
请参考https://blog.csdn.net/zdavid_2018/article/details/109490846博文,感谢博主分享。
stm32程序运行
请参考https://www.elecfans.com/d/1802838.html,博文,感谢博主分享。
对于stm32初学开发者,需要会通过跳冒来配置自己需要的启动模式。
![image-20221226112539234](https://img-blog.csdnimg.cn/img_convert/ae738d1df4964b3bd343bdccef9af277.png)
说明:一般我们使用JTAG或者SWD模式下载程序时,就是下载程序到内置的Flash里面,重启后也直接从这启动程序。
flash分区
采用全量升级方式,我们将flash分为4个区域,从低地址到高地址依次是 bootloader,env parameters,app A,app B
- bootloader:程序引导区域,根据环境参数,决定启动哪个区域的用户程序;
- env parameters:用于存储环境参数,主要有当前启动模式,启动是否正常,失败次数等;
- app A:用于程序启动运行;
- app B:用于bin文件下载接收;
#define PageSize FLASH_PAGE_SIZE //page大小
#define Stm32_BaseAddr FLASH_BASE //stm32运行首地址
#define BootLoader_Size 0x2400U //BootLoader大小 9K
#define Env_Size 0x400U //环境变量大小 1K
#define Application_Size 0x9800U //app大小 38K
#define BootLoader_addr Stm32_BaseAddr //bootLoader的首地址
#define Env_addr (Stm32_BaseAddr+BootLoader_Size) //env addr
#define Application_A_Addr (Stm32_BaseAddr+BootLoader_Size+Env_Size) //appA首地址
#define Application_B_Addr (Stm32_BaseAddr+BootLoader_Size+Env_Size+Application_Size) //appB首地址
![ota flash地址分配-全量升级.drawio](https://img-blog.csdnimg.cn/img_convert/a5c6a77e66404f8bf710a5f4fc8b11e3.png)
全量升级整体逻辑
![ota升级流程-全量升级.drawio](https://img-blog.csdnimg.cn/img_convert/adf53dd730db382fdf1177258811e4d1.png)
上传固件到文件服务器
首先,对bin文件Iot4g.bin进行处理(每隔512字节进行crc16校验,并将两个字节的校验值,插入其后)。这里使用作者自己开发qt bin文件处理工具进行处理,软件界面如下。处理完成,将生成Iot4g-crc.bin。
![image-20221226182025665](https://img-blog.csdnimg.cn/img_convert/8b6f86483c8ea98236d17a69072c1c88.png)
然后,将Iot4g-crc.bin 文件上传到服务器。
![image-20221226175738350](https://img-blog.csdnimg.cn/img_convert/ae9291de606f85548cc1c429fb252af7.png)
app程序中主动发送mqtt消息触发升级
stm32 支持mqtt消息订阅和发布功能,这里订阅和发布话题
pubtopicBuzzer:qytech/mqtt/981071898424177441124234033/data/buzzer
subtopicBuzzer:qytech/mqtt/981071898424177441124234033/cmd/buzzer
pubtopicUpgrade:qytech/mqtt/981071898424177441124234033/data/upgrade
subtopicUpgrade:qytech/mqtt/981071898424177441124234033/cmd/upgrade
mqtt升级消息格式定义如下:
{
"type": "upgrade_firmware", //升级标识
"file_name": "Iot4g-crc.bin", //升级文件名
"version": "smartV1.1", //升级版本
"file_size": 708482, //升级文件大小,这里未使用,文件大小通过get请求获取
"url": "/", //升级文件服务器中路径
"host": "alyou.langtaotech.cn",//升级服务器
"port": "51802", //升级端口
"md5sum": "" //升级文件md5校验,未使用,这里对bin文件每隔512字节crc16校验
}
然后发送升级消息,进行升级
![image-20221226175824009](https://img-blog.csdnimg.cn/img_convert/56e4d420c550bc4ad131706420109a25.png)
订阅话题qytech/mqtt/981071898424177441124234033/data/upgrade,会收到start upgrade提示。相应的升级成功和失败也会收到提示信息。
![image-20221226183244589](https://img-blog.csdnimg.cn/img_convert/ee318b2a5289d9a7946bf9f3648ce0ee.png)
app程序中解析mqtt升级指令
解析收到的mqtt消息,提取出version,file_name ,host,port 等所需字段
![image-20221226183515031](https://img-blog.csdnimg.cn/img_convert/563e643b70be5bd65bb8eed92c53ac56.png)
通过获取的file_name ,host ,port 等信息,连接服务器,获取文件大小;
![image-20221226183714619](https://img-blog.csdnimg.cn/img_convert/a121d37e6185ef1add4d0a867fbea116.png)
通过文件大小,计算分包下载所需包数,然后发送带Range字段的get请求进行bin文件分包下载
![image-20221226183944589](https://img-blog.csdnimg.cn/img_convert/f064a4cb55f8ce7fac26ff55a1e7d313.png)
对接收的每包数据(这里是512+2字节crc16)的前512字节进行crc16计算,结果与包中后2字节对比,一致则写入flash中;
![image-20221226184242396](https://img-blog.csdnimg.cn/img_convert/86fd9b234d021a274dc32140143ff7f9.png)
当所有整包数据接收完成后,处理最后不足整包的数据。思路与整包处理流程一致,这里不做说明。
BootLoader处理
判断是否需要升级,如果env_info.appIndex==app_B,则需要升级,否则正常启动;
![image-20221230103159343](https://img-blog.csdnimg.cn/img_convert/9d71a642d52ea748b5c20cbc26abcde0.png)
升级串口提示信息
升级过程中
![image-20221226175637932](https://img-blog.csdnimg.cn/img_convert/eb23ae003df5948e785c3bdf708393bc.png)
升级完成
![image-20221227131834087](https://img-blog.csdnimg.cn/img_convert/4bfe51e6eac1580f98105d0dc91ff37b.png)
升级成功后,reboot,BootLoader搬运程序到app A,然后启动
![image-20221230100633301](https://img-blog.csdnimg.cn/img_convert/abb19df1d6c2f2a971c8704f38a33865.png)
总结
自建mqtt和文件服务器,让大家自己掌握整个项目流程环节,不局限于某个平台。
bin文件crc校验处理,保证了数据传输的稳定性。
mqtt升级消息(version,file_name ,host,port等字段),程序可动态配置固件名,升级服务器和端口号,让升级更加灵活。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)