登录/注册

STM32F 启动过程

STM32F 启动过程

更多

STM32F 系列微控制器的启动过程是一个精心设计的序列,确保硬件正确初始化并最终执行用户的 main() 函数。以下是详细的中文解析:

核心阶段:

  1. 上电复位/复位信号:

    • 当给芯片上电、按下复位按钮、看门狗复位或软件请求复位时,启动过程开始。
    • 芯片内部的复位电路将大部分寄存器和内部状态强制设置为已知的初始状态(复位值)。
    • 处理器内核(Cortex-M)从复位向量开始执行指令。对于 Cortex-M,复位向量的地址固定为 0x00000000
  2. 初始化栈指针:

    • 处理器内核做的第一件事是从内存地址 0x00000000 读取一个 32 位的值。
    • 这个值被加载到主栈指针中,作为程序运行时的初始栈顶地址。栈用于存储局部变量、函数调用返回地址、中断上下文等,是 C 程序运行的基础。
  3. 加载复位向量(程序计数器):

    • 处理器内核接着从内存地址 0x00000004 读取下一个 32 位的值。
    • 这个值就是复位处理函数的入口地址
    • 处理器将这个地址加载到程序计数器 中,从而跳转到复位处理函数开始执行。
  4. 执行复位处理函数:

    • 复位处理函数通常由芯片厂商(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 编译选项,则需要手动完成所有初始化。
  5. 跳转到 main() 函数:

    • 在完成所有必要的硬件和 C 运行时环境初始化后,Reset_Handler(或 __main)会调用用户的 main() 函数。
    • 此时,程序的控制权正式交给用户的应用程序代码。
  6. 用户 main() 函数执行:

    • 用户编写的 main() 函数开始执行。在这里,用户初始化外设(GPIO, UART, SPI, I2C, ADC, Timers 等)、配置中断、实现主循环逻辑等。
    • 根据设计,main() 函数通常不应返回。如果它返回了,标准库可能会陷入一个无限循环或调用 exit()

关键概念与细节:

总结流程图:

上电复位/复位信号
        |
        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启动过程详解

STM32启动过程详解 近年来,STM32微控制器在嵌入式系统中的应用越来越广泛。ST

2023-12-08 15:47:03

STM32启动过程如何分析

本文分析STM32单片机从上电到运行的过程,目的在于了解STM32单片机从启动

2023-02-10 10:48:13

详解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

stm32启动过程

一次性搞定stm32启动模式与启动过程一、stm32

资料下载 h1708587244.0670 2021-12-16 16:57:05

STM32F407开发板用户手册】第13章 STM32F407启动过程详解

【STM32F407开发板用户手册】第13章 STM32F407启动过程详解

资料下载 佚名 2021-11-23 18:06:29

STM32F429开发板用户手册】第13章 STM32F429启动过程详解

【STM32F429开发板用户手册】第13章 STM32F429启动过程详解

资料下载 佚名 2021-11-23 18:06:28

STM32上电后启动过程

STM32上电后启动过程

资料下载 王强 2021-11-15 18:21:02

STM32H7的启动过程分析

本章教程主要跟大家讲STM32H7的启动过程,这里的启动过程是指从CPU上电复位执行第1条指令开始(汇编文件)到进入C程序main()函数入口之

2022-10-17 14:42:52

STM32启动过程是怎样的?

STM32的启动过程是怎样的?

2021-11-30 06:08:48

STM32整个启动过程是怎样的

STM32整个启动过程是怎样的?整个启动过程涉及的代码有哪些呢?

2021-11-29 06:59:04

解析STM32启动过程

stm32系列芯片的种类和型号都有哪些?STM32的启动过程是怎样的?

2021-10-29 06:39:51

STM32H7启动过程详解

第13章 STM32H7启动过程详解本章教程主要跟大家讲STM32H7的启动过程

2021-08-03 06:41:52

STM32F429启动过程详解

第13章 STM32F429启动过程详解本章教程主要跟大家讲STM32F429的启动过

2021-08-03 06:15:08

STM32启动过程是怎么样的?

下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存,这就是所谓的启动过程。 STM32上电或者复位后,代码区始终从0x00000000开始,其实就是将存储空间的地址映射到0x0000000

2020-11-27 16:36:44

7天热门专题 换一换
相关标签