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

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>

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

 

说明

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

 

 

标签:bin,文件,程序,STM32,Air724UG,用户程序,固件,远程,下载
来源: https://www.cnblogs.com/yangfengwu/p/14779338.html