在物联网项目的开发过程中,必不可少的一项功能就是远程升级OTA(Over-the-Air),即使用WIFI、蓝牙、4G、NB-IOT等方式将升级包传输到MCU,MCU进行代码存储,完成升级
本系列文章将介绍基于电信AEP平台进行NB-IOT设备的远程升级,包含stm32内部flash分区、BootLoader代码编写,平台软件升级包制作,平台软件升级协议对接等内容,后续几篇文章将陆续介绍
该系列文章目录大纲如下:
在文章开始之前,若还不熟悉NB-IOT模块与电信AEP平台的通信过程,可以先看之前介绍NB-IOT通信的一篇文章:《还不会NB-IOT通信,这篇文章打通NB-IOT通信的任督二脉》
1 STM32 FLASH分区
要进行远程升级的设备,需要将设备的内部flash进行分区,分别存储Bootloader代码及APP应用区代码及APP备份区等
以我使用的256k的stm32为例,南风将flash分为6个区,分别为:Boot(引导区)、Boot Data(引导数据)、APP BIN Main(APP应用区)、APP BIN Bak(APP备份区)、Config(配置区)、Reserve(保留区),并按需求给每个区域分配合适的大小
Boot(引导区):存放BootLoader代码
Boot Data(引导数据):存放APP备份区代码的标志位,代码大小、校验码等;运行BootLoader时读取该区域数据,若读取到有标志位,则认为APP备份区域有待升级的代码
APP BIN Main(APP应用区):存放主代码块
APP BIN Back(APP备份区):存放备份代码,从云端接收的代码块即存储在该区域
Config(配置区):用于存放项目的一些配置信息
Reserve(保留区);预留区域
2 STM32 BootLoader编写分析
BootLoader网上很多开源的代码,但功能流程都大同小异,主要完成以下三个功能:
- 检查APP备份区域是否待升级的软件包
- 若检测APP备份区域有待升级软件包,则拷贝软件包到APP应用区
- 跳转到APP应用区
BootLoader的运行流程图如下:
3 制作软件升级包
3.1 生成bin文件
可使用MDK自带的fromelf 工具,先点击KEIL5的options for target(魔术棒),再选择user选项,勾选其中After Buil/Rebuil下面的Run #1,并在后面的输入框里输入:
<pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">fromelf --bin -o "$L@L.bin" "#L"
</pre>
- fromelf --bin意思是使用fromelf.exe来生成bin文件:
- “–bin”该选项设置输出bin文件,
- "-o"即“–output”,该选项设置输出文件名和输出文件路径,
- L是指.axf文件的绝对地址,$ @ #这些符号都是指截取L中的一部分来使用
- “$L@L.bin”就是指在.axf文件的目录下生成一个与.axf文件名称相同的bin文件
链接文件名(.axf)可以在KEIL5的options for target(魔术棒)Output选项下Name of Executable处修改
3.2 软件包制作
电信AEP平台对升级的软件有格式要求,所以我们需要根据软件包制作规范制作软件包,并上传到平台。
要求:需要将所有要在升级时传给设备的软件版本文件都打成一个升级文件;软件包文件名称不支持包含中文字符
软件升级包制作步骤如下:
-
步骤1:新建文件夹命名为"DM",在DM文件夹下创建设备系统类型文件夹,例如嵌入式设备通常采用"linux",将厂商发布的软件包描述文件"UpgradeDesc.json"文件至于"linux"目录下,参见下图:
UpgradeDesc.json文件即升级包的配置文件,文件内字段说明参见下表,文件编码格式为UTF-8无BOM
- 步骤2:在与"DM"同级目录下创建平台类型文件夹,例如"linux",该文件夹名称必须同步骤1中的平台类型文件夹一致,将待升级的bin文件置于该目录,参见下图
UpgradeDesc.json文件模板如下:
<pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">{ "specVersion": "1.0", "fileName": "ParkingDetect.bin", "packageType": "softwarePackage", "version": "V1.0", "deviceType": "test", "manufacturerName": "quectel", "model": "ParkingDetect", "protocolType":"CoAP", "description":"Test software package", "versionCheckCode":"e4", "deviceShard":"256", "date":"2020-02-22" }
</pre>
- 步骤3:选中"DM"和"linux"文件夹,使用压缩工具打包成ZIP格式的压缩包package.zip(注意package.zip下不能包含package这层目录,如下图所示。不能压缩成其他格式例如rar然后在手动修改文件类型为zip)
- 步骤4:选中“package.zip”再次使用等压缩工具打包成ZIP格式的压缩包V1.0.zip(注意,这里是将package.zip再次压缩打包,形成双层zip文件包,“V1.0”这个名称可自定义)
注:若是未双层压缩,后续在AEP平台上传升级包时会出错
我是南风,一个爱折腾的程序袁,工作之余,写写公众号,玩玩视频号,分享我的工作、我的生活
分享是一种博爱的心境,学会分享,就学会了生活