zoukankan      html  css  js  c++  java
  • 04-STM32+Air724UG(4G模组)远程升级篇OTA(自建物联网平台)-STM32+Air724UG实现利用http或https远程更新STM32程序(TCP指令,单片机程序检查更新,精简内存版)

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

    说明

    为了节省单片机ROM空间,做了这版精简内存版的程序.

    使得最低可以支持32KB ROM空间的单片机.

    精简版执行流程概述

    在用户程序里面接收程序文件并写入flash,接收完成以后置位升级标志,复位重启.

    BootLoader程序检测到升级标志,把接收的程序文件拷贝到运行区,并运行用户程序.

    测试

    1.提供了两份用户程序(为了精简内存,用户可以根据自己实际应用场合选择使用哪一个)

    注:BootLoader程序都一样,

    STM32F10xTemplate   获取程序文件的时候,先获取info.txt 然后再获取程序文件

    STM32F10xTemplate_small  直接获取程序文件

    先看STM32F10xTemplate_small的使用过程

    2,下载BootLoader程序到开发板

     

    3.下载以后打印如下(默认开发板上的USB口,单片机串口1作为了日志打印口)

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

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

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

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

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

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

    下面演示使用下载器下载

    打开用户程序

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

    注意检查下其它配置是否正确(和BootLoader打印的保持一致)

    然后点击下载

    正常情况下会显示运行用户程序

    5.用户程序是直接访问下载程序文件,我是使用按钮控制的

    动作一下开发板上的 PB5 按钮

    6.在日志上会看到用户程序访问下载固件过程

    获取程序文件

    升级完成,运行新的用户程序

    BootLoader程序详细说明

    BootLoader程序检测到有更新标志,就把下载的用户程序拷贝到运行区...

    然后加载运行区执行.

    因为BootLoader只是简单的拷贝数据,所以只需要4KB就可以

    注:去掉printf打印,可以缩减到3KB,注意如果修改了flash配置参数,记得要和用户程序里面保持一致

    用户程序详细说明

    1.清除更新标志

    用户程序下载完程序以后,会置位更新标志,就重启了,BootLoader只是判断有这个更新标志就拷贝程序

    并不清除这个标志,所以用户程序需要清除这个标志

    2.在IAP.c里面设置产品型号,版本号,和固件下载地址

    注:size:AAAAAAAAAAAAAAA  是作为固件大小写到bin文件里面,这个是由编辑bin文件软件自动识别设置的

    程序下载的时候会提取bin文件大小,然后和实际的文件大小做对比. 之所以增加这个是因为直接下载固件,没有文件大小容易出问题!!!!

    3.然后在配置文件里面控制模组下载固件文件

    下载之前只要调用 IAPInit();来初始化所有变量 和 事先擦除flash

    IAPResolveUrl(IAPUrlUserInfoPath); 是解析下载地址

    在发送完获取固件文件指令以后需要设置 IAPStructValue.LoopListPutStart = 1;

    这个是允许把程序文件写到环形队列里面.用户只需要按照这个流程做就可以.

    4.接收固件写到环形队列里面

    5.从缓存里面提取数据写到flash里面

     

    6.判断写完成以后,设置更新标志,重启.

    7.超时检测

    一个是检测发送完获取固件之后服务器返回数据超时

    另一个是接收数据后空闲超时

    超时时间可在IAP.h里面修改

    应用到自己的服务器

    1.确认固件文件在服务器上的下载路径

    我的是

    注:设备型号根据自己的修改

    版本号嘛...因为是直接访问下载程序文件,所以程序里面并没有去判断版本号

    2.编译完成以后会在工程根目录的bin文件夹里面生成user.bin文件

    3.打开OTA Tools软件(注意需要是2.0.0及其以上版本,如果不是最新,可到源资料中下载)

    4.选择 刚才生成的user.bin ,然后选择生成固件

    会在user.bin目录里面生成  user_crc.bin的文件

    5.然后把生成的固件放到服务器上即可

    user.bin  和 user_crc_bin的区别

    1.每隔128字节增加CRC校验位

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

    现在看下STM32F10xTemplate

    STM32F10xTemplate 和 STM32F10xTemplate_small程序基本是一样的

    只不过STM32F10xTemplate是先通过服务器上面info.txt 文件获取固件版本和下载地址

    固件版本不一致以后再通过固件下载地址获取固件(这个和上面的一样了)

    1.测试下

    分别下载BootLoader和用户程序到开发板

    BootLoader和上面是一个程序,上面如果下载了只下载用户程序就可以

    2.串口日志输出如下

    访问服务器的info文件,获取固件版本信息和固件下载地址

    如果版本不一样,根据固件下载地址下载固件

    升级完成以后,用户程序获取info文件,检测到版本号一致,不需要更新.

    应用到自己的服务器

    1.确认下info.txt文件和固件在服务器上的下载路径

    我的都放在了

    2.设备型号根据自己的修改,版本号可以改为别的

    3.编译完成以后会在工程根目录的bin文件夹里面生成user.bin文件

    4.打开OTA Tools软件

    4.选择 刚才生成的user.bin ,然后选择生成固件

    会在user.bin目录里面生成  user_crc.bin的文件

    5.然后把生成的固件放到服务器上

    6.还差一个info.txt文件

    我准备了一个模板

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

    8.修改固件程序大小(OTA Tools提示信息里面有这个大小)

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

     

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

     

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

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

    记得修改下用户程序里面的固件版本,然后重新下载到开发板,

    让本地版本和服务器上面的版本不一样,一样的话会提示版本已是最新不需要升级.

    用户程序说明

    1.主函数和上一个程序相比就是直接控制模组访问服务器

    2.先获取info.txt文件信息

    3.再根据下载路径获取固件,就和上面的程序一样了

    注:info.txt和固件都在一个服务器里面,所以我直接再发了个指令(一般http连接超时时间是5s左右)

  • 相关阅读:
    Introduces the basic structure of Android ActivityManagerService
    创业的本质是资源整合
    android系统的经典文章
    GUI软件框架--窗口服务器
    学习法则:只接收能够体系化的知识
    编程思想:以什么样的方式来建模、分析、思考、解决问题
    怎么从本质上理解面向对象的编程思想?
    视图的对象化描述
    DOM= Document Object Model,文档对象模型---以对象管理组织(OMG)的规约为基础的
    GUI(UI编程)语言与面向对象、dsl
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/14779338.html
Copyright © 2011-2022 走看看