zoukankan      html  css  js  c++  java
  • 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 下载第一份用户程序(程序默认加载第一份用户程序),请按照下面配置下载

        

        

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

        

  • 相关阅读:
    Vulnhub系列:Tomato(文件包含getshell)
    Linux基础之终端、控制台、tty、pty简介说明
    linux服务器之间传输文件的四种方式
    Vulnhub系列:Os-hackNos
    [GXYCTF2019]BabyUpload
    CVE-2018-12613
    [MRCTF2020]Ez_bypass
    [BUUCTF 2018]Online Tool
    [BJDCTF 2nd]fake google
    [网鼎杯 2020 青龙组]AreUSerialz
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/11935008.html
Copyright © 2011-2022 走看看