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

2021-05-19 14:19:22 浏览数 (1)

说明

为了节省单片机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左右)

0 人点赞