【STM32】IAP升级 预备知识

IAP(In Application Programming)简介

Flash够大的情况下,上电后的程序通过修改 MSP 的方式,可以在一块Flash上存在多个功能差异的程序。

IAP是为了在执行正常功能前,为了升级功能,提前运行的一段程序。这个程序不执行正常的功能操作,而只是通过某种通信方式(如 USB、USART)接收程序或数据,执行对第二部分代码的更新;
1)检查是否需要对第二部分代码进行更新
2)如果不需要更新则转到 4)
3)执行更新操作
4)跳转到第二部分代码执行

第一部分称为bootloader程序,第二部分称为APP。可以有多个APP,STM的APP可以运行在Flash或者SRAM中

STM32的启动模式

单片机复位

从0x0000 0000启动

单片机的复位方式有3种:上电复位,硬件复位,软件复位

且离开复位状态后,CM4 内核做的第一件事就是读取下列两个 32 位整数的值
在这里插入图片描述
1、从地址 0x0000 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址
2、从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值,该值指向复位后执行的第一条指令

既然这里说stm32都是从0x0000 0000 开始启动的,那为什么我们看到的启动模式是从0x0800 0000,0x2000 0000,0x1FFF F000开始启动呢?

将 0x0000 0000 和 0x0000 0004 两个的地址重映射到其他地址空间,就是启动模式选择。这样访问0x0000 0000就相当于访问0x0800 0000,0x2000 0000或者0x1FFF F000

重映射也就是"启动模式选择"

STM32的启动方式(自举模式)有3种:内部 FLASH内部 SRAM系统存储器
在这里插入图片描述
注:启动引脚的电平:0:低电平;1:高电平;x:任意电平,即高低电平均可

FLASH 启动方式:么内核会从地址 0x0800 0000 处取出堆栈指针 MSP 的初始值,从地址 0x0800 0004 处取出程序计数器指针PC 的初始值。CPU 会从 PC 寄存器指向的地址空间取出的第 1 条指令开始执行程序,就是开始执行复位中断服务程序 Reset_Handler。也就是开始执行中断向量表。

内部 SRAM 启动方式:地址0x00000000 和 0x00000004 被映射到内部 SRAM 的首地址0x20000000 和 0x20000004,内核从SRAM 空间获取内容进行自举。在实际应用中,由启动文件 starttup_stm32f407xx.s 决定了0x00000000 和 0x00000004 地址存储什么内容,链接时,由分散加载文件(sct)决定这些内容的绝对地址,即分配到内部 FLASH 还是内部 SRAM。

系统存储器启动方式:内核将从系统存储器的 0x1FFFF000及 0x1FFFF004 获取 MSP 及 PC 值进行自举。系统存储器是一段特殊的空间,用户不能访问,ST 公司在芯片出厂前就在系统存储器中固化了一段代码。因而使用系统存储器启动方式时,内核会执行该代码,该代码运行时,会为 ISP(In System Program)提供支持,在 STM32F4 上最常见的是检测 USART1 传输过来的信息,并根据这些信息更新自己内部 FLASH 的内容,达到升级产品应用程序的目的,因此这种启动方式也称为 ISP 启动方式。

中断向量表

在这里插入图片描述
stm32的flash内存起始于0x0800 0000,基于 Cortex-M3/M4 内核的微控制器时,其内部通过一张“中断向量表”来响应中断。

中断向量是地址(指向中断服务函数),程序启动后,将首先从“中断向量表”取出复位中断向量的地址,执行复位中断程序完成启动,而这张“中断向量表”的起始地址是 0x0800 0004,当运行中中断来临,STM32的内部硬件机制亦会自动将 PC 指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。

加入IAP程序之后,程序运行流程

在这里插入图片描述

复位后执行Reset_Handler后进入IAP升级程序

加入IAP升级程序之后,单片机复位之后,还是从 0x08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序(Reset_Handler在这个函数中初始化时钟系统等)。在运行完复位中断服务程序之后跳转到 IAP 的 main 函数:

①复位后,从 0x08000004 地址取出复位中断向量的地址并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到 IAP 的 main 函数。

执行IAP函数

将APP程序写入指定的flash地址。

执行APP程序的Reset_Handler

执行完IAP程序之后,进入APP函数的中断向量表取出新程序的复位中断向量的地址。并跳转执行APP程序的复位中断服务程序,随后跳转至APP程序的 main 函数

此时STM32F407的FLASH,在不同位置上,共有两个中断向量表。

APP函数执行过程中,如果 CPU 得到一个中断请求,PC 指针仍然会强制跳转到地址0x08000004 中断向量表处,而不是新程序的中断向量表,如图标号④

程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中如图标号⑤。

IAP程序设置条件

新程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始;
新程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始;

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

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

相关文章

微软在Windows 11推出Copilot,将DALL-E 3集成在Bing!

美东时间9月21日,微软在美国纽约曼哈顿举办产品发布会,生成式AI成为重要主题之一。 微软表示,Copilot将于9月26日在Windows 11中推出;Microsoft 365 Copilot 将于11 月1日向企业客户全面推出;将OpenAI最新的文本生成图…

C# OpenCvSharp 图片模糊检测(拉普拉斯算子)

效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Windows.Forms.VisualStyl…

二叉树层序遍历及判断完全二叉树

个人主页:Lei宝啊 愿所有美好如期而遇 目录 二叉树层序遍历: 判断完全二叉树: 二叉树层序遍历: 层序遍历就是一层一层,从上到下遍历,上图遍历结果为:4 2 7 1 3 6 9 思路: 通过队列来实现层序…

vue下载Excel文件

前端vue实现导出Excel文件 用到的是 上代码 var wb XLSX.utils.table_to_book(document.querySelector(#my-table));//关联dom节点 这个是表格绑定的id名称var wbout XLSX.write(wb, {bookType: xlsx,bookSST: true,type: array})try {FileSaver.saveAs(new Blob([wbout], {…

Win10专业版开启远程桌面

Win10专业版开启远程桌面 方法一: 一、按“Win R”键,然后输入“sysdm.cpl”并按下回车键打开系统属性。 二、选择“远程”选项卡,在远程桌面中勾选“允许远程连接到此计算机”就可以开启远程桌面; 方法二: 一、打…

Mybatis 映射器与XML配置职责分离

之前我们介绍了使用XML配置方式完成对数据的增删改查操作,使用此方式在实际调用时需要使用【命名空间.标签编号】的方式执行,此方式在编写SQL语句时很方便,而在执行SQL语句环节就显得不太优雅;另外我们也介绍了使用映射器完成对数…

杂记 | 使用gitlab-runner将python项目以docker镜像方式流水线部署到服务器(解决部署缓慢和时区不对的问题)

文章目录 01 需求背景1.1 需求1.2 步骤 02 编写BaseDockerfile2.1 编写2.2 说明2.3 执行 03 编写Dockerfile04 编写.gitlab-ci.yml05 项目结构 01 需求背景 1.1 需求 我有一个python项目,该项目可能是一个服务器监控程序,也可能是一个后端程序&#xf…

ChatGLM GPT原理介绍

图解GPT 除了BERT以外,另一个预训练模型GPT也给NLP领域带来了不少轰动,本节也对GPT做一个详细的讲解。 OpenAI提出的GPT-2模型(https://openai.com/blog/better-language-models/) 能够写出连贯并且高质量的文章,比之前语言模型效果好很多。GPT-2是基于Transformer搭建的,相…

使用 PyTorch 的计算机视觉简介 (1/6)

一、说明 Computer Vision(CV)是一个研究计算机如何从数字图像和/或视频中获得一定程度的理解的领域。理解这个定义具有相当广泛的含义 - 它可以从能够区分图片上的猫和狗,到更复杂的任务,例如用自然语言描述图像。 二、CV常见的问…

Python类练习

文章目录 题目要求步骤 题目要求 1)创建一个 Kid 类,包含姓名,性别,年龄属性和 play 方法 2) 创建一个 Stu 类,继承 Kid 类,同时包含成绩属性,获取成绩方法,努力学习方法,play方法&…

Java笔记:看清类加载过程

1 类加载的过程 1.1 加载 “加载”是“类加载”(Class Loading)过程的第一步。这个加载过程主要就是靠类器实现的,包括用户自定义类加载器。 加载的过程 在加载的过程中,JVM主要做3件事情 1)通过一个类的全限定名来获取定义此类的二进制字节…

Latex Overleaf 写作问题记录

Latex & Overleaf 写作问题记录 公式换行及排列整齐 \begin{equation} \begin{split}Y & a1\\&b2 \end{split} \end{equation}顶格 \noindent求和符号 求和符号(上下限上下排列) \sum\limlits求和符号(上下限右边排列&#…

一键集成prometheus监控微服务接口平均响应时长

一、效果展示 二、环境准备 prometheus + grafana环境 参考博文:https://blog.csdn.net/luckywuxn/article/details/129475991 三、导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter

《Playing repeated games with Large Language Models》全文翻译

《Playing repeated games with Large Language Models》- 使用大型语言模型玩重复游戏 论文信息摘要1. 介绍2. 相关工作3. 一般方法4. 分析不同游戏系列的行为5. 囚徒困境5.1 性别之战 6. 讨论 论文信息 题目&#xff1a;《Playing repeated games with Large Language Model…

QT:使用堆叠窗口、标签、下拉条

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QStackedWidget> //堆叠窗口 #include <QComboBox> //下拉条 #include <QLabel> //标签class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *p…

JavaScript的Web Worker

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript的Web Worker⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量…

算法通过村第七关-树(递归/二叉树遍历)白银笔记|递归实战

文章目录 前言1. 深入理解前中后序遍历从小到大递推分情况讨论&#xff0c;明确结束条件组合出完整的方法&#xff1a;从大到小 画图推演 总结 前言 提示&#xff1a;没有客观公正的记忆这回事&#xff0c;所有的记忆都是偏见&#xff0c;都是为自己的存活而重组过的经验。--国…

pytest简明教程

1. 简介 pytest是一款基于Python的测试框架。与Python自带的unittest相比&#xff0c;pytes语法更加简洁&#xff0c;断言更加强大&#xff0c;并且在自动测试以及插件生态上比unittest都要更加强大。 1.1. 安装pytest pip install pytest1.2. pytest命名规则 pytest默认会…

【MATLAB第77期】基于MATLAB代理模型算法的降维/特征排序/数据处理回归/分类问题MATLAB代码实现【更新中】

【MATLAB第77期】基于MATLAB代理模型算法的降维/特征排序/数据处理回归/分类问题MATLAB代码实现 本文介绍基于libsvm代理模型算法的特征排序方法合集&#xff0c;包括&#xff1a; 1.sing 2.adaboost 3.corr 4.svmrfe_ker 5.svmrfe_ori 1.sing 十折交叉取平均错误率值 累计贡…

UOS Deepin Linux 安装 anaconda

UOS Deepin Linux 安装 anaconda 下载 anaconda 官网下载 国内开源镜像站下载 官网下载 anaconda 官网&#xff1a; https://www.anaconda.com/ 点击右上角 Free Download 按钮 跳转值下载页面&#xff1a;https://www.anaconda.com/download 国内开源镜像站下载 清华大学开源…