前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >04-STM32+Air724UG(4G模组)远程升级篇OTA(自建物联网平台)-STM32+Air724UG实现利用http或https远程更新STM32程序(TCP指令,单片机程序检查更新,精简内

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

作者头像
杨奉武
发布2021-05-19 14:19:22
1.4K0
发布2021-05-19 14:19:22
举报
文章被收录于专栏:知识分享知识分享

说明

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
  • 精简版执行流程概述
  • 测试
  • BootLoader程序详细说明
  • 用户程序详细说明
  • 应用到自己的服务器
  • user.bin 和 user_crc_bin的区别
  • 现在看下STM32F10xTemplate
  • 应用到自己的服务器
  • 用户程序说明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档