03-STM32+Air724UG远程升级篇OTA(阿里云物联网平台)-STM32+Air724UG使用阿里云物联网平台OTA远程更新STM32程序

前言

这节说明一下如何使用阿里云物联网平台的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

  • 10
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
物联网是指通过无线通信技术将各种设备、物品互联互通,实现信息共享和远程控制的网络系统。STM32开发板是一种常用的微控制器开发板,其可以与各种外部设备相连,如传感器、执行器等。在物联网应用中,使用STM32开发板进行设备的控制和数据的采集十分常见。 为了方便用户对物联网设备进行控制,可以使用App、小程序或者Web页面等方式实现远程控制。在本场景中,我们使用STM32开发板、W5500以太网模块和ESP8266 WiFi模块。 W5500是一款硬件以太网控制器,它可以用于将STM32开发板连接到网络。通过W5500,STM32可以通过Ethernet协议与Internet进行通信。用户可以通过编写STM32程序,实现与云服务器的数据交互与远程控制。 同时,我们还可以使用ESP8266模块连接到STM32开发板,使得STM32具备WiFi通信能力。ESP8266可以连接到无线网络,并提供与云服务器的通信接口。使用ESP8266模块,我们可以使用HTTP或MQTT等协议与互联网进行通信,实现物联网设备的远程控制和OTA(Over-The-Air升级OTA升级指的是通过网络向设备更新固件,而不需要将设备连接到计算机进行有线升级。在物联网应用中,OTA升级可以实现灵活的固件更新,为设备带来更多的功能和修复漏洞。使用OTA升级,我们可以通过网络将固件更新的指令发送到STM32开发板,然后通过W5500或ESP8266模块将固件文件下载到设备,最后进行固件更新。这样,设备的固件可以实时更新,同时不需要用户手动连接设备和计算机。 总之,通过使用STM32开发板、W5500以太网模块、ESP8266 WiFi模块以及相应的App、小程序或者Web页面,我们可以实现对物联网设备的远程控制和OTA升级

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值