STM32启动流程解析:从BootROM到BootLoader

目录

[0 相关内容(建议与本文搭配食用)](#0 相关内容(建议与本文搭配食用))

[1 一般的PC/嵌入式Linux(SOC)启动流程](#1 一般的PC/嵌入式Linux(SOC)启动流程)

[2 STM32 的启动流程,Boot ROM与Boot Loader](#2 STM32 的启动流程,Boot ROM与Boot Loader)

[STM32 启动流程:](#STM32 启动流程:)

[3 常见问题](#3 常见问题)

[STM32中的 Boot ROM 到底是什么?这段代码保存在哪里?为什么在地址映射图里没有找到 Boot ROM 的位置?](#STM32中的 Boot ROM 到底是什么?这段代码保存在哪里?为什么在地址映射图里没有找到 Boot ROM 的位置?)

[Boot ROM的概念(计算机上)](#Boot ROM的概念(计算机上))

[CPU 中的 Boot ROM](#CPU 中的 Boot ROM)

[为什么在地址映射图中找不到Boot ROM?](#为什么在地址映射图中找不到Boot ROM?)

个人理解与总结

[4 参考阅读](#4 参考阅读)


0 相关内容(建议与本文搭配食用)

ARM内存映射与启动地址重映射机制解析

STM32中的Flash、ROM与RAM全解析

【蛋饼嵌入式】我提着鞋带拎自己?嵌入式芯片启动过程全解析,彻底理解bootloader_哔哩哔哩_bilibili

1 一般的PC/嵌入式Linux(SOC)启动流程

bash 复制代码
上电复位  
   ↓  
硬件复位初始化:复位寄存器值、外设恢复默认状态(如关闭外设时钟)  
   ↓  
执行BootROM(厂商芯片流片时固化的一段代码)  
   ↓  
执行用户Bootloader(若有)  
   ↓  
执行应用程序的启动代码

也就是说,一般可以分为 3 层:

  • Boot ROM 层:

    • 芯片出厂自带的、芯片厂商写好的 Boot ROM,一般来说用户无权修改,一般来说只会有简单的程序(可能是硬件编程,也可能是存储在芯片内部的一小块rom里)。

    • 用于硬件自检、部分初始化、加载 Boot Loader 和提供外部配置引脚。

    • 跳转至 Boot Loader。

  • Boot Loader 层:

    • 可以通过 Boot Loader 访问 RAM、FLASH 等更多的存储设备,初始化时钟、通讯等,也可以加入更多用户自定义的功能(比如诊断服务)。

    • MCU 的 Boot Loader 一般会包括以下功能:

    • 关闭看门狗,初始化中断和trap向量表,进行时钟和外设初始化,让芯片正常运行起来。(看门狗关不关看具体的boot loader编写,通常默认情况是关闭)

    • 提供CAN、UART、ETH等用于通讯功能的驱动,能够接收外部数据传输请求。

    • 提供FLASH的读写与擦除驱动,设计服务来对通讯端口接收到的更新代码进行校验、存储,以及跳转操作系统或后续应用程序代码。

    • 如有必要,还会开发一些基础诊断服务,串口交互程序等等。

  • Application 层:

    • 运行操作系统或应用程序代码。

2 STM32 的启动流程,Boot ROM与Boot Loader

我们都知道的,STM32 会根据 boot 0 和 boot 1 引脚电平选择启动地址(即 0x0000 0000 映射的地址),可以选择主 flash 启动(代码通常的启动地址,0x0800 0000),也可以选择从 SRAM 启动(0x2000 0000),也可以是从系统存储器(System memory)启动(以STM32F411为例:0x1FFF 0000 - 0x1FFF 7A0F)

STM32 启动流程:

由上面的推导,我们得到了如下的STM32启动流程:

bash 复制代码
上电复位  
   ↓  
硬件复位初始化:复位寄存器值、外设恢复默认状态(如关闭外设时钟)  
   ↓  
BootROM层:
执行BootROM(厂商芯片流片时固化的一段代码,固化在芯片内部)  
   ├─→ 初始化基础时钟(如切换到HSI内部时钟)  
   ├─→ 初始化必要外设(如Flash控制器、调试串口)  
   ├─→ 检测启动模式(通过BOOT引脚或选项字节,启动Bootloader)  
   │     ├─→ 从内部Flash(0×08000000)启动:直接跳转至用户程序起始地址  
   │     └─→ 从系统存储器(System Memory)启动:执行厂商Bootloader(如STM32的USB DFU) 
   │     └─→ 从RAM启动(0x20000000) 
   ↓  
Bootloader层:
假设从内部Flash启动:加载用户Bootloader(若有)  
   ├─→ 从内部Flash/外部存储介质读取用户Bootloader到RAM或直接执行  
   ├─→ 执行Bootloader的启动代码(.s文件)  
   ├─→ 用户Bootloader执行:  
   │     ├─→ 高级时钟配置(如PLL倍频到主频)  
   │     ├─→ 外设深度初始化(如以太网、文件系统)  
   │     ├─→ 固件更新检测(OTA、USB/UART通信)  
   │     └─→ 跳转至应用程序复位向量(即main()的上级入口)  
   ↓  
Application层:
执行应用程序的启动代码(startup_xxx.s)  
   ├─→ 初始化C语言环境(如复制.data段、清零.bss段)  
   ├─→ 调用库初始化(如ARM的__main)  
   └─→ 最终跳转至main()函数
   ↓
main()函数

3 常见问题

STM32中的 Boot ROM 到底是什么?这段代码保存在哪里?为什么在地址映射图里没有找到 Boot ROM 的位置?

Boot ROM的概念(计算机上)

Boot ROM,也称为启动只读存储器(或者引导ROM),是嵌入在计算机硬件中的一种只读存储器,通常是芯片或模块的一部分。它包含了计算机系统的基本启动程序,是整个启动过程的第一步。在计算机启动过程中,首先执行Boot ROM中的启动程序,然后由Boot ROM加载Boot Loader,最后由Boot Loader加载操作系统内核。

Boot ROM 的操作过程

当硬件上电时,Boot ROM负责进行硬件初始化、加载Boot Loader等基本操作。Boot ROM在内存中的固定位置映射,并且处理器被设计为在复位后从这个位置开始执行。通常,Boot ROM位于与CPU相同的芯片上,但在旧系统中也可以是外部ROM芯片。在现代系统中,无论是集成在CPU中还是外部ROM芯片,Boot ROM通常使用NOR闪存,支持执行位于闪存中的代码。

Boot ROM将初始化硬件总线和外设,以便启动。在某些情况下,Boot ROM能够初始化RAM,在其他情况下,则由Boot Loader来完成这项工作。硬件初始化结束后,Boot ROM将尝试从外部外设(如eMMC、microSD卡、外部EEPROM等)或通过特定协议(如USB、UART等)在总线上加载Boot Loader。

Boot ROM 与Boot Loader 的区别

Boot ROM与Boot Loader的主要区别在于存储位置、功能和可修改性。Boot ROM是固化在硬件中的只读存储器,通常无法修改其内容。而Boot Loader存储在可写存储器中,可以通过软件的方式进行修改和更新。Boot ROM是计算机系统启动过程的第一步,负责硬件初始化和加载Boot Loader;而Boot Loader是一个软件程序,负责加载操作系统内核及其他系统组件,完成系统的初始化和配置。

PS:有时候Boot Loader 也被称为"引导加载程序","boot"意为"启动,引导"

CPU 中的 Boot ROM

CPU 出厂时并不内置完整的 Bootloader,但会固化最基础的启动代码(通常称为 Boot ROM 或一级引导程序)。以下是具体说明:

  • CPU 芯片在生产时,制造商会在其内部 ROM 中固化一段极简的启动代码(如 ARM 架构的 Boot ROM)。

  • 这段代码的作用是初始化 CPU 核心(如设置时钟、关闭中断),并根据硬件设计从指定地址加载下一阶段程序(即真正的 Bootloader)。

例如:

  • ARM 架构 CPU 复位后默认从地址 0x00000000 取指令。

  • MIPS 架构 CPU 从 0xBFC00000 开始执行。

为什么在地址映射图中找不到Boot ROM?

芯片内部的Mask ROM通常位于CPU内核中,作为Boot ROM存在,用于存储最基础的启动代码。这种设计使得Mask ROM在系统启动时能够被CPU直接访问,无需额外的初始化步骤。

个人理解与总结

首先我们能确定,Boot ROM 永远是计算机系统/单片机启动过程的第一步,在 STM32F411CEU6 中,这一步会"初始化基础硬件,然后根据 boot 引脚电平选择启动模式跳转到bootloader",这些过程采用硬件编程,芯片一旦制作完成,内容就无法修改。

网上对于 Boot ROM 和 Boot Loader 的许多描述有些模糊不清,这或许是因为芯片种类繁多,各有差异导致的。但是我们仍然可以理清他们的功能职责:

  • Boot ROM:上电复位之后的启动第一步,这段过程的代码可以是保存在芯片内核中的一小块rom中(SOC或计算机),也可以是像STM32F411一样固化在芯片里。但无论如何,它都是厂商在芯片出厂时就设定好的,无法被更改。

  • Boot Loader:保存在可擦写的存储器中(如flash),可高度由用户自定义,灵活性很强。

我们可以将Boot ROM理解为一个功能概念,它是上电复位之后进行的第一步,它由厂商出厂时写好,初始化基础硬件,跳转到Boot Loader。

但Boot ROM和Boot loader的功能职责有重叠部分,有些Boot loader能干的事情,Boot ROM也能干:

但单片机上的Boot ROM并不会有这么复杂,就像上文说的,它的工作就是:初始化基础硬件,跳转boot loader。由boot loader来执行更加复杂的任务,因为boot loader是纯软件语言写的程序,可以高度自定义。

4 参考阅读

CPU 一级引导程序_cpu固件是什么-CSDN博客

痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(1)- Boot简介 - 痞子衡 - 博客园

BootROM与Bootloader详解-CSDN博客

Boot ROM和BootLoader的区别-CSDN博客

相关推荐
充哥单片机设计4 小时前
【STM32项目开源】基于STM32的智能养殖场环境监测系统
stm32·单片机·嵌入式硬件
New农民工5 小时前
STM32ADC模式和DMA设置
stm32·单片机·嵌入式硬件
清风6666666 小时前
基于51单片机的空气质量检测PM2.5粉尘检测设计
数据库·单片机·嵌入式硬件·毕业设计·51单片机·课程设计
辰哥单片机设计6 小时前
UV紫外线消毒灯详解(STM32)
stm32·uv
何处归途.6 小时前
stm32内部flash
stm32·单片机·嵌入式硬件
硬汉嵌入式7 小时前
瑞萨M85内核芯片再出1GHz旗舰双核新品RA8T2,两个千兆以太网MAC,集成EtherCAT从机接口,面向高端电机控制
arm·瑞萨·ethercat·双核·cortex-m85
充哥单片机设计7 小时前
【STM32项目开源】基于STM32的智能鱼缸养殖系统
stm32·单片机·嵌入式硬件
Hello_Embed8 小时前
STM32 智能垃圾桶项目笔记(四):PWM 回顾与舵机(SG90)控制实现
笔记·stm32·单片机·学习·嵌入式软件
零一iTEM8 小时前
NS4168输出音频通过ESP32C3测试
c++·单片机·嵌入式硬件·mcu·音视频·智能家居