STM32-OTA升级
一、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)执行用户的应用逻辑。如果条件被触发,引导加载程序将执行以下步骤:
-
擦除用户应用程序:引导加载程序会擦除当前存储的用户应用程序代码区域,确保该区域是空的,以便接受新的用户代码。
-
重新写入用户代码:引导加载程序从外部源(如串口通信、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的空闲周期作为传输结束的标志。
相关文章:

STM32-OTA升级
一、OTA(Over-The-Air) OTA(Over-The-Air)是一种通过无线通信方式,为设备分发新软件、配置甚至更新加密密钥的技术。它允许中心位置向所有用户发送更新,确保每个接收者都无法拒绝、破坏或改变这些更新&…...
一种JSON多态表示法
介绍 假设现在需要实现一种功能: 从某个远程的组件(消息队列或远程文件)拉取最后几条记录做一个展示. 需要支持如下的组件: Kafka RocketMQ OSS 假设还有很多, 这里不列了 … 显然, 每种组件需要的参数各不一样, 那么此时如何使用一个统一的结构来表达这些组件的参数呢?…...

C语言实现单链表
一、什么是单链表 1.链表就是一种在物理存储上各个节点非连续的,随机的,元素的逻辑顺序是通过链表中的指针链接的次序而实现的。 图示: 二、单链表中节点的定义 #include<stdio.h> #include<stdlib.h> #include<string.h>…...

循环神经网络三
一.介绍 在普通的神经网络中,信息的传递是单向的,这种限制虽然使得网络变得更容易学习,单在一定程度上也减弱了神经网络模型的能力。特别是在现实生活中,网络的输出不仅和当前时刻的输入相关,也过去一段时间的输出相关…...

优购电商小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,商品分类管理,商品信息管理,留言板管理,订单管理,系统管理 微信端账号功能包括:系统首页,商品信息…...

【ARM】v8架构programmer guide(4)_ARMv8的寄存器
目录 4.4Endianness(端序或字节序) 4.5 改变execution state 4.5.1 Registers at AArch32 4.5.2 PSTATE at AArch32 4.6 NEON 和浮点数寄存器 4.6.1 AArch64中浮点寄存器的组织结构 4.6.2 标量寄存器大小 4.6.3 向量寄存器大小 4.6.4 NEON在AArc…...
Java设计模式详细讲解
目录 设计模式概述 1.1 什么是设计模式1.2 设计模式的类型1.3 设计模式的历史与发展1.4 设计模式在软件开发中的重要性 创建型模式 2.1 单例模式2.2 工厂方法模式2.3 抽象工厂模式2.4 建造者模式2.5 原型模式 结构型模式 3.1 适配器模式3.2 装饰器模式3.3 代理模式3.4 外观模…...
图论------弗洛伊德(Floyd-Warshall)算法
题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的 T-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助…...
C#实现动画效果
在C#中,实现动画效果通常可以使用Windows Forms的Timer类或者使用System.Windows.Media.Animation命名空间下的类(如果是WPF应用)。以下是一个Windows Forms应用中使用Timer类来创建简单的动画效果的例子。 假设我们有一个窗体(F…...
Git 对比 SVN 的区别和优势
引言 版本控制系统(VCS)是软件开发过程中不可或缺的一部分,它们用于管理代码的变更、协调开发团队的工作。Git 和 SVN(Apache Subversion)是目前最流行的两个版本控制系统。本文将详细分析 Git 和 SVN 的区别及各自的…...
Qt实现无边框窗口的拖动和缩放
在使用QT创建窗体的时候,为了使窗口美化,通常不使用QT自带的边框。会调用下面函数去除窗体边框。 setWindowFlags(Qt::FramelessWindowHint) 但是有个问题,当去除了QT自带边框后,窗体就变得不能移动了,也不能改变窗口大…...

入门岛2-python实现wordcount并进行云端debug
书生大模型学习 任务: 1.实现一个wordcount函数,统计英文字符串中每个单词出现的次数。返回一个字典,key为单词,value为对应单词出现的次数。 2.Vscode连接InternStudio debug TIPS:记得先去掉标点符号,然后把每个单词…...

c语言-链表1
10 链表 一、链表是什么? -- 数据的一种存储方式 -- 链式存储 (1)线性存储 -- 地址连续 -- 自动开辟,自动释放 -- 默认是线性存储 (2)链式存储 -- 地址不连续…...

你好! Git——企业级开发模型
企业级开发模型(6) 一、删除远程分支,git branch -a (查看所有本地分支与远程分支)还能看到已经删除的分支,怎么解决?二、企业级开发流程2.1 企业级开发流程2.2 系统开发环境 三、Git分支设计模…...

力扣面试150 查找和最小的 K 对数字 最小堆 去重
Problem: 373. 查找和最小的 K 对数字 👨🏫 参考题解 class Solution {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {// 创建一个大小为 k 的结果列表,用于存储和最小的 k 个数对List<Li…...
Oceanbase 执行计划
test100 CREATE TABLE `test100` ( `GRNT_CTR_NO` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 担保合同编号, `GRNT_CTR_TYP` varchar(3) COLLATE utf8mb4_bin NOT NULL COMMENT 担保合同类型, `COLC_GRNT_IND` varchar(1) COLLATE utf8mb4_bin DEFAULT NULL …...

精品丨模型关系介绍
PowerBI中的模型关系相信小伙伴们都不会感觉到陌生,因为一份优秀的报表无法离开数据模型的支撑。 对比其它BI类工具而言,白茶认为其建模功能才是最为突出的功能点。 模型关系类型 PowerBI中我们常用的模型关系一共包含5类: 一对一关系(1:1) …...

CentOS7 配置 nginx 和 php 方案
配置方案 一、安装软件二、编写配置文件,连接PHP三、引用文件四、测试 鉴于网上教程错综复杂,写下一这篇文章 本教程只需要三步即可 一、安装软件 yum install -y nginx php php-fpm二、编写配置文件,连接PHP 一般情况下在安装完 nginx 后…...
Promise.all全面解析:使用方法与实战技巧
Promise是JavaScript中处理异步操作的重要机制,它提供了一种优雅的方式来处理异步回调,避免了传统回调地狱的问题。而Promise.all作为Promise的一个静态方法,更是在处理多个异步操作时发挥着关键作用。本文将全面解析Promise.all的使用方法&a…...
NLP从零开始------9文本进阶处理之文本相似度计算
1.文本相似度计算简介 在自然语言处理中,经常会涉及度量两个文本相似度的问题。在诸如对话系统和信息减速等中,度量句子或短语之间的相似度尤为重要。在新闻学传媒中应用文本相似度可以帮助读者快速检索到想要了解的报道。 文本相似度的定义式如下所示&a…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...