04-STM32+W5500+AIR202远程升级方案-功能1-远程升级STM32程序(主动升级),基于W5500(TCP,HTTP/HTTPS)(备份升级)
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/STM32W5500AIR202B/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
说明
这节测试一下STM32+W5500实现利用http远程更新STM32程序
升级方式为:备份升级
STM32控制W5500使用http获取云端info.txt文件,从文件里面获取远端固件版本,固件下载地址等信息
如果和自身版本号不一致,固件下载地址写入flash,设置更新标志,重启,
BootLoader提取固件下载的地址升级程序!
注:当前程序只支持HTTP下载,HTTPS将放到优化章节里面
提示1
1.我已经把固件文件放在了自己的服务器上
默认使用本人提供的下载路径测试
后面会说明如何应用到用户的服务器.
2.记得修改控制生成bin文件的指令,否则编译报错
3.跳线帽短接单片机串口1 和 USB转串口模块
4.连接网线(网线另一端连接可以上网的路由器或者交换机)
下载BootLoader程序到开发板
1.下载以后打印如下
2.falsh分配情况
提示2
后面咱分为两种情况:
人为下载进去用户程序和让单片机升级进去用户程序
一,人为下载用户程序到开发板(注意下载细节)
1.上面已经下载了BootLoader程序,为了再次下载用户程序不覆盖掉BootLoader程序
需要下载的时候做一下配置.
需要使用下载器 ST-Link / Jlink
2.打开用户程序( STM32F10xTemplate )
调整用户程序的下载设置
选择只擦除使用的部分
3.注意检查下其它配置是否正确
4.记得根据自己的软件修改路径,否则编译会报错
5.然后点击下载
6.下载进去用户程序以后,将会从BootLoader加载用户程序运行
注:用户程序是在基本控制篇MQTT通信程序的基础上增加了升级处理程序
7.用户程序运行10S左右发送get指令获取云端的info.txt文件
info.txt文件
version: 云端固件的版本号
size: 云端固件的大小
url: 云端固件的下载地址
info:暂时用不到,后面的APP/上位机控制升级使用
如果和当前固件版本不一致,则提取size和url存入flash,设置更新标志,重启
8.BootLoader检测到升级标志,提取固件文件大小,解析url,执行备份
9.发送get指令获取程序文件,写入flash,打印每一帧数据校验结果
10,写入下载成功标志,重启以后运行新程序
11,我放到云端的程序就是当前的用户程序,只不过版本设置的不一样
也是每隔10S发送get指令获取info.txt文件,检测一下版本
二,只下载BootLoader的情况下测试
1.如果客户不能按照上面的方式下载用户程序
BootLoader程序里面也是可以测试升级
实际上该功能是为了预防程序彻底崩溃而做!
注意:程序本身就支持自动回滚,崩溃处理基本上用不到!
2.下载好BootLoader程序以后,需要用户按照下面的步骤操作
① 按下PB5(不要松开)
② 复位STM32(或者断电上电)
③ PB5按下大约10S,指示灯500ms闪耀,此时松开PB5,程序进入崩溃处理状态
3.使用调试口发送以下指令
{"data":updata,"cmd":"start"}
程序重启以后将自动执行更新操作
提示:
1.崩溃处理状态下,也支持重新设置程序文件下载地址
{"url":"http://mnif.cn/ota/hardware/STM32W5500BK/user_crc.bin"}
当前是按照内部默认路径.
应用到自己的服务器
1,在自己的网站根目录建立几个文件夹
关于本人服务器文件夹解释:
html:网站根目录
ota -> hardware : ota升级,用于升级硬件端程序
STM32W5500BK: 作为产品的型号,和程序里面设置的型号保持一致!!!后面的控制升级方式会用到这个型号
2.打开BootLoader程序的 IAP.c
修改一下 http://mnif.cn/ota/hardware/STM32W5500BK/user_crc.bin
mnif.cn/ota/hardware/STM32W5500BK 根据自己的服务器修改
3.打开用户程序的 IAP.c
修改 http://mnif.cn/ota/hardware/STM32ESP8266BK/info.txt
mnif.cn/ota/hardware/STM32W5500BK 根据自己的服务器修改
char DeviceModel[50] = "STM32ESP8266BK";//型号和上面保持一致
char FirmwareVersion[FirmwareVersionLen] = "0.0.1";//提示一个版本好测试
编译用户程序
1.默认会生成 user.bin文件
2.打开OTA Tools上位机软件
提示:该软件是修改bin文件加入校验(使得升级稳定可靠)
3.按照红框选择配置
固件版本和程序里面设置的一致
固件下载地址(文件路径) http://mnif.cn/ota/hardware/STM32W5500BK/ 和上面设置的一致
4.选择用户程序生成的 bin文件
5.点击 生成固件
6.将在user.bin目录生成info.txt 和 user_crc.bin文件
info.txt文件(utf8编码)
{"version":"0.0.1","size":42380,"url":"http://mnif.cn/ota/hardware/STM32W5500BK/user_crc.bin","info":"1.解决了部分BUG
2.优化了部分程序"}
"version":"0.0.1" :程序版本号,升级前先访问这个文件,用于对比版本号
"size":42380 :程序文件的大小,用于接收判断接收完成
url :固件的下载地址,单片机获取此地址,通过访问此地址获取固件程序
info: 当前用不到,APP/微信小程序,点击检查硬件版本,更新时,提示的信息.
user_crc.bin文件
此文件是在user.bin的基础上每隔128字节增加了CRC校验位
如果最后不满128字节则用0xff补全
7.把info.txt 和 user_crc.bin 放到云端服务器
8.然后按照一开始的测试步骤测试即可
注意:如果客户事先下载用户程序然后测试,需要保证和云端写的版本不一致!
否则会显示版本一致,不需要升级.
用户程序执行详细说明
1.用户程序对于更新就做三件事情
一是解析info.txt文件的地址
上面的程序是解析 char IAPUrlUserInfoPath[IAPUrlPathLen]="http://mnif.cn/ota/hardware/STM32W5500BK/info.txt";
IAPStructValue.SSLEN :0-http 1-https
IAPStructValue.IP :IP地址或者域名 解析上面的为:mnif.cn
IAPStructValue.Port :端口号 如果用户不指定,http默认80端口,https默认443端口
IAPStructValue.Path :路径 /ota/hardware/STM32W5500BK/info.txt
二是处理更新
从上面的流程图可知:写完程序以后BootLoader写入更新状态为 0x01
重启以后,BootLoader判断是0x01 写入 0xFF
用户程序需要清除这个状态,如果不清除0xFF
那么再次重启以后,BootLoader判断是0xFF便会执行回滚操作!
提示:用户应该在认为程序执行没有错误的地方调用
IAPUpdateDispose();
三是http获取处理info文件
上面的程序便是解析info.txt文件里面的内容
对比版本号,提取文件大小,提取url,设置更新标志,重启
BootLoader程序执行详细说明
1.BootLoader所有的初始化程序都在 IAPInit();
2.提取升级文件信息
3.如果有更新标志则备份程序文件,擦除程序运行地址,准备接收程序
4.如果没有更新标志,检查更新状态变量
如果是更新有错误,则回滚程序
如果更新标志是 0x01 则修改更新标志为 0xff
5.如果有更新标志,控制W5500连接服务器
6.连接上服务器以后,置位连接标志
7.发送get指令获取程序文件
8.如果判断接收到了 Web服务器返回的数据,写入缓存
9.从环形队列里面提取数据写入falsh,提取写入的数据,校验
提示:为了保证校验无误,是先写入,然后再提取之后做校验
而不是先校验数据,再写入!
10,接收完数据,如果有错误则设置对于的更新状态,否则写入0x01(重启)
11.如果有错误则执行尝试升级
默认尝试3次,超过次数执行回滚操作!
其它细节说明
1.再过一遍流程
用户程序get指令获取info.txt文件的内容
从内容里面提取版本号
如果版本号和本地的不一致
则接着提取size(程序文件大小),url(固件下载的地址) 存储到flash,置位升级标志,重启
BootLoader执行以后从Flash里面提取size,url.然后根据url获取程序文件
2.BootLoader从Flash里面提取size,url解析部分
以上程序会把用户存储的url解析处理
假设url是 http://mnif.cn/ota/hardware/STM32W5500BK/user_crc.bin
IAPStructValue.SSLEN = 0;(如果开头是http则为0,如果是https则为1)
IAPStructValue.IP = "mnif.cn"
IAPStructValue.Port = 80 (如果开头是http则为80,如果是https则为443,如果指定了端口则按照指定的)
IAPStructValue.Path = "/ota/hardware/STM32W5500BK/user_crc.bin"
3.再次解析IAPStructValue.IP
w5500连接服务器之前,如果地址是域名,则需要先执行DNS解析域名,获取IP地址
如果地址是字符串型IP地址,则需要转成十进制.
实际上最终的IP地址存储在 IAPStructValue.IPValue 数组里面
4.在前面的文章中说过一个事情:凡是在BootLoader里面使用中断,
用户程序必须重写,可以不做任何处理,但是必须重写!!!
BootLoader里面使用了,
定时器2; 串口1,2,3接收/发送/空闲中断; 看门狗.
为了便于用户移植使用,在加载用户程序之前清除了除了看门狗以外的所有中断.
用户只需在用户程序里面打开开门狗.具体看后面的移植使用部分
5.关于flash区域分配
客户可以在 stmflash.h里面设置flash分配
调整以后,可以查看日志查看具体地址信息
然后根据上面打印的信息调整用户程序参数
6.BootLoader把程序文件写入Flash详细流程
1.连接Web服务器
2.连接上服务器以后发送获取文件指令
3.如果服务器正确返回应答,则把接收的数据写入环形队列
4.读取环形队列数据,并写入Flash
注:程序没有直接接收以后写入flash,因为W5500平均接收的数据为1452,最大不超过2K
直接对1452字节数据做校验然后写入Flash,有可能耽搁W5500接收数据.加入缓存以后
我每次处理130字节,然后整体轮训.
提取数据以一个校验帧进行提取,当前程序是提取130字节(128字节数据+2字节CRC校验)
然后把128字节写入Flash(为了加快写的速度,一次写四字节)
写完以后再从Flash读取写入的数据,计算CRC
5.环形队列里面没有了数据,如果接收的数据等于文件大小,则认为接收完了数据
6.如果超过了一定时间环形队列没有数据可以读取,也认为接收完了数据
7.接收数据以后检查数据,没有问题写入0x01标记,重启
有问题就执行重试!默认3次,3次都不成功则重启
8.重启以后,有问题则执行回滚,没有问题执行0xFF
9.加载运行程序
7.程序里面有下载超时和整体运行超时检测
下载超时:只有在确认开始写入程序文件的时候才运行,每次写入程序文件会清零.
整体运行超时:该超时只要执行BootLoader程序便一直运行
客户可以在IAP.h修改默认的超时时间
结语
其实此套升级方案经过了大量用户的测试,应用和反馈,然后经过好几次的迭代
才形成了当前的方案.客户当前只需要拿去先使用即可.
后面会有专门的移植使用教程,可以让用户轻松的移植到自己的项目中使用!