ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于WIFI模块AT指令TCP透传方式,定时访问升级

 

 

实现功能概要

  用户程序定时使用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 下载第一份用户程序(程序默认加载第一份用户程序),请按照下面配置下载

    

 

 

 

 

    

此时单片机启动以后便会运行第一份用户程序.

    

 

 

posted on 2019-11-26 14:02  广源时代  阅读(1162)  评论(0编辑  收藏  举报

导航

支付宝 QQ群