STM32F 启动过程
STM32F 启动过程
STM32F 系列微控制器的启动过程是一个精心设计的序列,确保硬件正确初始化并最终执行用户的 main() 函数。以下是详细的中文解析:
核心阶段:
-
上电复位/复位信号:
- 当给芯片上电、按下复位按钮、看门狗复位或软件请求复位时,启动过程开始。
- 芯片内部的复位电路将大部分寄存器和内部状态强制设置为已知的初始状态(复位值)。
- 处理器内核(Cortex-M)从复位向量开始执行指令。对于 Cortex-M,复位向量的地址固定为
0x00000000。
-
初始化栈指针:
- 处理器内核做的第一件事是从内存地址
0x00000000读取一个 32 位的值。 - 这个值被加载到主栈指针中,作为程序运行时的初始栈顶地址。栈用于存储局部变量、函数调用返回地址、中断上下文等,是 C 程序运行的基础。
- 处理器内核做的第一件事是从内存地址
-
加载复位向量(程序计数器):
- 处理器内核接着从内存地址
0x00000004读取下一个 32 位的值。 - 这个值就是复位处理函数的入口地址。
- 处理器将这个地址加载到程序计数器 中,从而跳转到复位处理函数开始执行。
- 处理器内核接着从内存地址
-
执行复位处理函数:
- 复位处理函数通常由芯片厂商(ST)提供,包含在启动文件(如
startup_stm32fxxxxx.s)中,通常名为Reset_Handler。 Reset_Handler是启动过程的核心,负责执行以下关键初始化任务:- 复制数据段: 将存储在 Flash 中的初始化值(
.data段)复制到 SRAM 中的对应位置。这部分变量在 C 代码中具有初始值(非零)。 - 清零 BSS 段: 将 SRAM 中未初始化或初始化为零的全局/静态变量(
.bss段)全部清零。 - 配置系统时钟: 调用
SystemInit()函数(通常由 ST 在system_stm32fxxxxx.c中提供)。这是极其关键的一步:- 初始化内部/外部时钟源(HSI, HSE, LSI, LSE)。
- 配置锁相环。
- 设置系统时钟源和频率(SYSCLK)。
- 配置 AHB, APB1, APB2 等总线时钟分频器。
- (可选)初始化浮点单元(FPU 存在时)。
- (可选)配置 CCM RAM(如果芯片有)。
- 初始化 C 库环境: 如果使用了标准库(如
printf,malloc),Reset_Handler会调用__main或_start(由编译器工具链提供)。__main内部会处理更复杂的 C 运行时初始化(包括数据段复制和 BSS 清零,有时Reset_Handler会直接做这些,__main则处理其他),并最终调用用户的main()函数。如果使用-nostartfiles编译选项,则需要手动完成所有初始化。
- 复制数据段: 将存储在 Flash 中的初始化值(
- 复位处理函数通常由芯片厂商(ST)提供,包含在启动文件(如
-
跳转到
main()函数:- 在完成所有必要的硬件和 C 运行时环境初始化后,
Reset_Handler(或__main)会调用用户的main()函数。 - 此时,程序的控制权正式交给用户的应用程序代码。
- 在完成所有必要的硬件和 C 运行时环境初始化后,
-
用户
main()函数执行:- 用户编写的
main()函数开始执行。在这里,用户初始化外设(GPIO, UART, SPI, I2C, ADC, Timers 等)、配置中断、实现主循环逻辑等。 - 根据设计,
main()函数通常不应返回。如果它返回了,标准库可能会陷入一个无限循环或调用exit()。
- 用户编写的
关键概念与细节:
- 向量表: 位于 Flash 起始位置(通常是
0x08000000,映射到0x00000000)的一个数组。第一个元素是初始栈指针值,第二个元素是Reset_Handler的地址,后续元素是各种异常和中断服务程序的入口地址。启动时硬件自动读取前两个(MSP 和 Reset_Handler)。 - 内存映射: STM32 的 Flash 起始地址通常是
0x08000000。芯片启动时,通过内部机制(如 Boot 引脚配置的启动模式),将特定的物理地址(如0x00000000)别名映射到 Flash (0x08000000)、系统存储器(内置 Bootloader)或 SRAM。这使得复位后硬件能直接从0x00000000找到向量表。默认启动模式通常是 Flash。 - 启动文件: 由汇编或 C 编写,包含
Reset_Handler和其他异常/中断的默认处理程序(通常是死循环)。它定义了堆栈大小、堆大小,并链接了数据段/BSS段的起始和结束地址符号。用户通常需要根据具体芯片型号选择正确的启动文件。 - SystemInit(): 这个函数负责关键的时钟树配置。它通常在
Reset_Handler中、跳转到main()之前被调用。用户可以在main()中重新配置时钟,但SystemInit()提供了芯片上电后能运行的基本时钟(通常是内部 HSI)。 - C 库初始化: 由
__main或类似函数处理,确保 C 程序运行所需的环境变量、堆管理初始化等完成。数据段复制/BSS 清零可能由启动文件或__main完成。
总结流程图:
上电复位/复位信号
|
V
硬件从 0x00000000 加载初始栈指针 (MSP)
|
V
硬件从 0x00000004 加载复位向量地址 -> 跳转到 Reset_Handler
|
V
Reset_Handler:
1. 复制 .data 段 (初始化的全局/静态变量) 从 Flash 到 SRAM
2. 清零 .bss 段 (未初始化或初始化为0的全局/静态变量)
3. (可选) 配置系统堆 (Heap)
4. 调用 SystemInit() 函数] 初始化系统时钟 (SYSCLK, AHB, APBx 等)
5. 调用 __main (或等效函数,进行 C 库初始化)
|
V
__main (C 库):
* 可能完成数据段/BSS清零(如果启动文件没做全)
* 初始化 C 库环境 (堆、文件描述符等)
* 调用全局对象的构造函数 (C++)
* 调用用户的 main() 函数
|
V
用户 main() 函数
* 用户初始化外设、配置中断、实现应用逻辑
* (通常包含一个无限循环)
|
V
(如果 main 返回) -> 可能进入死循环或调用 exit()
理解 STM32F 的启动过程对于调试、优化启动时间、理解内存布局以及进行底层开发至关重要。
详解STM32启动过程
本章教程主要跟大家讲STM32H7的启动过程,这里的启动过程是指从CPU上电复位执行第1条指令开始(汇编文件)到进入C程序main()函数入口之
2022-11-14 11:24:11
STM32启动过程分析
1. 程序和数据在Flash和SRAM上的存储结构在讲解 STM32 启动过程之前,我们先来了解一下 STM32 的程序和数据在 Flash 和
资料下载
479461
2021-12-23 19:55:45
【STM32F407开发板用户手册】第13章 STM32F407启动过程详解
【STM32F407开发板用户手册】第13章 STM32F407启动过程详解
资料下载
佚名
2021-11-23 18:06:29
【STM32F429开发板用户手册】第13章 STM32F429启动过程详解
【STM32F429开发板用户手册】第13章 STM32F429启动过程详解
资料下载
佚名
2021-11-23 18:06:28
STM32H7的启动过程分析
本章教程主要跟大家讲STM32H7的启动过程,这里的启动过程是指从CPU上电复位执行第1条指令开始(汇编文件)到进入C程序main()函数入口之
2022-10-17 14:42:52
STM32的启动过程是怎么样的?
下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存,这就是所谓的启动过程。 STM32上电或者复位后,代码区始终从0x00000000开始,其实就是将存储空间的地址映射到0x0000000
2020-11-27 16:36:44
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- amoled屏幕和oled区别
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览