STM32 IAP 在线升级原理全解析

article/2025/8/29 20:06:52



点击左上角的“关注”,定期更新 STM32 最新资讯,总有你想要的信息!

STM32 IAP 在线升级原理全解析


1. 什么是 IAP?

   IAP(In-Application Programming)是用户自己的程序在运行过程中对 User Flash 部分的区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信接口对产品中的固件程序进行更新升级。

2. 当无 IAP 功能时 STM32 程序的启动过程

在这里插入图片描述

图1 无 IAP 功能时 Flash 的存储分布图

  STM32F4 基于 Cortex-M4 内核。对于基于 Cortex-M3/M4 内核的芯片,复位后固定从 0x00000000 地址处取主堆栈指针(MSP)的值,从 0x00000004 处,取出 PC 的初始值(这个值是复位向量),然后从这个值对应的地址处取出复位中断入口向量,跳转执行复位中断服务程序,当运行完复位中断服务程序后再跳转到 main 函数执行应用程序。

// 中断向量表:
__Vectors       DCD     __initial_sp             ; Top of StackDCD     Reset_Handler            ; Reset Handler // 复位中断入口向量DCD     NMI_Handler              ; NMI HandlerDCD     HardFault_Handler        ; Hard Fault Handler......// 复位中断服务函数:
; Reset handler
Reset_Handler    PROCEXPORT  Reset_Handler             [WEAK]IMPORT  SystemInitIMPORT  __mainLDR     R0, =SystemInitBLX     R0LDR     R0, =__main		// 执行 main() 函数BX      R0ENDP

  那为什么图 1 显示的栈顶指针是指向 0x08000000 地址呢?
  原来 STM32 在 0x00000000 开始的一段地址空间是虚拟的,用户可以通过设置 BOOT[0:1] 引脚状态使其在启动时动态的将另外一段地址空间映射到这部分的地址上去。我们通过配置 BOOT 引脚选择主 flash 的自举模式,将 0x08000000 地址处的存储空间重映射到了 0x00000000 地址处,所以 0x08000000 地址和 0x00000000 地址处开始的存储空间是同一块物理空间,其内容也就是一样的了。

在这里插入图片描述

图2 0x00000000 地址数据和 0x08000000 地址数据对比图

在这里插入图片描述

图3 BOOT 引脚自举配置

3. 当有 IAP 功能时 STM32 程序的启动过程

在这里插入图片描述

图4 有 IAP 功能时 Flash 的存储分布图

  当 STM32 要实现 IAP 在线升级功能时,需要把 flash 分成 bootload 程序区和应用程序区。我们将 bootload 程序存放在 flash 的起始地址,这样 STM32 上电后就会先执行 bootload 程序。然后我们只需要在 bootload 程序中将程序跳转到应用程序的栈顶地址,则 STM32 就会开始执行应用程序的代码。

4. 在 bootload 层申请的动态内存不释放会影响到应用层吗?

在这里插入图片描述

图5 RAM的存储分布图

  答案是不会。当从 bootload 程序跳转到应用程序的起始地址后,应用程序会重新分配和初始化 RAM,所以 bootload 程序在进入应用程序前不需要担心申请的动态内存没有释放会对进入应用程序后产生什么影响的。

5. 在 bootload 层开启的外设会影响应用层吗?

  答案是会!在 bootload 程序开启的外设进入应用程序后是不会自动重置外设的。比如说在 bootload 程序开启了 UART1 外设,在跳转到应用程序后,UART1 依旧是 bootload 程序时的配置。所以在 bootload 程序想进入应用程序前,要先关闭外设中断和重置外设,以免在应用程序中无法正常的开启外设。

6. IAP 在线升级原理

在这里插入图片描述

  IAP 在线升级的原理很简单,先通过通信接口(串口)连接上位机与 STM32 设备,然后上位机通过传输协议(Ymodem)把升级固件(应用程序 bin 文件)发送给 STM32 设备,STM32 设备收到升级固件后将其烧录进应用程序区的 flash 地址。在烧录完所有升级固件后,再将程序跳转到应用程序的 flash 起始地址,开始执行应用程序的代码。


大家的支持就是我分享技术的动力,希望大家需转载时能附上原作者的博客:https://blog.csdn.net/u012993936,谢谢。



--- End ---

你可能还想看:

> STM32 IAP 在线升级项目实例剖析
> 免费的Zigbee抓包神器!比Ubiqua还好用!


文章都看完了,随手点个赞吧~
在这里插入图片描述
↓↓↓ ↓↓↓


http://chatgpt.dhexx.cn/article/kiQts44O.shtml

相关文章

ESP8266实现在线升级OTA

今天总结一下我实现ESP8266实现在线升级(OTA)的经验 关于理论介绍我这里不多讲,大家可以参考以下文章: 1.一个网友总结的经验(我这篇文章主要也是对该文章做进一步补充):https://www.cnblogs.c…

stm32在线升级方案

目录 下载固件流程: Bootloader程序设计流程 普通工程改为APP工程的步骤 背景:当嵌入式软件需要固件升级时,有时需要拆卸设备,较为麻烦,为方便升级,提供远程升级的功能,可通过网络或其他通讯…

串口在线升级步骤

串口在线升级步骤 一、查看工程文件的Config.h 二、确定本地地址和目标地址 三、打开在线升级工具 四、配置串口参数 串口配置可以波查询代码与PC通讯的UART设置的参数。 五、填写本机地址和目标地址 本机地址为0xf3 243 主板目标地址为0xf5 245 PMT板目标地址为0x13 19 …

mariadb数据库在线升级版本

mariadb----在线版本升级 我之前的数据库版本号是5.5 一:备份数据库和数据库配置 mysqldump -u root -p --all-databases > /home/mydb.sql mv /etc/my.cnf /etc/my.cnf.bak 二:添加mariadb yum库 vim /etc/yum.repos.d/MariaDB.repo [mariadb] na…

FPGA远程固件在线升级

FPGA远程固件在线升级 1.摘要 对最近做的FPGA远程更新/在线升级做一个总结。一般在代码开发阶段,我们使用JTAG烧写代码,但当产品投入到实际使用过程中,难以再用JTAG进行固件更新。所以需要开发远程/在线更新的功能,即使用产品自…

固件在线升级流程

从事硬件开发,为了方便维护,免不了对模块进行固件升级,所以对于固件升级,简单整理了一下完整的在线升级的实现思路,该思路适用于所有带通讯总线的模块。 需要注意的是,需要额外的上位机配合。 下位机在线…

php 在线升级

php 在线升级 功能 目前已修改为通用解决方案 点击下方链接下载 此为最新优化过的版本 之后的贴图 说明 仅用来做思路参考 我就不再修改了 下面是思路解析思路一思路二升级程序服务器检测版本至此整个升级程序已经结束 感谢大家参考有任何问题都可以直接联系我咨询 一定不吝赐教…

软件在线升级系统设计

需求描述 一直用Qt开发PC版本的程序,常用的方法都是打包发布。目前开发的程序比较复杂,涉及到上百个独立的进程以及4000多个相关文件,采用原来的打包发布就变得很麻烦,第一改动比较频繁,打包次数过多;第二…

Nginx在线升级

1、查看当前nginx版本,nginx -v(小写v) 2、下载最新版本nginx包,nginx-1.23.1.tar.gz 3、解压tar -zxvf nginx-1.23.1.tar.gz 4、进入解压目录cd nginx-1.23.1.tar.gz 5、查看nginx当前配置,nginx -V注意这里是大写…

在线升级:OTA升级的原理和实现方式

目录 1、OTA 在线升级 2、实现方式 3、操作方式 3.1、后台式升级 3.2、非后台式式更新 4、STM32 的在线升级 4.1、划分 Flash 区域 4.2、实操1 - Flash空间地址的划分 4.3、实操2 - 设置工程 4.4、实操3 - 接收固件更新包 4.5、实操4 - 拷贝程序至Flash 4.6、实操5 - 跳转至 Ap…

halcon 彩色图转灰度图

read_image (Image, jiao1.bmp) //读取图像 get_image_size (Image, Width, Height) //获取宽高 dev_close_window () //关闭图形窗口 rgb1_to_gray (Image, GrayImage) //彩色图转灰度图 dev_open_window (0, 0, Width, Height, black, WindowHandle) //打开图形窗口 d…

Python中使用PIL快速实现灰度图

效果 原图 效果图 实现 新建文件夹grayImage,在此文件夹下新建gray.py from PIL import Image imgImage.open(1111.jpg) imgimg.convert(L) img.save(灰度图.jpg) 其中1111.jpg是原图,将其放在同目录下。 运行即可。 源码以及资源下载 https://do…

计算机灰度分析,计算机中的256级灰度图像

【建议1】使用GltraEdit软件观察字符“((Z20享有声望的学校联盟)”的内部代码. 以下说法正确 A. 字符“(”的内部代码占用两个字节 B. 字符“ Lian”的代码值的二进制表示形式是11010001 10101010 C. 图片中有5个ASCⅡ字符,其中字符“ 2”的代码值的十六进制表示为32 D. 字符“…

C++-灰度图上色GrayToColor

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 场景需求 最近有客户提出,想要将解包裹图像转化为有颜色的图像,具备更佳的视觉效果。解包裹图是一个floa…

灰度图与二值化

图像处理的灰度化和二值化 在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue),即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分量的…

opencv学习5:cvtColor RGB图像转灰度图像原理

简介 将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、…

Matplotlib显示灰度图

引言 matplotlib中的imshow()函数不能自动显示灰度图像,这一点应该是众所周知的,需要调用cmap“gray"以进行设置,但是cmap"gray"实际上并不是如opencv中的imshow函数一样将单通道图显示为灰度图,私以为是引入了灰度…

python显示灰度图像,Python读取图像并显示灰度图的实现

python读取图像 原图: import cv2 # 利用opencv读取图像 import numpy as np # 利用matplotlib显示图像 import matplotlib.pyplot as plt img cv2.imread("./lena.png") #读取图像 # 显示图像 plt.imshow(img) plt.axis(off) plt.show() 效果: 问&#…

OpenCV灰度图

什么是灰度图&#xff1a; 百度百科 什么是灰度图 #include <opencv2/opencv.hpp> #include <iostream>using namespace cv; using namespace std;int main(int argc, char** argv) {Mat src Mat(4,4,CV_8UC3,Scalar(28,128,228));cout << src << en…

RGB图像转化为灰度图原理

RGB图像转化为灰度图原理 1 原理 利用MATLAB对RGB图像进行读取&#xff1a; imgimread(蒙娜丽莎.jpg);可以知道存储RGB图像数据为 256 256 3 u i n t 8 256\times256 \times3\quad uint8 2562563uint8&#xff0c;其中 256 256 256\times256 256256表示长和宽的像素个数&…