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,一经查实,立即删除!

相关文章

oracle 主键列创建自增长,powerdesigner创建oracle 数据库表,设置表主键列为自动增长。 ....

1 在表视图的列上创建。 双击表视图&#xff0c;打开table properties ———>columens &#xff0c; 双击要设置的列(显示列的序号的那个按钮&#xff0c;单击后&#xff0c;会显示横向的黑色箭头)。 打开column properties 对话框。在 ‘general’ 项中&#xff0c; 最下面…

嵌入式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; 运行消耗的…

域名解析

搭建网站&#xff1a;要将域名指向主机服务商提供的IP地址&#xff0c;请选择「A记录」&#xff1b;要将域名指向主机服务商提供的另一个域名&#xff0c;请选择「CNAME记录」。建立邮箱&#xff1a;需要设置「MX记录」&#xff0c;根据邮箱服务商提供的MX记录填写。A记录&…

【原创】最值得推荐wince应用和wince驱动入门书籍

作者&#xff1a;wogoyixikexiegliet应用方向&#xff1f; C&#xff0c;c#----------本人不做应用只知道用这两个语言用到&#xff0c;不敢推荐 -------也来补充一下。《PROGRAMMING MICROSOFT WINDOWS CE.NET》第三版英文原著Inside Windows CE - John Murray Programm…

oracle中错位函数,Oracle中的一些函数

select initcap(ename) from emp; 该语句能够使 ename 列的首字母大写。select concat(hello ,world) from dual; 该语句是hello 和 world 被连接起来 concat()select ename, substr(ename,-2,2) from emp; 该语句呢,这个substr(ename , -2 ,2 ) 我一直有个疑问 , 那就是 …

Bash数组操作教程

From: http://zengrong.net/post/1518.htm 一、定义数组 1. 使用[]操作符 ?View Code BASH1 2names[0]zrong names[1]jacky 2. 使用()直接赋值 ?View Code BASH1 2 3names(zrong jacky) # 或 names([0]zrong [1]jacky) 3. 使用declare -a定义数组。这种方法可以将一个空的…

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命令…

摄象机的格式发展史

大家可能都知道什么是摄象机&#xff0c;也可能经常听说各种各样的摄象机&#xff0c;什么&#xff0c;V8&#xff0c;D8&#xff0c;DV... ...在这么多陌生的名词中&#xff0c;你是否感觉到一 些迷茫&#xff0c;到底它们都代表着什么&#xff0c;到底里面有这怎样的一些门道…

Androd开发之广告栏设计

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

oracle数据库归档闪回,[Oracle]Oracle的闪回归档

Oracle的闪回归档场景需求&#xff0c;由于管理数据库的一些核心表&#xff0c;在实施初期会有人为误删除的问题。Oracle 11gR2提供了闪回归档的特性&#xff0c;可以保证不用RMAN来恢复误删除的数据。实践如下:1.创建一个公共的闪回表空间。用于各个业务模块都可以使用的闪回区…

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

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

终端乱码的终极解决方案

From:http://handao.blog.techweb.com.cn/archives/193.html 初入linux的程序员们&#xff0c;经常会受到乱码的问候。可谓“始乱终弃”。因为乱码&#xff0c;并且最终放弃了linux的不在少数。好吧&#xff0c;言归正传&#xff0c;先看看各类乱码是怎么形成的。 中文字符乱码…

锐捷官方提供122套实验题.

锐捷官方提供122套实验题.http://u.115.com/file/f058c9459e转载于:https://blog.51cto.com/lidai/430896

db2存储结构换Oracle,DB2中实现Oracle的功能

1.如何实现分页显示的Oracle和DB2的写法Oracle 可以这样实现﹕SQL>select rownum,* from BSEMPMS where rownum >5 and rownum <100;DB2 可以这样实现﹕select * from (select ROW_NUMBER() over() as a, db2admin.bsempms.* fromdb2admin.bsempms) as temp where a&g…

iOS中assign、copy 、retain等关键字的含义

assign&#xff1a; 简单赋值&#xff0c;不更改索引计数copy&#xff1a; 建立一个索引计数为1的对象&#xff0c;然后释放旧对象retain&#xff1a;释放旧的对象&#xff0c;将旧对象的值赋予输入对象&#xff0c;再提高输入对象的索引计数为1 Copy其实是建立了一个相同的对象…

公布生成cscope.out, cscope.files, tags的脚本文件

通过VIM搭建一个IDE&#xff0c;网上的文章有很多&#xff0c;这里就不献丑了。 下面记录下生成tags&#xff0c;cscope.out&#xff0c; cscope.files的脚本文件 一、windows版本(.bat) del cscope.out cscope.files tags echo del "cscope.out cscope.files tags&qu…