zoukankan      html  css  js  c++  java
  • 03-STM32+Air724UG远程升级篇OTA(阿里云物联网平台)-STM32+Air724UG使用阿里云物联网平台OTA远程更新STM32程序

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

    前言

    这节说明一下如何使用阿里云物联网平台的OTA远程升级STM32程序

    用户必须已经学习完了基本控制篇里面的阿里云物联网平台教程!

    阿里云物联网平台是通过MQTT获取升级固件的版本,固件大小和下载地址信息.

    升级概述

    1,实现升级是使用的基础通信里面的Topic

    阿里云介绍文档:

    https://help.aliyun.com/document_detail/89307.html?spm=a2c4g.11186623.6.712.2409429dNoQXsh

    /ota/device/inform/a1m7er1nJbQ/${deviceName} 

    设备通过这个主题上报设备的固件版本号,要求设备在连接上服务器以后第一时间上报.

    格式: {"id":"0000","params":{"version": "0.0.1"}}

    /ota/device/upgrade/a1m7er1nJbQ/${deviceName}

    设备需要订阅这个主题,服务器会通过这个主题下发固件信息

    一般在上传新固件以后,在平台上操作以后,平台才会主动下发.

    size是固件大小;  version是服务器固件版本;  url是固件下载地址

    复制代码
    {
      "code": "1000",
      "data": {
        "size": 432945,
        "version": "2.0.0",
        "isDiff": 1,
        "url": "https://iotx-ota-pre.oss-cn-shanghai.aliyuncs.com/nopoll_0.4.4.tar.gz?Expires=1502955804&OSSAccessKeyId=XXXXXXXXXXXXXXXXXXXX&Signature=XfgJu7P6DWWejstKJgXJEH0qAKU%3D&security-token=CAISuQJ1q6Ft5B2yfSjIpK6MGsyN1Jx5jo6mVnfBglIPTvlvt5D50Tz2IHtIf3NpAusdsv03nWxT7v4flqFyTINVAEvYZJOPKGrGR0DzDbDasumZsJbo4f%2FMQBqEaXPS2MvVfJ%2BzLrf0ceusbFbpjzJ6xaCAGxypQ12iN%2B%2Fr6%2F5gdc9FcQSkL0B8ZrFsKxBltdUROFbIKP%2BpKWSKuGfLC1dysQcO1wEP4K%2BkkMqH8Uic3h%2Boy%2BgJt8H2PpHhd9NhXuV2WMzn2%2FdtJOiTknxR7ARasaBqhelc4zqA%2FPPlWgAKvkXba7aIoo01fV4jN5JXQfAU8KLO8tRjofHWmojNzBJAAPpYSSy3Rvr7m5efQrrybY1lLO6iZy%2BVio2VSZDxshI5Z3McKARWct06MWV9ABA2TTXXOi40BOxuq%2B3JGoABXC54TOlo7%2F1wTLTsCUqzzeIiXVOK8CfNOkfTucMGHkeYeCdFkm%2FkADhXAnrnGf5a4FbmKMQph2cKsr8y8UfWLC6IzvJsClXTnbJBMeuWIqo5zIynS1pm7gf%2F9N3hVc6%2BEeIk0xfl2tycsUpbL2FoaGk6BAF8hWSWYUXsv59d5Uk%3D",
        "md5": "93230c3bde425a9d7984a594ac55ea1e",
        "sign": "93230c3bde425a9d7984a594ac55****",
        "signMethod": "Md5",
        "module": "MCU"
      },
      "id": "1507707025",
      "message": "success"
    }
    复制代码

    /ota/device/progress/a1m7er1nJbQ/${deviceName}

    上报更新进度

    /ota/device/request/a1m7er1nJbQ/${deviceName}

    主动请求云端固件信息

     

    开始测试

    1.打开本节的BootLoader程序 和 用户程序

    2.修改用户程序  根据自己在平台注册的设备信息修改

     

    3.使用下载器分别下载BootLoader程序 和 用户程序到开发板(顺序不能颠倒)

    4.如果没有下载器

    请用户参考远程升级的第一节组合hex文件以后下载到开发板.

    5.正常运行

    上报的版本是 0.0.0

    把升级包上传到服务器

    1.修改用户程序里面的固件版本

    注:这个随意,我修改的是0.0.2,不过在后面需要这个版本号,记着自己的版本号哈

    2.编译下工程

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

    4.打开OTA Tools.exe软件生成带有CRC校验的固件

    5.点击生成固件以后会在原先的目录生成user_crc.bin文件

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

    在物联网平台上新增固件

    1.设备运维 - 固件升级 

    2.选择添加模块(使用默认的好像不能主动查询到固件信息)

    升级包名称:随意写,  所属产品:选择您当前设备所属的产品

    3.模块名称填写1,这个是和单片机程序对应的

    这个模块具体啥作用还没看出来!!!

    4.选择咱刚才添加的升级包模块,版本号填写刚才用户程序设置的版本号

    5.上传固件

    6.先不选择验证

    验证的话需要先让其中一个设备远程升级验证下.有个繁琐的过程

    不过实际产品应用尽量选择验证!

    这个验证呢后面会说,咱先快速的使用起来.

    开始控制设备升级了

    1.点击批量升级

    2.选择动态升级

     

    3.下面这些选项,按照自己的需求更改

    最后选择覆盖原先的升级任务,就是可以保持设备更新最新的程序

     

     

    4.观察下串口日志

    服务器推送给了咱设备固件信息

    5.BootLoader升级完成,运行下载的用户程序

    6.用户程序每隔一段时间获取下服务器上的固件信息

    假设咱更新了程序

    1.修改版本号

    2.编译下工程

    3.打开OTA Tools.exe软件生成带有CRC校验的固件

    4.添加升级包

    5.下面的步骤我就不多说了

     

     

    假设需要验证

    1.改个新版本的程序上传上去

    2.点击验证

    现在批量升级不可以点击,必须先验证下固件

    这个是咱先前设备更新完成以后上报的版本号

    3.选择可以用来测试的设备

     

    4.可以看到设备开始升级

    升级成功上报版本

     

    5.然后按照前面的操作下批量升级就可以了.

    单片机程序说明(这篇文章有点长!!!)

    2.小总结

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

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

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

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

    不过这个Web服务器文件的下载地址是通过阿里云的MQTT获取到的.

    3.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大小

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

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

    如果更新成功,BootLoader里面会把更新状态置为 0xFF;用户程序需要调用一下这个函数清零这个状态.

    如果用户程序不清零这个状态,重启以后BootLoader检查到0xFF会认为执行用户程序失败了.然后执行回滚.

     

    如果本身BootLoader下载程序过程中就检查到下载的程序文件有问题,BootLoader把更新状态设置为对应的错误

    然后执行回滚.用户程序需要调用一下这个函数清零状态,如果用户程序不清零这个状态,

    重启以后BootLoader检查状态是错误,就会再次执行回滚

     

    5.控制模组连接MQTT服务器

    6.在MQTT连接成功回调函数中发送消息和订阅相关OTA的主题

    7.在MQTT接收数据回调函数中解析数据

    如果接收到更新文件信息,判断版本,解析url,解析固件大小,把url和固件大小存储到flash, 重启

    BootLoader程序详细说明

    1.查看IAPInit函数

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

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

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

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

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

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

     

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

    8.在串口中断函数里面把固件数据写入缓存

    注: IAPHttpHead是为了去掉http 头,找到数据的开始位置 

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

    10.校验数据的时候是把先前写入的提取出来校验

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

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

    然后做各种判断,

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

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

     

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

     

    12,程序里面有下载超时和整体运行超时检测

    下载超时:只有在确认开始写入程序文件的时候才运行,每次写入程序文件会清零.

    主要解决接收一半程序便不再接收的问题

    整体运行超时:该超时只要执行BootLoader程序便一直运行

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

    12.重启以后如果检测到状态是0x01则写入0xFF,执行用户程序

    如果检测状态是更新错误,则回滚程序,执行用户程序.

    细节说明

    1.如果编译用户程序出现下面的警告

    其实是这个地方导致的

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

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

    用户可以把后面的16改为17或者其他大些的数值,直至不出现警告即可.

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

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

    BootLoader里面使用了,滴答定时器中断;  串口1,2接收中断,空闲中断; 看门狗.

    在加载用户程序之前清除了除了看门狗以外的所有中断.

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

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

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

     

    4.用户按照自己的项目修改BootLoader程序注意事项

    1.在发送完获取程序文件指令以后,主循环不能带有执行超过5ms的延时函数

    延时函数的存在会影响提取缓存数据写入flash的时间,从而导致缓存溢出,数据接收不完整.

    2.如果用户想在BootLoader运行的时候显示更新状态或者进度

    可以在IAPInit() ;IAPGetProgramFile(); IAPWriteData();函数里面相应的位置增加提示

    注意:IAPWriteData()函数里面不能加延时!!!!

    3.如果要展示更新进度

    文件大小(字节): IAPStructValue.FileSizeSave

    当前接收(字节): IAPStructValue.FileSizeNow

  • 相关阅读:
    Spark Locality Sensitive Hashing (LSH)局部哈希敏感
    Spark ChiSqSelector 卡方选择器
    图解开源协议
    如何使用Hasu USB to USB Controller Converter刷写tmk固件交换Caps和Ctrl
    使用PHP读取PHP文件并输出到屏幕上
    Mac修改显示器使支持原生缩放
    PHP中使用PDO的预处理功能避免SQL注入
    如何做数据库分页查询
    Chrome报错提示Unchecked runtime.lastError: The message port closed before a response was received.
    Parallels Desktop虚拟机无法关机提示“虚拟机处理器已被操作系统重置”
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/14628187.html
Copyright © 2011-2022 走看看