3-STM32+ESP8266+Air302远程升级篇(自建物联网平台)-STM32+mbedtls通过air302使用https下载程序文件,升级程序(单片机程序轮训检查更新)

2022-05-11 14:50:05 浏览数 (1)

说明(先看那个非SSL的)

这节测试一下STM32 Mbedtls通过Air302(NB-IOT)使用https远程下载升级单片机程序

提示:升级程序只是把bin文件数据写到单片机,使用哪种方式获取bin文件数据都是可以的.

这节是使用http的方式获取程序bin文件

我已经把固件文件放在了自己的服务器上

默认使用本人提供的下载路径测试

文件路径:  网站根目录->ota->hardware->STM32Air302SSLBK

user_crc.bin: 是固件程序文件.

该固件程序文件并不是直接可以运行的文件

里面的数据每隔128字节后面增加2位CRC校验位

单片机下载以后每隔130字节校验一下数据,然后把前128字节写入Flash.

加入CRC校验让升级变的稳定可靠.

info.txt文件内容:

version:0.0.1  云端固件程序版本

 url:http://mnif.cn/ota/hardware/STM32Air302SSLBK/user_crc.bin   固件程序下载地址

"info":"1.解决了部分BUG  2.优化了部分程序"       使用APP控制升级时,APP的提示信息.

升级过程:

用户程序里面每隔一定时间控制网络模块使用http的GET指令获取云端info.txt文件

然后从文件里面获取服务器里面的固件程序版本和固件程序下载地址等信息

如果与自身版本号对比不一致,就把固件程序下载地址写入flash,然后设置更新标志,重启,

重启执行BootLoader以后,BootLoader程序检测到更新标志,则提取固件下载的地址,

然后使用http下载程序文件,把程序文件写入flash,完成升级.

备份升级流程图

模组连接

NB-IOT模块安装到第三排排母! 模块的5V引脚和底板的5V引脚相连接

单片机都是使用串口2和模组进行通信,  注意去掉ESP8266模组,防止通信冲突.

测试

1.使用下载器下载BootLoader程序

使用usb口打印串口日志

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

3.观察日志,说明执行流程

开始运行用户程序,默认提供的用户程序设置的程序版本是0.0.0

用户程序控制模组连接服务器,使用get指令获取获取服务器上的固件信息文件 info.txt

检测到版本不一致以后,把获取的url存储到flash,设置更新标志,重启.

重启之后BootLoader提取url

提示:消息格式是字符串形式的16进制....

BootLoader发送get指令获取程序固件

注意:加上SSL的程序已经达到了150KB了, NB下载有点慢......大概6分钟

升级完成以后,运行新下载的程序.

用户程序每隔一段时间控制模组连接服务器,使用get指令获取获取服务器上的固件信息文件 info.txt

现在程序版本和上面的是一致的,所以不需要更新

应用到自己的服务器

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

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

html:网站根目录

ota: ota升级

hardware : 硬件程序

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

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

https://服务器IP地址/ota/hardware/STM32Air302SSLBK/user_crc.bin

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

https://服务器IP地址/ota/hardware/STM32Air302SSLBK/info.txt

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

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

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

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

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

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

注意:BootLoader里面的产品型号要和用户里面的一样!!!!

BootLoader程序下载的时候会判断这个型号一不一致

6.编译  用户程序(mcu_project)

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

7.打开OTA Tools上位机软件

8.按照红框选择配置

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

10.点击 生成固件

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

两个bin文件的区别:

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

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

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

13.还差一个info.txt文件

我准备了一个模板

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

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

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

18.把info.txt文件也拷贝到服务器,然后按照一开始的步骤测试即可

小总结(先)

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

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

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

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

关于Flash分配调整

1.打开BootLoader 或者 用户程序里面的iap_interface.h 文件

flash的最一开始存储的BootLoader程序,  结尾存储更新相关数据, 预留一些空间让用户存储其它数据

最后剩下的平半分, 一部分存储用户程序, 另一部分用来备份用户程序

用户可以根据自己的需求调整Flash分配大小, 注意:BootLoader程序和用户程序的Flash分配要保证一样.

用户可以根据自己的需求调整Flash分配大小, 注意:BootLoader程序和用户程序的Flash分配要保证一样.

用户可以根据自己的需求调整Flash分配大小, 注意:BootLoader程序和用户程序的Flash分配要保证一样.

我设置了BootLoader占用150KB(用户可以根据自己的BootLoader程序的bin文件大小进行更改)

存储更新相关数据至少用1K,  我设置为2K(使用一页,便于存储)这个用户不要改动.

如果用户在项目中也需要使用flash存储数据, 可以根据自己存储的数据量调整flash大小

数据存储的起始地址是:  FLASH_USERDATE_ADDR

2.调整完成以后,下载BootLoader程序, 串口会打印flash具体分配

用户需要根据上面打印的设置下用户程序(mcu_project)运行地址和占用空间

关于升级底层包

1.升级底层包分为iap文件 和  iap_interface文件

2. iap文件主要是控制着升级流程的文件

可以在BootLoader程序里面设置升级过程中需要如何去下载,设置多大的缓存区

3. iap_interface是接口文件

根据移植的单片机实现内部的接口,只要完成里面的接口就完成了升级程序框架

用户程序(mcu_project)说明

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

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

执行解析之后:

IAPStructValue.SSLEN =1;

IAPStructValue.IP = mnif.cn;

IAPStructValue.Port = 443;

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

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

解释:

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

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

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

设备回复数据以后, 提取和存储url然后设置升级标志,重启.

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

其实是这个地方导致的

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

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

貌似不影响什么...

BootLoader程序详细说明

1.查看IAPInit函数

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

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

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

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

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

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

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

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

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

11,如果接收到相应的文件个数

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

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

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

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

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

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

15,超过一段时间没有接收到数据了也设置为接收完了数据

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

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

结语

下载时间有点长呀...

程序BUG

当前程序有个问题,第一次SSL连接以后,第二次就不可以,第三次又可以.......

已经判断出来是内存的问题(貌似SSL有缓存导致判断失误), 但是如何解决待定....

0 人点赞