实现功能概要
用户程序定时使用http访问云端的程序版本,
如果版本不一致,设置更新标志,重启单片机
BootLoader程序执行判断有更新标志
通过http下载最新的升级文件,升级完成,重启,执行新程序.
测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说明)
一,下载BootLoader程序(请自行下载)
二,调整波动开关位置,STM32和Wi-Fi 串口 通信
三,短接STM32的PB2和Wi-Fi模块的RST引脚(内部程序使用该引脚硬件复位Wi-Fi)
四.两个串口模块的RX,分别接到单片机的PA9和PA10.
4.1注:此为监控STM32和Wi-Fi之间的数据,看到更新的过程.
4.2 示意图
开始测试(默认访问测试服务器上的程序文件)
一,打开可以配网的APP,给Wi-Fi配网
请参考基础篇: https://www.cnblogs.com/yangfengwu/p/11760590.html
二,BootLoader程序里面配网成功后,默认重启以后更新程序文件,更新完成以后自动加载更新的用户程序
下面说明一下监控的数据
2.1 单片机发送数据,(获取云端程序文件的版本信息)
2.2 其实就是获取的这个文件,我把这个文件放在了云服务器上
2.3 获取程序文件(访问我提供的测试服务器上的)
2.4 如果升级没有问题重启以后运行刚升级进去的用户程序
关于乒乓升级
1.简要
每次更新的时候 用户程序1和用户程序2来回的切换写入运行
BootLoader程序主要做的工作就是如果上次运行的用户程序1
则获取第二份用户程序,然后把程序文件写入用户程序2地址
如果上次运行的用户程序2
则获取第一份用户程序,然后把程序文件写入用户程序1地址
2.关于源码中的两份用户程序
首先,两份用户程序除了设置的中断偏移不一样以外其他完全一样!
不同的偏移值使其能运行在不同的Flash地址上
STM32F10xTemplate 设置的偏移值只能运行在 ↓
STM32F10xTemplate - 副本 设置的偏移值只能运行在 ↓
3.升级切换文件流程
首先,咱们需要每次要升级的时候需要把运行在不同地址,
功能完全一样的两份用户程序的bin文件放到云端,
(编译 STM32F10xTemplate 产生的bin文件
和编译 STM32F10xTemplate - 副本 产生的bin文件)
以供单片机下载.
假设当前单片机是在用户程序1 地址加载运行的程序
那么单片机下次升级就需要下载 能在用户程序2 地址运行的程序文件
然后写到 用户程序2 地址,然后单片机就加载用户程序2 地址上的程序运行
下次再升级就是下载 能在用户程序1 地址运行的程序文件
这里说一下为什么需要同时把两份文件放上去.
大家可能会想,假设我单片机一开始是在用户程序1 地址加载运行的程序
那么我单片机升级肯定是下载 能在用户程序2 地址运行的程序文件
我直接把 能在用户程序2 地址运行的一个程序文件放到云端不就可以了
我单片机如果接着再升级,肯定是下载 能在用户程序1 地址运行的程序文件
我直接把 能在用户程序1 地址运行的一个程序文件放到云端不就可以了
干嘛非要把 能在两个地址运行的执行功能一样的程序放上去呢??
我只问一句:
大家在看到软件更新的时候,大家是否真的去执行更新???
是不是有时候都过去好几个版本了才选择升级??
大白话就是:
假设有两个用户买了咱的产品
假设一开始都是在用户程序1 地址加载运行的程序
然后第一次升级的时候,其中一个用户升级了
另一个用户没有执行升级.
假设咱又换了下版本,需要再升级!
现在的情况就变为:
第一个用户再次升级的时候,需要下载能在用户程序1 地址运行的程序文件
第二个用户由于第一次没有升级,
再次更新的时候需要下载能在用户程序2 地址运行的程序文件
所以......
大家一定是要把在两个地址运行的执行功能一样的程序放上去!
应用在自己的服务器--配置
一,修改BootLoader和用户程序连接的Web服务器的IP地址,端口号信息
二,Http访问程序文件的路径请自行根据自己的修改,我按照我自己的说明
2.1 根据单片机程序访问的http路径,在Web服务器建立文件夹
char PathVersionInfo[50]="/hardware/STM32_Timing_AT8266_SUM/updatainfo.txt";//程序文件版本路径
char PathUser1bin[50]="/hardware/STM32_Timing_AT8266_SUM/Progect.bin";//运行在地址1上的程序文件路径
char PathUser2bin[50]="/hardware/STM32_Timing_AT8266_SUM/Progect2.bin";//运行在地址2上的程序文件路径
2.2 打开上位机软件,计算两份用户程序的SUM值
2.3 计算运行在地址1上的程序文件的校验值,并替换SumBin1的字段值
2.4 计算运行在地址2上的程序文件的校验值,并替换SumBin2的字段值
2.5 拷贝记录设备版本的updatainfo.txt文件,和用户程序1文件(Progect.bin),用户程序2文件(Progect2.bin)到服务器
2.5 最终效果
修改完了按照文章一开始的测试
升级成功以后用户程序里面在定时询问是不是有新版本
咱刚升级进去的肯定是新版本.
咱到云端修改下版本
修改云端版本
一,修改云端版本
二,用户程序检测到新版本,写入更新标志,重启,
BootLoader获取更新另一份程序,重启,运行新程序
其它
一,可先下载第一份程序到单片机,让单片机默认运行一份程序
1.1 操作步骤是先下载BootLoader程序(下载进去就可以,不需要任何配置)
1.2 下载第一份用户程序(程序默认加载第一份用户程序),请按照下面配置下载
此时单片机启动以后便会运行第一份用户程序.