STM32-OTA升级

news2024/12/28 4:14:24

一、OTA(Over-The-Air)

        OTA(Over-The-Air)是一种通过无线通信方式,为设备分发新软件、配置甚至更新加密密钥的技术。它允许中心位置向所有用户发送更新,确保每个接收者都无法拒绝、破坏或改变这些更新,并且能够即时将更新应用到所有设备上。OTA升级适用于通过网络或蓝牙等无线通信方式进行,使得设备管理更加便捷和灵活,同时提升了系统的安全性和可维护性

在OTA固件升级中,单区模式和双区模式是两种常见的策略,各自有着特定的优缺点。

1)单区模式

        单区模式,整个升级过程仅使用一个存储区(通常是Bank0)。升级流程包括先擦除当前运行的老固件,然后直接将新固件下载到同一存储区,并对其进行有效性校验。这种模式优点在于节省Flash空间,实现简单直接,适用于资源有限的设备。然而,其缺点是风险较高,一旦升级失败或新固件不可用,设备可能会无法正常运行,需要外部干预才能恢复。

2)双区模式

        双区模式,老固件和新固件分别存储在不同的存储区(通常是Bank0和Bank1)。升级过程先将新固件下载到预留的下载区(Bank1),然后进行校验。校验通过后,系统进入Bootloader模式,将新固件从下载区复制到主运行区(Bank0),替换老固件。这种模式的优势在于安全可靠,即使升级失败,系统仍能回滚到之前的稳定版本,避免系统故障。它也提供了更高的灵活性,允许设备在升级过程中同时运行两个固件版本,确保平稳过渡。不过,双区模式需要额外的Flash空间来支持两个固件版本的存储,因此对资源的需求较高。

二、IAP(In Application Programming)

        IAP(In Application Programming,即在应用中编程),旨在实现用户应用程序的动态更新,而无需使用专门的编程工具或硬件。一般情况下,STM32芯片的代码区域只存放一个用户程序。通过使用IAP方案,可以将代码区域划分为两部分:一个是固定的引导加载程序(bootloader),另一个是用户应用程序(user application)。如图所示

在单片机上电时,系统首先进入引导加载程序(bootloader)。引导加载程序会检测预设的条件,例如检测按键是否按下、是否接收到特定的串口数据、或者U盘是否插入等。如果条件未被触发,引导加载程序将直接跳转到用户应用程序(user application)执行用户的应用逻辑。如果条件被触发,引导加载程序将执行以下步骤:

  1. 擦除用户应用程序:引导加载程序会擦除当前存储的用户应用程序代码区域,确保该区域是空的,以便接受新的用户代码。

  2. 重新写入用户代码:引导加载程序从外部源(如串口通信、USB设备等)接收新的用户应用程序数据,并将其写入到之前擦除的用户代码区域中。

三、FLASH地址分配

 1)普通程序的内部FLASH分配

        此时普通的应用程序占据内部Flash的大部分空间,包括主要的应用逻辑和功能代码。整个应用程序共享一个中断向量表,用于存储每个中断的入口地址,供所有的中断服务例程使用。

2)IAP方案的内部FLASH分配

        IAP方案在内置Flash的特定地址范围内增加了一个Bootloader程序。Bootloader的主要功能是通过串口或其他通信接口来更新或烧录用户应用程序。Bootloader程序有自己独立的中断向量表,专门处理引导过程中的中断和异常情况。用户应用程序仍然占据内部Flash的一部分空间,但更新和烧录可以通过Bootloader完成,而非传统的编程器。用户应用程序也有自己的中断向量表,确保在运行时正确处理中断事件。

3)示例

设置两个工程:Bootloader程序、UserApplication程序。以下是详细的设置说明:

        1)BootLoader程序

        Bootloader程序被安排在内部FLASH的第一页,起始地址为 0x0800 0000,占用20KB空间,地址范围从0x0800 0000到0x0800 4C00(页号0至19)。在执行跳转到UserApplication之前,需确保Bootloader关闭所有打开的中断或外设,以避免影响UserApplication的运行。

        2)UserApplication程序

        UserApplication程序从内部FLASH的第二页开始,起始地址为0x0800 5000,占用43KB空间,地址范围从0x0800 5000到0x0800 F800(页号20至62)。

        3)UserData

        内部FLASH的最后一页被保留用于UserData,占用1KB空间,起始地址为0x0800 FC00,页号为63。

如图所示:

第一页

最后一页

分区

容量

地址

页号

地址

页号

BootLoader

20KB

0800 0000

0

0800 4C00

19

UserApplication

43KB

0800 5000

20

0800 F800

62

UserData

1KB

0800 FC00

63

        4)生成UserApplication的bin文件

D:\Keill_v5\ARM\ARMCLANG\bin\fromelf.exe --bin Objects\Project.axf -o Project.bin
  • "D:\Keill_v5\ARM\ARMCLANG\bin\fromelf.exe" 是 fromelf.exe 工具的完整路径,根据实际情况需要修改成本地的路径。
  • Objects\Project.axf 是工程生成的 .axf 文件的路径和文件名,确保路径是正确的,可以根据实际情况进行调整。
  • -o Project.bin 指定生成的输出文件名为 Project.bin,可以根据需要修改输出文件名和路径

四、STM32启动流程概述

1)普通程序启动流程:
1. 内核初始化

 1)内核复位和NVIC寄存器部分清零

  • 在复位时,内核和NVIC相关寄存器被清零,确保系统处于可控状态。

2)设置堆栈

  • 内核从向量表的起始地址读取堆栈指针(SP_main),设置主堆栈指针(SP)。

3)设置PC和LR寄存器

  • PC寄存器被设置为复位中断向量的地址,LR寄存器通常设置为0xFFFFFFFF(复位值)。
2. 执行复位中断处理函数(Reset_Handler)

1)强制PC指针指向中断向量表的复位中断向量

  • 单片机的硬件会将PC指针自动定位到复位中断向量表的复位中断向量处,开始执行Reset_Handler函数。

2)Reset_Handler中的初始化步骤

  • 在Reset_Handler函数中,会调用SystemInit函数进行系统的初始化,包括时钟设置和中断向量表配置等。
3. 初始化全局/静态变量和重定位

1)调用 __main 函数

  • __main 函数由编译器生成,负责初始化全局/静态变量、执行重定位工作,并最终跳转到用户定义的main函数。
4. 跳转到main函数执行用户代码
  • 在所有初始化工作完成后,控制权被传递给用户编写的main函数,开始执行用户程序的主体逻辑。
2)引导加载程序启动流程:
1)内核初始化
  • 复位时,内核和NVIC寄存器被清零。
  • 设置堆栈和初始化PC、LR寄存器。
2)执行引导加载程序的复位中断处理函数(Bootloader Reset_Handler)
  • 硬件将PC指针定位到引导加载程序的复位中断向量处,开始执行引导加载程序的Reset_Handler函数。
  • 引导加载程序的初始化步骤,可能包括初始化引导加载程序自身的硬件资源和配置。
3)初始化全局/静态变量和重定位
  • 引导加载程序调用 __main 函数进行全局变量的初始化和重定位工作。
4)等待指令或判断是否需要进行IAP
  • 引导加载程序可能等待外部触发条件,如特定按键组合、串口指令等,来决定是否启动IAP流程。
5)启动固件更新(IAP过程)
  • 如果需要进行固件更新,引导加载程序会初始化相关硬件接口(如串口、USB等)以及存储器(如Flash)接口。
  • 下载新固件数据,对数据进行校验(CRC校验等)确保完整性。
6)擦除原有固件区域
  • 引导加载程序可能需要先擦除原有固件存储区域,以便存储新的固件数据。
7)写入新固件
  • 将通过IAP方式下载的新固件数据写入到目标Flash存储器中的指定位置。
8)校验和完成
  • 写入完成后,引导加载程序进行最终的校验,确保固件写入的正确性和完整性。
9)系统重启
  • 如果固件更新成功,引导加载程序可能会进行系统的最后配置和清理工作。
  • 然后重启系统,跳转到新固件的起始地址执行。
10)跳转到新固件执行
  • 控制权转移给新固件的Reset_Handler函数,开始执行新固件的初始化和主逻辑。

五、注意事项

        在下载bin文件的过程中,确保数据帧的完整性至关重要。一般情况下,串口使用空闲中断来判断数据帧是否传输结束。但在大量数据传输时,可能会出现空闲中断误判的情况。为了解决这个问题,可以考虑使用类似RS485通信的方式,通过定时器定时触发来确定数据传输的结束标志,例如设定一个100ms的空闲周期作为传输结束的标志。

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

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

相关文章

C# Unity 面向对象补全计划 设计者模式 之 单例模式

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识,看不懂没关系 了解我的专栏C#面向对象与进阶:http://t.csdnimg.cn/mIitr,尤其是关于类的那篇文章即…

电脑屏幕录屏,5个技巧,精准捕捉!

电脑屏幕录屏已经成为了一种常见的行为,无论在工作还是生活中都发挥了重要作用。然而,对于许多人来说,如何进行电脑屏幕录屏可能仍然是一个谜团。 从选择合适的录屏软件到了解录制的技巧,都是需要探索和学习的内容。在这篇文章中…

数据库|SQLServer数据库:模糊查询的三种情况

哈喽,你好啊,我是雷工! 就是字面意思,当数据库的查询条件并不是十分具体时就用到模糊查询,比如查询姓氏为雷的人名,就需要从姓名列模糊查询。 01 like关键字查询 当使用like关键字进行查询时,字…

国央企如何提高监管数据报送效率?

最新动向 近日,国家层面高度重视清理拖欠民营企业账款的问题,并出台了一系列相关政策,要求国有企业在偿还债务方面发挥示范作用。近期发布的报告强调了优化民营经济发展环境的重要性,并提出了六大重点工作,其中包括修…

50etf期权行权采用什么交割方式 ?

50ETF期权是欧式期,要到期日当天才能行权交制,其交割方式是实物交割买卖双方在到期行权日时需要准备一手交钱,一手收货或是一手交,一手收钱,如果持有期权到达到期日之前,投资者认为行权并不划算&#xff0c…

python.tkinter设计标记语言(语法2-语法解析器)

TOC 前言 本文只作为笔记记录。 TinText开源地址:https://github.com/Smart-Space/TinText 语法解析器 从前文可以看到,新的Tin标记语言非常简单,即便是加入嵌套关系,也只是标签级别做个标记就行了。(在写这篇文章…

【Python机器学习】回归——局部加权线性回归

线性回归有一个问题就是有可能出现过拟合现象,因为它求的是具有最小均方误差的无偏估计。如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。 其中一个方法就是局部加权线性回归(LWLR…

学习记录——day27 进程间通信 IPC通信机制 消息队列 共享内存

目录 一、IPC通信机制 1、system V提供了三种IPC(interprocess communication)进程间通信方式 消息队列 共享内存 信号量集 2、该通信机制是独立于进程而存在的:当进程将数据写入该通信对象中后,即使进程已经结束,对象中保存的…

吴恩达机器学习COURSE1 WEEK2

COURSE1 WEEK2 多维特征 在线性回归中,往往特征不止一个,而是具有多维特征 例如,在预测房价的例子中,我们知道更多的信息: x 1 x_1 x1​:房屋的面积 x 2 x_2 x2​:卧室的数目 x 3 x_3 x3​&a…

【嵌入式】常用英文缩写及单词整理

目录 嵌入式常用英文缩写及单词整理1. 缩写部分2. 词汇部分3. 语句部分4. 调试部分5. 结束语相关文章: 嵌入式常用英文缩写及单词整理 1. 缩写部分 缩写全称翻译AADCAnalog-to-Digital Converter模/数转换器,模数转换器ADUApplication data unit应用数…

KBEngine ue5

前言 最近在试 KBEngine 的 ue4 项目,它在 ue4 下能够正常编译使用,但是现在都已经进入 ue5 时代,那么能不能将现有工程移到 ue5 下呢? 使用 ue5 打开工程的报错处理 1、DefaultBuildSettings BuildSettingsVersion.V5; kbeng…

python.tkinter设计标记语言(渲染2-渲染器)

TOC 前言 本文仅作为笔记记录。 在前文中&#xff0c;我们通过标记意义解释生成了带有明确渲染要求的参数组&#xff0c;以<title>为例&#xff0c;我们获取了title, level两个明确的渲染标记&#xff0c;这一部分由Tin标记解释器完成&#xff0c;不需要编写者花费过多…

亚马逊、eBay、沃尔玛等海外跨境电商测评自养号的技术解决方案

随着跨境电商的蓬勃发展&#xff0c;卖家们对于提升店铺流量、销量以及产品评价的需求日益迫切。在这一背景下&#xff0c;海外跨境电商测评成为了一个备受瞩目的领域。作为一家专注于此领域的技术型公司&#xff0c;凭借其深厚的技术积累和丰富的实战经验&#xff0c;为卖家们…

supermap制作发布二三维地图服务

一、下载安装 软件版本&#xff1a; SuperMap iDesktopX 11i(2023) SP1 for Windows SuperMap iServer 11i(2023) SP1 for Windows 下载地址&#xff1a; http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx 二、运行 服务端&#xff1a;双击iserver的…

HTML学习笔记——用HTML记录学习过程4——非主体结构元素

非主体结构元素主要是为了表达逻辑结构或者附加信息的元素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>非主体结构元素</title> </head> <body> <header><h1>head…

大模型落地应用架构的一种模式

经过几个月的实践和探索&#xff0c;看过也经历过一些成型的项目了&#xff0c;如果是奔着落地去的&#xff0c;我们的目光不能只盯着大模型本身&#xff0c;而应该放眼甚至是需要投入精力去建设很多我们别的工作上。 本文&#xff0c;着重讲的是&#xff0c;我的理解下现实成…

「实战应用」着色器对图表控件LightningChart的影响及应用

LightningChart完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科学&am…

PySide入门实战之五 | 信号与槽函数之鼠标、键盘等事件

&#x1f680;&#x1f680;&#x1f680; Pyside6实战教程专栏目录入口&#xff1a;点击跳转 目录 一、前期准备二、鼠标触发事件鼠标拖动窗口 一、前期准备 我们采用Pyside入门实战之四中通过QTDesigner创建的界面&#xff0c;具体由两个Label和一个Button组件构成&#xff…

【图书推荐】《数据资产管理核心技术与应用》

内容简介 《数据资产管理核心技术与应用》深入探讨数据资产管理的核心技术与应用&#xff0c;融入作者在大数据领域多年的丰富经验。《数据资产管理核心技术与应用》为读者提供一套可以落地的数据资产管理框架&#xff0c;并详解两个基于该框架进行数据资产管理的应用案例&…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-09 ICMP层程序设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…