一、 核心基础:STM32 的内存映射机制 (Memory Aliasing)
要理解启动和烧录,必须先理解 ARM Cortex-M 内核的取指机制。
当芯片上电或复位时,CPU 的程序计数器(PC 指针)被硬件强制设定为去寻找虚拟地址 0x0000 0000。
-
它会从
0x0000 0000取出第一个数据,作为主堆栈指针 (MSP) 的初始值。 -
它会从
0x0000 0004取出第二个数据,作为复位向量 (Reset Vector),也就是程序真正开始执行的第一条指令的地址。
BOOT 引脚的作用,就是硬件级别的"地址重定向(映射)"。 物理存储器有自己的真实地址,通过配置 BOOT 引脚,总线矩阵会将不同的物理地址"伪装"成 0x0000 0000,骗过 CPU,从而决定芯片从哪里开始运行。
二、 三大物理存储区与 BOOT 引脚配置
| BOOT1 | BOOT0 | 映射到 0x0000 0000 的物理区域 | 存储介质特性 | 运行场景说明 |
|---|---|---|---|---|
| X (任意) | 0 | 主闪存 (Main Flash) 物理基址: 0x0800 0000 |
掉电不丢失。存放我们编写的业务逻辑代码和常量。 | 正常运行模式。上电后直接运行你的业务程序。 |
| 0 | 1 | 系统存储器 (System Memory) 物理基址: 0x1FFF B000 (视型号而定) |
只读区 (ROM)。出厂固化了一段 Bootloader 程序,初始化了时钟、USART、USB、I2C 等通信外设。 | 串口烧录模式 (ISP)。运行官方 Bootloader,等待接收外部数据并烧入主 Flash。 |
| 1 | 1 | 内置 SRAM 物理基址: 0x2000 0000 |
掉电丢失。平时存放全局变量、堆栈数据。 | SRAM 启动模式。极少用于生产,偶尔用于解除写保护或极高频代码的无延迟调试。 |
三、 三种程序烧录/升级方式深度剖析
这部分是你总结的精华,我在此基础上补充了底层的操作逻辑。
1. ICP (In-Circuit Programming) - 在电路编程
-
使用的工具: 烧录器(ST-Link, J-Link 等)。
-
底层原理: 硬件级别的绝对控制。烧录器通过 SWD 或 JTAG 接口,直接与芯片内部的调试组件(CoreSight)对话。它不需要芯片内部有任何 Bootloader 配合,直接通过硬件总线将数据暴力写入 Flash。
-
适用场景: 开发阶段的频繁烧录与在线调试(单步运行、看内存、打断点)。
-
BOOT引脚要求: 无需特殊设置,保持
BOOT0=0即可。
2. ISP (In-System Programming) - 在系统编程
-
使用的工具: USB 转串口线(如 CH340)、原生的 USB 线或 I2C 主机。
-
底层原理: 软件级别的通信配合。芯片必须改变启动模式 (
BOOT0=1,BOOT1=0)并复位。此时 CPU 运行的是系统存储器里原厂写好的 Bootloader。上位机(电脑)通过特定的握手协议把.bin或.hex发给单片机,原厂 Bootloader 接收到数据后,再调用内置函数将数据写到主 Flash 中。 -
适用场景: 没有烧录器的情况,或者产品外壳只留了一个串口用于出厂批量烧录。
3. IAP (In-Application Programming) - 在应用编程 (核心重点)
-
使用的工具: 网络模块(Wi-Fi、4G 模块)、外部存储(SD 卡、U 盘)。
-
底层原理: 这是完全由开发者自己定义的双程序架构。此时 Flash 通常被分为两部分:
-
第一部分 (起始位置如
0x0800 0000): 存放你自己写的 Custom Bootloader。它的任务是:联网通过 TCP/IP HTTP 请求下载升级包,或者去读取 SD 卡里的文件,将新程序写入 Flash 的后半部分。 -
第二部分 (偏移位置如
0x0800 4000): 存放真正的 App 业务代码(带有天气查询、时间同步等实际功能的代码)。
-
-
工作流: 芯片正常从
0x0800 0000(你的 Bootloader)启动。Bootloader 检查是否有升级标志。如果有,就通过网络或本地把固件拉取下来,擦除并写入 App 区,写完后通过函数指针跳转 到0x0800 4000执行新程序;如果没有升级标志,则直接跳转到 App 区运行。 -
适用场景: OTA(空中升级)、产品发布后的远程维护。