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博客

相关推荐
SundayBear1 天前
零基础入门MQTT协议
c语言·单片机
嗯嗯=1 天前
STM32单片机学习篇9
stm32·单片机·学习
嵌入小生0071 天前
基于Linux系统下的C语言程序错误及常见内存问题调试方法教程(嵌入式-Linux-C语言)
linux·c语言·开发语言·嵌入式·小白·内存管理调试·程序错误调试
小范馆1 天前
ESP各模组的引脚图-小智接线图
stm32
松涛和鸣1 天前
DAY63 IMX6ULL ADC Driver Development
linux·运维·arm开发·单片机·嵌入式硬件·ubuntu
想放学的刺客2 天前
单片机嵌入式试题(第23期)嵌入式系统电源管理策略设计、嵌入式系统通信协议栈实现要点两个全新主题。
c语言·stm32·单片机·嵌入式硬件·物联网
猫猫的小茶馆2 天前
【Linux 驱动开发】五. 设备树
linux·arm开发·驱动开发·stm32·嵌入式硬件·mcu·硬件工程
YouEmbedded2 天前
解码内部集成电路(IIC)与OLED屏
stm32·0.96寸oled·硬件iic·软件模拟iic·图片取模·汉字取模
jghhh012 天前
基于上海钜泉科技HT7017单相计量芯片的参考例程实现
科技·单片机·嵌入式硬件
恶魔泡泡糖2 天前
51单片机外部中断
c语言·单片机·嵌入式硬件·51单片机