zoukankan      html  css  js  c++  java
  • 1-STM32+CH395Q(以太网)远程升级篇(自建物联网平台)-STM32通过ch395使用http下载程序文件,升级程序(单片机程序轮训检查更新)

    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/CH395Q/myota.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

    说明

    这节测试一下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,完成升级.

    备份升级流程图

     

    测试

    1.把模块用网线和路由器或者交换机

    注意,连接路由器或者交换机的时候是连接其LAN口.

    2.下载BootLoader程序到开发板

    5.下载以后打印如下

      

     falsh分配情况(128KB Flash)

    4.下载用户程序到开发板

    上面已经下载了BootLoader程序,为了下载用户程序时不覆盖掉BootLoader程序

    需要下载的时候做一下配置. 需要使用下载器 ST-Link  / Jlink 

    提示:如果使用的串口下载,可以按照第一节把BootLoader和用户程序的hex文件合成一个hex文件下载到开发板

    提示:如果使用的串口下载,可以按照第一节把BootLoader和用户程序的hex文件合成一个hex文件下载到开发板

    提示:如果使用的串口下载,可以按照第一节把BootLoader和用户程序的hex文件合成一个hex文件下载到开发板

    下面演示使用下载器下载

    打开用户程序

     调整用户程序的下载设置,只擦除使用的部分

    注意检查下其它配置是否正确

    然后点击下载

    5.先执行BootLoader 然后运行用户程序

    6.发送get指令获取服务器上的固件信息文件 info.txt

    如果固件版本不一致,存储固件下载地址,设置升级标志,重启

    7.重启后BootLoader检测到有升级标志,则备份源程序,然后发送http指令获取程序文件

    8.升级完成以后,运行新程序.

    9.云端的程序就是当前的用户程序,只不过版本设置的不一样

    用户程序是每隔一段时间发送get指令获取info.txt文件,检测一下版本

    应用到自己的服务器

    1,首先确定好程序文件在服务器的路径

    关于本人服务器文件夹解释:(自己随意就好,最后的文件夹命名建议使用产品的型号)

    html:网站根目录

    ota: ota升级

    hardware : 硬件程序

    STM32CH395BK: 作为产品的型号(根据自己的产品型号修改)

     

    我把固件放到了里面那么固件程序下载地址为:

    http://服务器IP地址/ota/hardware/STM32CH395BK/user_crc.bin

     

    那么固件信息的下载地址为:

    http://服务器IP地址/ota/hardware/STM32CH395BK/info.txt

    2.修改 用户程序 的 IAP.C 文件

    提示:我把它们存储在程序bin文件的1024字节倍数的位置是为了BootLoader下载的时候便于提取这些数据;

    1.产品型号(我设置的为STM32CH395BK)

    2.修改固件程序版本(可随意指定,我设置的为0.0.2)

    3.修改记录云端固件信息文件下载地址(我的为:http://mnif.cn/ota/hardware/STM32CH395BK/info.txt)

    5.修改BootLoader程序 的 IAP.c,设置下产品型号和默认的固件程序下载地址

    注意:BootLoader里面的产品型号要和用户里面的一样!!!!BootLoader程序下载的时候会判断这个型号一不一致

    6.编译用户程序

    会在工程目录的bin文件夹生成 user.bin文件

    7.打开OTA Tools上位机软件

     

    8.按照红框选择配置

     

    9.选择用户程序生成的 bin文件

    10.点击 生成固件

     

    11.将在user.bin目录生成user_crc.bin文件

    1,user_crc.bin文件是在user.bin的基础上增加了CRC校验位

    2.改写size,把真实的文件大小填写到bin文件

    12.把生成的user_crc.bin文件拷贝到服务器

    13.还差一个info.txt文件

    我准备了一个模板

    14.修改版本号(和用户程序里面设置的一样)

    16.修改固件程序下载地址(和服务器上面的保持一致)

     

    17.最后的提示信息不需要更改,当前用不到

     

    18.把info.txt文件也拷贝到服务器

    19.然后按照一开始的测试步骤测试即可

    程序详细说明

    1.小总结

    远程升级单片机程序其实就是使用模组以TCP方式连接Web服务器,

    然后给TCP服务器发数据,数据格式是GET指令.

    服务器接收到指令以后会下发文件给模组,模组通过串口把数据发给单片机,

    单片机接收到数据以后写到flash,最后加载运行.

    2.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的倍数

    用户程序详细说明

    1.设置中断向量偏移

    地址其实就是用户程序运行地址

    2.软件设置程序运行位置和占用flash大小

    注:日志会打印这些信息,根据日志打印的设置即可

    3.解析下info.txt下载路径(服务器上记录固件信息的文件)

    做这个程序是为省去用户解析的繁琐.

    执行解析之后:

    IAPStructValue.IP = mnif.cn;

    IAPStructValue.Port = 80;

    IAPStructValue.Path = /ota/hardware/STM32CH395BK/info.txt

    4.处理更新(这个程序需要在认为用户程序没有问题的时候在用户程序里面执行一下)

    解释:

    BootLoader更新程序的时候会设置一些更新状态;用户程序需要调用一下这个函数清除更新状态.

    如果用户程序不清除更新状态,那么一旦程序重启以后BootLoader检查到更新状态以后会自行回滚程序.

     

    5.控制模组获取服务器上记录固件信息的文件

    6.解析info.txt文件内容

    如果版本号不一样,提取和存储url然后设置升级标志,重启.

     

    7,补充:如果编译用户程序出现下面的警告

    其实是这个地方导致的

     

     

    为了便于BootLoader程序提取用户程序bin文件里面的型号,把型号存储在了偏移1024字节的位置.

    设置的这个字符串存储的位置影响到了芯片本身默认分配一些数组的位置.就会报上面的警告.

    貌似不影响什么...

    BootLoader程序详细说明

    1.查看IAPInit函数

    2.获取存储的固件下载的url,并解析下url

    3.如果有更新标志,则备份下用户程序

    4.如果没有更新标志,则查看下更新状态

    如果状态是更新有错误,则执行回滚,如果检测到没有备份的程序,就重新执行升级

    5.如果更新状态是0x01,就设置更新状态为0xFF

    7.控制模组连接TCP服务器(Web服务器)

    8.判断连接上服务器以后设置 IAPStructValue.ConnectWebFlag = 1;

    8.发送get指令获取程序文件

    提示:使用的是http分段下载

     

     

      

    8.在TCP接收数据函数里面把固件数据写入缓存

     

    9.从缓存取数据,并写入flash

     

    11,如果接收到相应的文件个数或者超过一段时间没有接收到数据

    设置 IAPStructValue.ReadDataEndFlag = 1;认为接收完成

    12,判断接收完成之后做各种判断

    如果确实接收完了,则写入0x01状态,重启.

    如果有错误,则尝试重新下载.

     

    13,如果是程序文件下载完成以后重启,会设置更新状态为0XFF

    14,然后加载运行用户程序

    15,超过一段时间没有接收到数据,是在这里做的判断

     

    16,客户可以在IAP.h修改默认的超时时间

    整体运行超时是BootLoader一运行就一直累加的的定时,超过时间就会控制程序重启

     

     

     

    细节说明

    1.在前面的文章中说过一个事情:

    凡是在BootLoader里面使用中断,跳转到用户程序以后同样有效

    如果用户在BootLoader里面使用了其它中断,也需要在此处清除!!

    如果用户在BootLoader里面使用了其它中断,也需要在此处清除!!

    如果用户在BootLoader里面使用了其它中断,也需要在此处清除!!

    2. 下载http数据使用的是分段下载

    3.恢复出厂设置

    为了预防超级意外的情况导致程序完全崩溃,建议用户在BootLoader里面增加一个这样的程序

    在上电之前按下一个按钮,然后给板子上电.用户按下时间超过一定时间,用户松开按钮以后

    设置更新标志,清空flash里面记录的url地址,重启设备.

  • 相关阅读:
    jQuery如何获取选中单选按钮radio的值
    java计算出字符串中所有的数字求和?
    java 多线程对List中的数据进行操作
    MongoDB
    CentOS网卡一致性命名
    linux之list_for_each和list_for_each_entry函数
    linux开机启动项
    linux学习参考网站
    linux内核态获取纳秒ns时间
    Linux内核kfifo
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/15191327.html
Copyright © 2011-2022 走看看