
STM32 内部有不同的存储介质,这三种启动模式本质上是告诉内核(Cortex-M3)在上电或者复位的一瞬间,应该去哪一个物理存储区域读取第一行代码并开始执行。
我们可以把它们比作电脑从"本地硬盘"、"U盘重装系统"或"内存"启动。以下是这三个启动区的核心区别和具体应用场景:
1. 主闪存存储器(Main Flash Memory)
比喻:电脑的本地固态硬盘(C盘)。
-
对应的引脚状态 :
BOOT0 = 0,BOOT1 = X(X代表任意电平,高低都行)。 -
它是什么 :这就是芯片内部的用户 Flash 空间(对于 STM32F103C8T6 来说是 64KB)。我们平时用 Keil 或 STM32CubeIDE 编写的代码,编译出来的
.hex或.bin固件,都是烧录到这个区域。 -
使用场景 :正常工作模式 。产品做好了,或者平时写代码正常调试,都是将
BOOT0连到 GND。上电后,内核直接运行你写的程序。
2. 系统存储器(System Memory)
比喻:电脑主板出厂自带的专用重装系统工具(或者品牌机的隐藏恢复分区)。
-
对应的引脚状态 :
BOOT0 = 1,BOOT1 = 0。 -
它是什么 :这是一块在芯片出厂时,由意法半导体(ST)官方直接固化好、只读的存储区(ROM) 。里面写死了一段官方的 Bootloader(引导程序)。
-
使用场景 :串口 ISP 烧录固件。
-
当你的板子没有预留 SWD 调试口(或者 SWD 口被禁用了),你可以把
BOOT0接高电平,BOOT1接低电平,然后复位。 -
此时 STM32 会运行官方的引导程序,激活串口 1(
PA9/PA10)。你就可以配合电脑端的FlyMcu等软件,直接通过一条 USB 转串口线(比如板载的 CH340)把代码强行下载到主闪存里。下载完后,再把BOOT0恢复为 0 运行。
-
3. 内嵌 SRAM(Embedded SRAM)
比喻:把系统直接加载到运行内存(RAM)里运行。
-
对应的引脚状态 :
BOOT0 = 1,BOOT1 = 1。 -
它是什么 :这是芯片的静态随机存取内存(RAM,F103C8T6 只有 20KB),特点是读写速度极快,但断电后数据全部丢失。
-
使用场景 :极端环境下的调试与测试。
-
比如你在做高频次的代码修改调试,如果每次都擦写 Flash,一是很慢,二是 Flash 有擦写寿命限制(虽然通常有几万次)。
-
你可以选择将代码直接下载到 SRAM 里运行,调试速度飞快。但由于 RAM 断电就没了,这种模式完全不能用于量产产品。
-
💡 核心底层逻辑:地址重映射
图片里提到了一句非常关键的话:"这些选择将每个启动模式下的物理存储区域映射到存储块0(启动存储区)。"
在 ARM Cortex-M3 架构中,CPU 复位后必然会去物理地址 0x0000 0000 和 0x0000 0004 去读取堆栈指针(MSP)和复位向量(Reset Vector)。
但是这三个存储区在芯片内部原本都有各自独立的"老家"(物理地址):
-
Main Flash 真正的老家在
0x0800 0000 -
System Memory 真正的老家在
0x1FFF F000 -
SRAM 真正的老家在
0x2000 0000
硬件做的事情就是 :当你通过 BOOT 引脚选定了某个模式,STM32 内部的硬件电路就会玩一个"分身术"(地址重映射),把被选中的那个区域的副本"投射"到 0x0000 0000 地址。CPU 以为自己访问的是 0x0000 0000,其实背后访问的是你选中的物理区域。