这节测试一下STM32+CH395Q实现利用http远程更新STM32程序
我已经把固件文件放在了自己的服务器上
默认使用本人提供的下载路径测试
文件路径: 网站根目录->ota->hardware->STM32CH395BK
user_crc.bin: 是固件程序文件.
该固件程序文件并不是直接可以运行的文件
里面的数据每隔128字节后面增加2位CRC校验位
单片机下载以后每隔130字节校验一下数据,然后把前128字节写入Flash.
加入CRC校验让升级变的稳定可靠.
info.txt文件内容:
{"version":"0.0.1","size":16900,"url":"http://mnif.cn/ota/hardware/STM32CH395BK/user_crc.bin","info":"1.解决了部分BUG 2.优化了部分程序"}
version:0.0.1 云端固件程序版本
size:16900 固件程序大小(字节)
url:http://mnif.cn/ota/hardware/STM32CH395BK/user_crc.bin 固件程序下载地址
"info":"1.解决了部分BUG 2.优化了部分程序" 使用APP控制升级时,APP的提示信息.
注:使用TCP连接Web服务器,然后发送相应的GET指令获取文件!
用户程序里面每隔一定时间控制网络模块使用http的GET指令获取云端info.txt文件
然后从文件里面获取服务器里面的固件程序版本,固件程序大小和固件程序下载地址等信息
如果与自身版本号对比不一致,就把固件程序大小和固件程序下载地址写入flash,然后设置更新标志,重启,
重启执行BootLoader以后,BootLoader程序检测到更新标志,则提取固件下载的地址,
然后使用http下载程序文件,把程序文件写入flash,完成升级.
注意,连接路由器或者交换机的时候是连接其LAN口.
falsh分配情况(128KB Flash)
上面已经下载了BootLoader程序,为了下载用户程序时不覆盖掉BootLoader程序
需要下载的时候做一下配置. 需要使用下载器 ST-Link / Jlink
提示:如果使用的串口下载,可以按照第一节把BootLoader和用户程序的hex文件合成一个hex文件下载到开发板
提示:如果使用的串口下载,可以按照第一节把BootLoader和用户程序的hex文件合成一个hex文件下载到开发板
提示:如果使用的串口下载,可以按照第一节把BootLoader和用户程序的hex文件合成一个hex文件下载到开发板
打开用户程序
调整用户程序的下载设置,只擦除使用的部分
注意检查下其它配置是否正确
然后点击下载
如果固件版本不一致,存储固件下载地址,设置升级标志,重启
用户程序是每隔一段时间发送get指令获取info.txt文件,检测一下版本
关于本人服务器文件夹解释:(自己随意就好,最后的文件夹命名建议使用产品的型号)
html:网站根目录
ota: ota升级
hardware : 硬件程序
STM32CH395BK: 作为产品的型号(根据自己的产品型号修改)
我把固件放到了里面那么固件程序下载地址为:
http://服务器IP地址/ota/hardware/STM32CH395BK/user_crc.bin
那么固件信息的下载地址为:
http://服务器IP地址/ota/hardware/STM32CH395BK/info.txt
提示:我把它们存储在程序bin文件的1024字节倍数的位置是为了BootLoader下载的时候便于提取这些数据;
1.产品型号(我设置的为STM32CH395BK)
2.修改固件程序版本(可随意指定,我设置的为0.0.2)
3.修改记录云端固件信息文件下载地址(我的为:http://mnif.cn/ota/hardware/STM32CH395BK/info.txt)
注意:BootLoader里面的产品型号要和用户里面的一样!!!!BootLoader程序下载的时候会判断这个型号一不一致
会在工程目录的bin文件夹生成 user.bin文件
1,user_crc.bin文件是在user.bin的基础上增加了CRC校验位
2.改写size,把真实的文件大小填写到bin文件
我准备了一个模板
远程升级单片机程序其实就是使用模组以TCP方式连接Web服务器,
然后给TCP服务器发数据,数据格式是GET指令.
服务器接收到指令以后会下发文件给模组,模组通过串口把数据发给单片机,
单片机接收到数据以后写到flash,最后加载运行.
用户可以根据自己的需求调整stmflash.h文件Flash分配大小
注意:BootLoader程序和用户程序的stmflash.h文件要保证一样.
注意:如果使用的芯片的Flash容量是 256及其以上的型号
假设使用的是 256的
因为容量是256的,所以flash是以2K为一页.
首先FLASH_IAP_SIZE, FLASH_UPDATE_SIZE, FLASH_USERDATA_SIZE 保证是2的倍数
为保证程序运行区和程序备份区的地址是某一页的开始地址
所以 LASH_IAP_SIZE + FLASH_UPDATE_SIZE + FLASH_USERDATA_SIZE 的和需要是4的倍数
地址其实就是用户程序运行地址
注:日志会打印这些信息,根据日志打印的设置即可
做这个程序是为省去用户解析的繁琐.
执行解析之后:
IAPStructValue.IP = mnif.cn;
IAPStructValue.Port = 80;
IAPStructValue.Path = /ota/hardware/STM32CH395BK/info.txt
解释:
BootLoader更新程序的时候会设置一些更新状态;用户程序需要调用一下这个函数清除更新状态.
如果用户程序不清除更新状态,那么一旦程序重启以后BootLoader检查到更新状态以后会自行回滚程序.
如果版本号不一样,提取和存储url然后设置升级标志,重启.
其实是这个地方导致的
为了便于BootLoader程序提取用户程序bin文件里面的型号,把型号存储在了偏移1024字节的位置.
设置的这个字符串存储的位置影响到了芯片本身默认分配一些数组的位置.就会报上面的警告.
貌似不影响什么...
如果状态是更新有错误,则执行回滚,如果检测到没有备份的程序,就重新执行升级
提示:使用的是http分段下载
设置 IAPStructValue.ReadDataEndFlag = 1;认为接收完成
如果确实接收完了,则写入0x01状态,重启.
如果有错误,则尝试重新下载.
整体运行超时是BootLoader一运行就一直累加的的定时,超过时间就会控制程序重启
凡是在BootLoader里面使用中断,跳转到用户程序以后同样有效
如果用户在BootLoader里面使用了其它中断,也需要在此处清除!!
如果用户在BootLoader里面使用了其它中断,也需要在此处清除!!
如果用户在BootLoader里面使用了其它中断,也需要在此处清除!!
为了预防超级意外的情况导致程序完全崩溃,建议用户在BootLoader里面增加一个这样的程序
在上电之前按下一个按钮,然后给板子上电.用户按下时间超过一定时间,用户松开按钮以后
设置更新标志,清空flash里面记录的url地址,重启设备.