2. STM32复位与启动模式解析
STM32上电或复位后,CPU并不会立刻从主闪存执行用户程序,而是先由芯片内部的启动逻辑采样BOOT引脚,决定从哪一块物理存储区取出复位向量。理解这一过程,是排查“程序烧进去却不运行”“必须按复位才启动”“串口下载后要改跳线”等问题的关键。本节围绕BOOT引脚、三种启动模式以及系统存储器与主闪存的映射关系展开。
一、复位序列与启动模式的采样时机
STM32的复位分为上电复位(POR)、掉电复位(PDR)、外部NRST引脚复位、看门狗复位和软件复位等。无论哪种复位,芯片内部都会重新执行一段固定的启动流程:复位释放后,内核先从启动地址取出栈顶值装入MSP,再取出复位向量跳转到复位处理函数。这个“启动地址”并非固定不变,而是由BOOT配置决定。
需要特别注意的是,BOOT引脚是在复位释放的瞬间被采样的,采样结果被锁存到启动配置寄存器中。此后即使改变BOOT引脚电平,也不会影响本次运行,只有下一次复位才会重新采样。这解释了一个常见现象:用跳线把BOOT0拉高进入下载模式,下载完成后把跳线拨回低电平,程序并不会立即运行,必须再复位一次。因此,量产测试工装或自动下载电路通常会用MCU的一个GPIO去控制BOOT0,并在下载完成后拉低BOOT0再触发复位。
二、BOOT0与BOOT1的组合含义
STM32F1系列有BOOT0和BOOT1两个引脚,而STM32F4、F7、H7等系列通常只有BOOT0引脚,BOOT1的功能被选项字节(Option Bytes)中的nBOOT1位取代。以最常见的F1为例,启动模式由两个引脚共同决定:
| BOOT1 | BOOT0 | 启动模式 | 启动区域 |
|---|---|---|---|
| x | 0 | 主闪存启动 | 主Flash(0x0800 0000) |
| 0 | 1 | 系统存储器启动 | 系统存储器(0x1FFF F000) |
| 1 | 1 | 内嵌SRAM启动 | SRAM(0x2000 0000) |
BOOT0为低电平时,无论BOOT1为何值,都从主闪存启动,这是产品正常运行时的标准配置。BOOT0为高、BOOT1为低时进入系统存储器,也就是常说的“ISP下载模式”,此时运行的是ST出厂固化的Bootloader。BOOT0和BOOT1都为高时从SRAM启动,主要用于调试阶段把程序直接加载到RAM中运行,掉电即失,不用于量产。
三、三种启动区域的映射关系
理解启动模式,本质是理解“启动地址被重映射到哪块物理存储区”。STM32采用地址重映射机制:无论从哪个区域启动,CPU看到的启动地址都是0x0000 0000,但该地址实际指向的物理存储区随BOOT配置切换。下图展示了这一映射关系。
从图中可以看到,主闪存启动时,0x0000 0000被重映射到0x0800 0000,用户程序的中断向量表就位于主闪存起始处。系统存储器启动时,0x0000 0000指向0x1FFF F000,运行的是ST的Bootloader,它通过USART1、USB DFU或CAN等接口接收上位机下发的固件,再写入主闪存。SRAM启动时,0x0000 0000指向0x2000 0000,适合把程序加载到RAM中快速验证。
四、实际配置与操作要点
在硬件设计上,BOOT0通常通过一个10kΩ电阻下拉到GND,保证默认从主闪存启动;同时预留跳线或测试点,便于量产时拉高进入ISP。BOOT1在F1系列上一般直接下拉到GND,因为产品运行不需要SRAM启动。对于只有BOOT0的F4/F7/H7系列,只需关注BOOT0电平,nBOOT1位在选项字节中默认配置为从主闪存启动。
使用串口ISP下载时,典型操作流程是:将BOOT0拉高、BOOT1保持低电平,复位芯片,此时运行系统Bootloader;用Flash Loader Demonstrator或STM32CubeProgrammer通过USART1连接,选择目标固件并下载;下载完成后将BOOT0拉低,再次复位,程序从主闪存运行。如果下载后忘记拉低BOOT0,芯片会一直停留在Bootloader中,表现为“程序不运行”。
五、常见问题与判断依据
当遇到“烧录成功但不运行”时,首先用万用表测量BOOT0在复位后的电平,确认是否为低;若为高,检查跳线或GPIO控制逻辑。其次确认下载地址是否正确,主闪存启动要求程序链接地址从0x0800 0000开始,若链接脚本误设为0x0000 0000,虽然能下载,但复位向量取出的内容可能不是有效栈顶和入口地址,导致HardFault。再次,若使用系统存储器启动,需确认所选串口与Bootloader支持的接口一致,F1的Bootloader默认使用USART1(PA9/PA10),且波特率需匹配。
对于从SRAM启动的调试场景,需注意SRAM启动不会自动初始化.data段和清零.bss段,这些工作必须由启动代码完成,否则全局变量初值不正确。因此SRAM启动通常只用于特定调试目的,不作为量产方案。
总结来看,BOOT引脚决定复位后从哪块存储区取向量,启动地址0x0000 0000通过重映射指向主闪存、系统存储器或SRAM。主闪存是产品运行的标准区域,系统存储器用于ISP下载,SRAM用于调试。掌握采样时机、映射关系和配置要点,就能快速定位启动类故障,并在量产部署中设计出可靠的BOOT控制电路。