STM32 HAL库开发学习3.STM32启动浅析
STM32 HAL库开发学习3.STM32启动浅析
- 一、STM32启动模式(也称自举模式)
- 1. MSP与PC指针赋值
- 2. F1系列的启动模式:
- 3. F4系列启动模式
- 4. F7系列启动模式
- 5. H7系列启动模式
- 二、STM32启动过程
- 1. MSP 栈顶地址
- 2. PC值
- 3. Reset_Handler
- 4. 启动文件内容
- 5. 堆栈
- 6. 中断向量表
- 三、STM32启动过程图解
一、STM32启动模式(也称自举模式)
1. MSP与PC指针赋值
STM32 系列微控制器中的 M3、M4、M7 内核在经历复位操作之后,会率先从特定的内存地址 0x0000 0000 处尝试获取堆栈指针 MSP 的初始值。此初始值具有极为关键的意义,它明确界定了栈顶在内存中的具体位置,为后续程序运行时的函数调用、局部变量存储以及中断处理等操作建立起至关重要的栈空间基础架构。
然后,内核从0x0000 0004处取出程序计数器PC的初始值,该初始值指向的是复位向量所对应的复位处理程序的入口地址(名称为Reset_Handler),这一步明确了程序即将开始执行的具体起始点,使得处理器能够准确地跳转到复位处理程序中,进而开启一系列诸如初始化系统时钟、配置外设、设置中断相关参数等系统初始化操作。
2. F1系列的启动模式:
- 系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值锁存;
- 启动模式选择引脚。
| BOOT1 | BOOT0 | 启动模式 | 0x00000000映射地址 | 0x00000004映射地址 |
|---|---|---|---|---|
| x | 0 | 主闪存存储器 | 0x08000000 | 0x08000004 |
| 0 | 1 | 系统存储器, ST Boot Loader | 0x1FFFF000 | 0x1FFFF004 |
| 1 | 1 | 内置 SRAM | 0x20000000 | 0x20000000 |
系统存储器启动时,内嵌的自举程序存放在系统存储区,由ST在生产线上写入,用于通过可用的串行接口对闪存储器进行重新编程。
- 对于小容量、中容量和大容量的产品而言,可以通过UART1接口启用自举程序。
- 对于互联型产品而言,可以通过以下某个接口启用自举程序:USART1、USART2(重映像的)、CAN2(重映像的)或USB OTG全速接口的设备模式(通过固件更新DFU协同)。
- USART接口依靠内部8MHz振荡器(HSI)运行。CAN和USB接口只能当外部8MHz、14.7456MHz或25MHz时钟(HSE)时运行。
3. F4系列启动模式
与F1系列基本一致,注意的是:
如果使用内置 SRAM, 可以使用FSMC重映射到外部的SRAM,可以通过SYSCFG_MEMRMP 寄存器配置。
4. F7系列启动模式
| BOOT | 启动地址选项字节 | 启动模式 |
|---|---|---|
| 0 | BOOT_ADD0[15:0] | 由用户选项字节 BOOT_ADD0[15:0] 决定启动地址,ST出厂默认的启动地址为:位于0x0200 0000的ITCM上的FLASH |
| 1 | BOOT_ADD1[15:0] | 由用户选项字节 BOOT_ADD1[15:0] 决定启动地址,ST出厂默认的启动地址为:位于0x0010 0000的系统自举程序 |
| Flash选项控制寄存器(FLASH_OPTCR1)----BOOT_ADDx[15:0] 对应地址位 [29:14] |
- BOOT_ADDx = 0x0000: 从 ITCM RAM (0x0000 0000)启动
- BOOT_ADDx = 0x0040: 从系统存储器 (0x0010 0000) 启动
- BOOT_ADDx = 0x0080: 从ITCM 接口上的FLASH(0x0020 0000)启动
- BOOT_ADDx = 0x2000: 从 AXIM 接口上的 FLASH(0x0800 0000)启动
- BOOT_ADDx = 0x8000: 从 DTCM RAM(0x2000 0000)启动
- BOOT_ADDx = 0x8004: 从 SRAM1(0x2001 0000)启动
- BOOT_ADDx = 0x8013: 从 SRAM2(0x2004 C000)启动
x=0/1, 出厂时,BOOT_ADD0=0x0080, BOOT_ADD1 = 0x0040
5. H7系列启动模式
| BOOT | 启动地址选项字节 | 启动模式 |
|---|---|---|
| 0 | BOOT_ADD0[15:0] | 由用户选项字节BOOT_ADD0[15:0]决定启动地址,ST出厂默认的启动地址为:0x0800 0000的Flash地址 |
| 1 | BOOT_ADD1[15:0] | 由用户选项字节 BOOT_ADD1[15:0]决定启动地址,ST出厂默认的启动地址为: 0x1FF0 0000的系统存储器地址 |
二、STM32启动过程
以内部Flash启动为例。
1. MSP 栈顶地址
当芯片配置为从主闪存启动(例如 BOOT0 = 0,BOOT1 = x)时,存储控制器会自动将起始地址 0x00000000 映射到主闪存的起始物理地址(通常是 0x08000000)。这是通过芯片内部的硬连线和一些基本的逻辑电路来实现的,这些电路会根据启动模式引脚(BOOT0 和 BOOT1)的状态来确定初始的地址映射关系。
这是MSP值就是 0x0800 0000。
2. PC值
内核第二步获取PC的初始值。 这个PC的初始值指向的就是 Reset_Handler。
Reset_Handler定义在启动文件: startup_stm32xxx.S 里。
3. Reset_Handler
Reset_Handler执行一些初始化,再去调用 main函数。
Reset_Handler PROCEXPORT Reset_Handler [WEAK] ; WEAK 意思允许其它地方重新定义IMPORT __main ; 声明来自外部的函数IMPORT SystemInitLDR R0, =SystemInit ; 调用函数 SystemInitBLX R0LDR R0, =__main ; 调用 __mainBX R0ENDP
4. 启动文件内容
- 初始化MSP 指针 从 0x0800 0000 获取
- 初始化PC 从0x0800 0004 获取
- 设置堆栈大小 Heap_Size(堆), Stack_Size(栈)
- 初始化中断向量表 __Vectors 定义
- 调用初始化函数,可选的,如调用 SystemInit 函数
- 调用 __main
- 调用 main
5. 堆栈
- 栈(Stack):由编译器自动分配和释放,存放函数参数、局部变量等
- 堆(Heap):由malloc,calloc,realloc等 程序分配和释放
Stack_Size EQU 0x400AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>Heap_Size EQU 0x200AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
6. 中断向量表
从__Vectors 里开始。
中断向量表里面的很多个DCD结构。
__Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ; Hard Fault HandlerDCD MemManage_Handler ; MPU Fault HandlerDCD BusFault_Handler ; Bus Fault HandlerDCD UsageFault_Handler ; Usage Fault HandlerDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD SVC_Handler ; SVCall HandlerDCD DebugMon_Handler ; Debug Monitor HandlerDCD 0 ; ReservedDCD PendSV_Handler ; PendSV HandlerDCD SysTick_Handler ; SysTick Handler; External Interrupts
由于 __initial sp是指向 0x0800 0000,后面每一项偏移4个字节。
每一项是一个函数名,(函数名就是函数的地址)。
三、STM32启动过程图解

从图上可以看出,启动时从0x0800 0000获取 MSP地址,就是栈顶地址,即: 0x2000 0788。
然后 0x0800 0004放的是PC指针,程序到 0x0800 01CD执行引导代码,即Reset_Hander函数。
对于这些地址值,在 .map 文件里也可以找到其地址。
本文学习资源来自 正点原子HAL开发 官方教程。
相关文章:
STM32 HAL库开发学习3.STM32启动浅析
STM32 HAL库开发学习3.STM32启动浅析 一、STM32启动模式(也称自举模式)1. MSP与PC指针赋值2. F1系列的启动模式:3. F4系列启动模式4. F7系列启动模式5. H7系列启动模式 二、STM32启动过程1. MSP 栈顶地址2. PC值3. Reset_Handler4. 启动文件内…...
FakeLocation 1.3.5 BETA 提示校园跑漏洞修复解决
任务一 作者对此又进行了更新,在本次更新中,我们依旧使用hookvip进行破解 本次的更新,使得包名强制写入更加严重,之前靠一些方法已经无法阻止appconfigs.xml的文件的修改,而且使得验证加强,和云端加强&…...
Figma入门-约束与对齐
Figma入门-约束与对齐 前言 在之前的工作中,大家的原型图都是使用 Axure 制作的,印象中 Figma 一直是个专业设计软件。 最近,很多产品朋友告诉我,很多原型图都开始用Figma制作了,并且很多组件都是内置的,…...
腾讯元宝深度搜索AI多线程批量生成TXT原创文章软件
腾讯元宝深度搜索AI多线程批量生成TXT原创文章软件说明: 腾讯元宝深度搜索AI:能够理解用户意图,对搜索结果进行提炼和总结,直接提供用户所需的答案或信息摘要,从而提升用户体验。 腾讯元宝深度搜索AI:通过…...
Git操作学习1
一、一些Linux相关指令 在当前目录下,创建文件并写入内容:echo "这是第一个文件">file1.txt 查看文件的内容: cat file1.txt 会显示:这是第一个文件 修改文件名:mv file.txt file4.txt 把file.txt修改…...
【计算机网络】细说IP
文章目录 概述IP地址的组成IP地址的分类IP地址的作用 分类一、A类IP地址二、B类IP地址三、C类IP地址四、D类IP地址五、E类IP地址 协议报文子网掩码一、定义与功能二、表示方法三、子网掩码与IP地址的关系四、子网掩码的设置与配置五、实例说明 IPv6一、定义与背景二、地址格式与…...
树与图深度优先遍历——acwing
题目一:树的重心 846. 树的重心 - AcWing题库 分析 采用暴力枚举,试探每个点,除去之后,连通分量最大值是多少, 各个点的最大值找最小的 因为可以通过 dfs 来得到 根u以下点数,以及可以求各分树的点数&am…...
vue3.0 根据富文本html页面生成压缩包(含视频在线地址、图片在线地址、前端截图、前端文档)
vue3.0生成压缩包(含在线地址、前端截图、前端文档) 需求描述效果开始下载插件包基本代码构造 点击下载按钮1.截图content元素,并转化为pdfcanvas putImageData、getImageDatagetImageData 获取指定矩形区域的像素信息putImageData 将这些数据…...
WPF+LibVLC开发播放器-LibVLC在C#中的使用
LibVLC在C#中的使用 安装包Nuget使用控件使用播放器初始化加载视频文件 视频教程: 使用WPFLibVLC快速开发一个播放器 安装包Nuget 安装下面两个包,必须安装两个 一个是相关框架对应的包,Winform就安装LibVLCSharp.Winform;WPF就安装LibVLCSharp.WPF&am…...
消息中间件-Kafka1-实现原理
消息中间件-Kafka 一、kafka简介 1、概念 Kafka是最初由Linkedin公司开发,是一个分布式、支持分区(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以…...
2023年华数杯数学建模B题不透明制品最优配色方案设计解题全过程文档及程序
2023年华数杯全国大学生数学建模 B题 不透明制品最优配色方案设计 原题再现: 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此,不透明制品的配色对其外观美观度和市场竞争力起着重要作用。然而,传统的人工配色存在一定的局限性…...
Mysql事务常见面试题 -- 事务的特性 ,并发事务问题 , undo_log和redo_log , 分布式事务
一. 事务的特性 ACID 原子性 --> 事务操作被视为一个整体 , 要么全部成功 , 要么全部失败一致性 --> 事务操作前后数据的变化是一致的隔离性 --> 事务的执行不受其他事务的影响持久性 --> 事务执行完毕会对数据永久保存 比如我们在转账的过程中 , A给B转账1000元…...
【数据库系列】Spring Boot如何配置Flyway的回调函数
Flyway 提供了回调机制,使您能够在特定的数据库迁移事件发生时执行自定义逻辑。通过实现 Flyway 的回调接口,可以在迁移前后执行操作,如记录日志、执行额外的 SQL 语句等。 1. 创建自定义回调类 要配置 Flyway 的回调函数,需要创…...
分布式推理框架 xDit
1. xDiT 简介 xDiT 是一个为大规模多 GPU 集群上的 Diffusion Transformers(DiTs)设计的可扩展推理引擎。它提供了一套高效的并行方法和 GPU 内核加速技术,以满足实时推理需求。 1.1 DiT 和 LLM DiT(Diffusion Transformers&am…...
DR.KNOWS:医疗图谱UMLS + 图神经网络 + LLM 模拟医生的诊断推理过程, 从症状出发找到可能的诊断结果
DR.KNOWS:医疗图谱UMLS 图神经网络 LLM 模拟医生的诊断推理过程, 从症状出发找到可能的诊断结果 理解要点解法拆解全流程分析图神经网络的训练论文大纲核心模式真实应用中,为什么说俩跳推理过于简化? 论文:Leveraging A Medical…...
缓存雪崩 详解
缓存雪崩详解 缓存雪崩是分布式系统中一种常见的问题,它指的是缓存中大量数据在同一时间失效,导致所有的请求都直接涌向数据库或后端服务,进而导致系统负载骤增,甚至引发系统宕机或崩溃。 1. 缓存雪崩的原因 缓存雪崩通常由以下…...
使用 Vite 创建 Vue3+TS 项目并整合 ElementPlus、Axios、Pinia、Less、Vue-router 等组件或插件
前言 记录一下使用 Vite 创建 Vue3TS 项目并整合 ElementPlus、Axios、Pinia、Less、Vue-router 等组件或插件。 一、使用 Vite 创建 Vue3TS 项目 1.新建一个 temp 文件夹 (1)在桌面新建一个 temp 文件夹,然后在 VS Code 中打开此文件夹&…...
Flink随笔 20241203 Flink重点内容
Flink 是一个强大的流处理框架,它的设计理念是高吞吐量、低延迟的流式计算。你提到的这些重点是 Flink 的核心组成部分,下面我将详细解析每一个方面。 1. 窗口(Window) 窗口是 Flink 流处理中一个非常重要的概念,主要…...
shell脚本实战
学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章。 笔记只是方便学习,以下内容只涉及学习内容,切莫逾越法律红线。 安全见闻,包含了各种网络安全,网络技术,旨在明白自己的渺小,知识的广博&a…...
【机器学习】分类任务: 二分类与多分类
二分类与多分类:概念与区别 二分类和多分类是分类任务的两种类型,区分的核心在于目标变量(label)的类别数: 二分类:目标变量 y 只有两个类别,通常记为 y∈{0,1} 或 y∈{−1,1}。 示例ÿ…...
ThinkPHP3.x核心特性全解析
好的,我们来梳理一下 ThinkPHP 3.x 版本的主要特性:MVC 架构支持:严格遵循模型(Model)-视图(View)-控制器(Controller)的设计模式。清晰分离业务逻辑、数据操作和页面展示,便于协作开发和维护。路由支持:支持多种 URL …...
【花雕动手做】ESP32-S3 + MimiClaw 实战:通过飞书自然语言指令控制板载 WS2812 彩灯
【花雕动手做】嵌入式 AI Agent 实战:MimiClaw ESP32-S3 接入飞书,远程控制板载 RGB 全彩灯效 ——从源码修改到飞书指令,手把手打造一个能“听懂颜色话”的嵌入式 AI 智能体 一、引言:当“养龙虾”热潮遇到嵌入式 AI 2026 年开春…...
开源文献管理工具如何重塑学术研究工作流:Zotero Reference深度解析
开源文献管理工具如何重塑学术研究工作流:Zotero Reference深度解析 【免费下载链接】zotero-reference PDF references add-on for Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-reference 在数字化科研时代,学术工作者平均每周…...
Lisk SDK安全最佳实践:保护区块链应用免受攻击的10个技巧
Lisk SDK安全最佳实践:保护区块链应用免受攻击的10个技巧 【免费下载链接】lisk-sdk 🔩 Lisk software development kit 项目地址: https://gitcode.com/gh_mirrors/li/lisk-sdk Lisk SDK是一款强大的区块链应用开发工具包,专为构建安…...
终极指南:如何使用snabbt.js创建惊艳的Web动画效果
终极指南:如何使用snabbt.js创建惊艳的Web动画效果 【免费下载链接】snabbt.js Fast animations with javascript and CSS transforms 项目地址: https://gitcode.com/gh_mirrors/sn/snabbt.js 在当今的Web开发领域,snabbt.js作为一款极简主义的J…...
Anything to RealCharacters 2.5D转真人引擎效果可复现性验证:相同输入多轮输出质量评估
Anything to RealCharacters 2.5D转真人引擎效果可复现性验证:相同输入多轮输出质量评估 1. 项目概述与测试背景 Anything to RealCharacters 2.5D转真人引擎是基于通义千问Qwen-Image-Edit-2511底座和专属写实权重的图像转换系统,专门针对RTX 4090显卡…...
在 Android 上跑大模型,我踩过的那些推理加速坑
有人问过我:在 Android 上跑大模型,和在服务器上跑有什么本质区别? 我想了一下,说:服务器上你在意的是吞吐,手机上你在意的是不要把电池榨干、不要让用户等三秒、不要因为内存不够直接崩。本质区别不是算法…...
如何通过MobaXterm中文版快速构建一体化远程管理环境
如何通过MobaXterm中文版快速构建一体化远程管理环境 【免费下载链接】Mobaxterm-Chinese Mobaxterm simplified Chinese version. Mobaxterm 的简体中文版. 项目地址: https://gitcode.com/gh_mirrors/mo/Mobaxterm-Chinese 远程管理工具的选择常常让系统管理员和开发者…...
保姆级教程:用Python的face_recognition库,5分钟搞定人脸检测+特征点标记
零基础玩转Python人脸识别:5分钟实现智能美颜与表情分析 记得第一次接触人脸识别技术时,我盯着手机相册里自动分类的人物相册发了半天呆——这玩意儿到底是怎么认出我换了发型还长了胡子的?作为Python初学者,你可能觉得这种"…...
5分钟快速上手:Awoo Installer - 你的Switch游戏安装神器
5分钟快速上手:Awoo Installer - 你的Switch游戏安装神器 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 还在为Switch游戏安装而烦恼吗…...
