STM32项目中一种在线升级/应用升级OTA-IAP设计方案

STM32 OTA-IAP设计方案

OTA是Over-the-Air的简写,即空中下载技术,通过网络远程给用户进行系统更新和升级。IAP是In Application Programming的简写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。IAP主要包括BootLoader和应用程序两部分,基于IAP的OTA设计思路是先通过OTA接收升级固件,再利用IAP进行固件搬移、校验和程序跳转,实现空中升级的目的。
BootLoader程序根据判断是否需要升级固件,并进行运行代码跳转。APP工程中需要编写OTA数据包交互协议,将接收到的升级固件保存至FLASH,校验一致性然后设置升级标志位并重启。

一、STM32启动模式分析

Cortex-M3 内核启动有3种情况:

  1. 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后 PC 指针位于0x2000000处。
  2. 通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处。
  3. 通过boot引脚设置可以将中断向量表定位于内置Bootloader区。

Cortex-M3内核规定,起始地址必须存放栈顶指针,而第二个地址则必须存放复位中断入口向量地址,在Cortex-M3内核复位后,会自动从起始地址的下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。Boot引脚设置见下表。

BOOT0BOOT1启动模式
0无关FLASH
10系统存储器,ISP模式
11SRAM,调试

STM32的启动文件(startup_stm32f103xb.s)和启动过程。

    (1)首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈顶地址(32位),第二个表项是复位中断服务入口地址;(2)然后执行复位中断,在复位中断服务程序中跳转 C/C++标准实时库的main函数(__main),完成用户堆栈等的初始化后,跳转.c 文件中的main函数(真正的用户main函数)开始执行程序。

假设STM32被设置为从内部FLASH启动,中断向量表起始地位为0x8000000,则栈顶地址存放于0x8000000处,复位中断服务入口地址存放于0x8000004处。当STM32遇到复位信号后,则从0x80000004处取出复位中断服务入口地址,继而执行复位中断服务程序,然后跳转__main函数,最后进入main函数。

二、FLASH分区

设置STM32为从FLASH启动,即硬件设置管脚BOOT0低电平。本方案单片机型号采用:STM32F103RBT6,FLASH:128KB, SRAM:20KB。FLASH分为Bootloader、APPA、APPB、Parameter4个部分,分别占用20kB、50kB、50kB和8kB内存空间。APPA是应用程序区,运行用户设计的应用程序;APPB是应用程序备份升级区,存放接收到的固件升级包;Parameter是参数区,保存程序运行的关键参数、升级标志和密钥。FLASH分区示意图如下图所示。
FLASH分区示意图

三、OTA流程

单片机上电后首选运行BootLoader该段代码,读取Parameter参数区的升级标志量,判断是否有升级需求。若有升级需求,则根据记录的相应固件大小将APPB区升级文件拷贝至APPA区,并改写升级标志量,然后重启;若无升级请求,则程序跳转至APPA代码区运行。OTA程序流程如下所示。
具体流程描述如下:
Step1:上电启动单片机,首先执行BootLoader程序。
Step2:BootLoader读取Parameter区参数,查看升级标志是否有升级任务,若没有升级任务,则进入 Step3,否则进入 Step4
Step3: BootLoader程序跳转至APPA,执行用户代码,并判断是否收到升级任务请求,若有升级任务请求则进入 Step7
Step4:根据Parameter区升级参数,校验APPB固件数据并将APPB升级固件拷贝到APPA区,执行 Step5Step6
Step5:将升级标志位清除。
Step6:重启,再次执行BootLoader。
Step7:将接受到的升级数据包存入APPB区,并将相关升级参数存入Parameter区,若接收数据完成,固件检验通过则写入Parameter区升级标志,并进入 Step8
Step8:重启,再次执行BootLoader。

四、工程设置

4.1 BootLoader工程设置

由于BootLoader需要在上电复位后首先执行,因此,设置BootLoader存放在FLASH起始位置0x08000000,在MDK中打开options for target,设置IROM1 Start = 0x08000000,Size = 0x5000(0x5000 = 20kB),在Flash Download中设置下载Flash位置,参数与IROM1中设置Start和Size相同。BootLoader代码大小不超过20kB,越小越好。
编译设置
下载FLASH设置

4.2 APP工程设置

根据FLASH分区,APP代码存放在紧挨着BootLoader之后,因此APP的起始位置应该为0x08000000+0x5000 = 0x08005000,占用内存大小为0xC800(50kB),在MDK中打开options for target,设置IROM1 Start = 0x08005000,Size = 0xC800,在Flash Download中设置下载Flash位置,参数与IROM1中设置的Start和Size相同,如图5和图6所示。由于APP代码运行的起始位置不在0x08000000,其栈顶地址发生偏移,对应的中断向量表地址也整体发生偏移,因此,在代码中需要对APP代码的中断向量表偏移进行设置,具体的在system_stm32f1xxx.c中启动代码中可以看到定义的中断向量表偏移量宏定义:

#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#elseSCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif 
/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x5000 /*!< Vector Table base offset field. This value must be a multiple of 0x200. */

编译设置
下载FLASH设置

升级界面如下:
在这里插入图片描述
设备启动界面如下:
在这里插入图片描述
下一篇准备写个具体实现,包括本文提到的整包升级和朋友提到的差分升级,并且附带配套的QT开发的升级软件开发教程,考虑收费栏目。

有需求的朋友请私信,我统计一下情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式GUI FTK支持输入法

From: http://blog.csdn.net/absurd/article/details/5318285 春节期间给FTK增加输入法支持&#xff0c;目前支持拼音输入法&#xff0c;五笔输入法和手写输入法。手写输入法只是实现了框架&#xff0c;识别引擎才开个头&#xff0c;这是今年FTK开发的重点任务。拼音输入法&…

STM32程序占用的内存容量计算

STM32中程序占用内存容量 Keil MDK下Code, RO-data,RW-data,ZI-data这几个段: Code存储程序代码。RO-data存储const常量和指令。RW-data存储初始化值不为0的全局变量。ZI-data存储未初始化的全局变量或初始化值为0的全局变量。占用的FlashCode RO Data RW Data; 运行消耗的…

matlab生成exe-在没有安装matlab的电脑上运行matlab生成的exe

在没有安装matlab的电脑上运行matlab生成的exe 本文介绍如何将matlab生成exe&#xff0c;并将该exe在没有安装matlab的电脑上运行&#xff0c;与以前的博文相似地&#xff0c;不说废话&#xff0c;直接干货。 1、编写函数 2、用mcc 生成exe mcc -m testexe.m 3、在matlab命令…

Androd开发之广告栏设计

对于做Android开发的工程师对于这个效果的实现一定不陌生&#xff0c;本篇我将带领大家先简单实现这个效果&#xff0c;再为大家介绍一下其中的原理&#xff0c;方便新手学习&#xff0c;老手复习&#xff0c;内容简单易懂&#xff0c;没有基础一样学习&#xff0c;不扯没用的了…

在exe执行机上安装MCR环境(matlab运行环境)

未安装matlab的执行机上运行matlab生成的exe&#xff0c;需要提前安装好MCR。此文介绍安装方法。 1、 D:\MATLAB\R2016a\toolbox\compiler\deploy\win64 中MCRinstaller.exe 安装到该计算机上 2、 Mbuild –setup 安装合适的编译器 3、 将M 文件编译为可执行文件的语法是 mc…

Qt Label自适应显示Logo图片

一、要求 Qt Creator Ui中的Label标签控件显示一张Logo图片&#xff0c;要求图片自适应控件的大小。 二、实现&#xff08;代码&#xff09; QImage Image;//声明QImage 对象 Image.load(":/image/image/logo.jpg");//加载图片&#xff0c;前提是该图片存在项目的…

oracle数据倾斜优化,Hive数据倾斜优化 - ericquan8的个人页面 - OSCHINA - 中文开源技术交流社区...

数据倾斜成因&#xff1a;由于数据分布不均匀&#xff0c;造成数据大量的集中到一点&#xff0c;造成数据热点。具体为某一个reduce接收到的数据是其他reduce的n倍&#xff0c;导致明显的木桶效应。症状&#xff1a;1&#xff0c;对表做select count(1) from tb group by key&a…

STM32单片机低功耗配置

一、低功耗模式 当CPU不需继续运行时&#xff0c;可以利用多种低功耗模式来节省功耗&#xff0c;STM32支持三种低功耗模式&#xff0c;可以在要求低功耗、短启动时间和多种唤醒事件之间达到最佳的平衡。 睡眠模式SleepMode。在睡眠模式&#xff0c;只有CPU停止&#xff0c;所…

我的第一个REST客户端程序!

Delphi&#xff1a;XE8 看了好几天的资料了&#xff0c;也没有弄出来一个REST程序&#xff0c;尝试了XE8中带的例子&#xff0c;也都没有搞懂。我在网上不断搜索&#xff0c;看是否能够找到适合自己的文章&#xff0c;希望能够做出来一个REST的小例子&#xff0c;万幸&#xff…

GB4208中规定的外壳防护等级IP

外壳防护等级IP 经常看到仪器设备的介绍中包括防护等级&#xff0c;例如IP67&#xff0c;IP50等&#xff0c;不同的防护等级到底对应的是什么级别的防护呢&#xff0c;国标GB4208中有明确的规定。现摘录相关的描述&#xff0c;供查看。

如何对linux文件进行编译,linux编译和执行命令都有哪些?该如何实现?

我们知道&#xff0c;Linux是比如手机、平板电脑、路由器、台式计算机计算机设备的核心&#xff0c;它们都使用着Linux系统。以现在来说&#xff0c;一个合格的开发者必须要对Linux有一定的了解&#xff0c;那么&#xff0c;下面就跟小编一起来看看Linux是如何编译及执行的吧。…

如何给虚拟机上的linux系统添加虚拟硬盘

From: http://www.ezloo.com/2008/03/vmware_linux.html 给vmware虚拟机上的linux系统添加一个虚拟硬盘&#xff0c;并对硬盘进行分区、格式化、给分区创建文件系统&#xff0c;实现挂载&#xff0c;自动挂载&#xff01; 步骤如下&#xff1a;保证你的linux系统处于关闭状态&a…

linux命令行打开写字板,在Linux操作系统中使用手写板

2009-07-28/14:24手写输入系统的出现拉近了大家与计算机之间的距离&#xff0c;使我们无须苦练输入法。此外&#xff0c;它也是绘画和平面设计爱好者手里的利器。Windows系统下使用手写板已经是司空见惯的事情了&#xff0c;但要在Linux中使用手写板呢&#xff1f;手写板和Linu…