从零搞懂STM32F4:自举、Bootloader和ISP烧录的“前世今生”
本帖最后由 DKENNY 于 2025-7-5 17:35 编辑#申请原创# #技术资源#@21小跑堂
前言
大家好!作为STM32新手,我刚开始学STM32F4时,对“芯片自举”和“Bootloader”傻傻分不清,尤其看到参考手册里说“自举程序”支持串口(USART)和CAN烧录,更懵了:这俩到底啥区别?ISP烧录又是啥?串口和CAN跟它啥关系?今天跟大家简单分享一下。
一、芯片自举和Bootloader:用门锁比喻搞清楚
咱们先用一个生活化的比喻,把“芯片自举”和“Bootloader”区分开:
- 芯片自举:假设我们有个智能门锁,通电后,它会自动跑一个“开机程序”(厂家固化在里面)。这个程序只干一件事:根据你按的按钮(比如“开门”或“设置”),决定是直接开锁,还是进入“更新模式”。在STM32F4里,自举程序(System Boot)是芯片上电后第一时间运行的“引导员”,根据BOOT引脚的状态,决定从哪里(Flash、系统存储器、SRAM)开始跑代码。
- Bootloader:这就像你给门锁装了个“高级管理程序”,可以通过手机App更新门锁的固件(比如加个新功能)。这个程序不是门锁出厂自带的,而是用户或厂家烧进去的,功能更灵活。STM32F4的Bootloader是“程序管家”,负责通过串口(USART)、CAN等接口接收新程序并写入Flash。
一句话区别:
- 自举是芯片自带的“导航员”,只负责“指路”,决定启动哪块代码。
- Bootloader是“搬运工”,负责接收新程序、写入Flash,方便更新固件。
为啥容易混淆?
因为STM32F4的系统存储器(ROM)里同时有自举程序和ST公司提供的内置Bootloader,尤其在ISP烧录时,两者都参与了,容易让人觉得是一个东西。其实它们是“接力”关系:自举先跑,Bootloader后干活。
简单图示描述
二、STM32F4的芯片自举:它到底干啥?
1. 自举的本质
根据STM32F4参考手册,自举程序是ST公司固化在系统存储器(System Memory,ROM,地址从0x1FFF 0000开始)里的一段小程序。你无法修改它,也看不到代码。它的任务是:上电后,根据BOOT0和BOOT1引脚的电平,决定芯片从哪里启动代码。
2. 自举的工作流程
1. 上电:给STM32F4开发板通电,芯片开始工作。
2. 运行自举程序:芯片自动跳转到系统存储器的自举程序。
3. 检查BOOT引脚:自举程序读取BOOT0和BOOT1的状态:
- BOOT0=0,BOOT1=任意:从主Flash存储器(Main Flash Memory)启动,跑你烧录的程序(比如点灯代码)。
- System: 芯片自举:STM32F4的“导航员”,上电后第一时间运行,根据BOOT引脚状态决定启动区域(Flash、系统存储器或SRAM)。
- Bootloader:STM32F4的“程序管家”,负责通过接口(如USART或CAN)接收新程序并写入Flash,方便固件更新。
- ISP(系统内编程):一种通过通信接口(如USART或CAN)烧录程序的方式,依赖内置Bootloader实现,USART是最常用的接口,CAN适用于工业场景。
手册中的“自举烧录”:指自举程序跳转到内置Bootloader,由Bootloader完成串口或CAN烧录。
三、ISP烧录的完整过程:自举和Bootloader的角色
以通过USART的ISP烧录为例,详细拆解过程(CAN烧录类似,只是接口不同):
1. 设置BOOT引脚:
- 将开发板的BOOT0设为1,BOOT1设为0(用跳帽或开关,查开发板说明书)。
- 这告诉自举程序进入“系统存储器”模式。
2. 上电,运行自举程序:
- 芯片通电,自举程序(ROM里)自动运行。
- 自举程序检测BOOT0=1、BOOT1=0,跳转到系统存储器的内置Bootloader。
- 自举的角色:像个“导航员”,根据BOOT引脚把控制权交给Bootloader,然后退出。
3. Bootloader接管:
- 内置Bootloader启动,初始化USART接口(比如UART1,PA9/PA10)。
- 你用STM32CubeProgrammer通过USB转串口模块(如CH340)发送程序(.hex或.bin)。
- Bootloader接收数据,擦除Flash指定区域,写入新程序,验证正确性。
- Bootloader的角色:像个“搬运工”,把程序从串口搬到Flash。
4. 运行新程序:
- 烧录完成后,改BOOT0为0,复位芯片。
- 自举程序检测BOOT0=0,跳转到Flash,运行新程序(比如点灯)。
与CAN烧录的区别:
- 硬件:用CAN收发器(如TJA1050)连接CAN2引脚(比如PB5/PB13)。
- 软件:用STM32CubeProgrammer的CAN模式发送程序,Bootloader通过CAN协议接收。
- 流程类似,但CAN更适合抗干扰的工业环境,配置稍复杂。
简单图示描述
四、为什么手册说“自举程序”支持串口/CAN烧录?
STM32F4参考手册和AN2606(Bootloader应用笔记)提到“自举程序”支持USART/CAN烧录,容易让人误以为自举程序直接处理烧录。其实,手册里的“自举程序”是个广义说法,指整个启动过程,包括:
- 自举程序:只负责根据BOOT引脚跳转到内置Bootloader。
- 内置Bootloader:真正处理串口(USART)或CAN烧录。
澄清:自举程序不直接处理通信或烧录,它只是把芯片“带到”Bootloader,Bootloader才通过USART/CAN接收程序、写入Flash。
五、ISP、USART和CAN的关系
- ISP(系统内编程):一种烧录方式,通过芯片的通信接口(USART、CAN、USB等)把程序写入Flash,依赖内置Bootloader。
- USART:串口通信接口,STM32F4的Bootloader支持UART1/3等,ISP最常用的方式(简单、成本低)。
- CAN:控制器局域网接口,Bootloader支持CAN2,适合工业场景(抗干扰强,但需要CAN收发器)。
关系:
- ISP是目标(烧录程序),USART和CAN是实现ISP的“通道”。
- 两者都靠Bootloader处理数据,自举程序只负责跳转。
- 新手推荐用USART(简单),CAN多用于专业项目。
六、两者的区别和角色(表格总结)
特性
芯片自举
内置Bootloader
本质
固化在ROM的引导程序
固化在ROM的程序管理器
存储位置
系统存储器(ROM,不可改)
系统存储器(ROM,也不可改)
功能
根据BOOT引脚选择启动区域
通过USART/CAN等接收程序,写入Flash
ISP烧录角色
检查BOOT引脚,跳转到Bootloader
接收串口/CAN数据,写入Flash
接口支持
无(只检查引脚)
USART、CAN、USB等
灵活性
固定,无法修改
固定,但可被用户自定义Bootloader替代
七、新手常见问题和注意事项
1. BOOT引脚怎么设置?
- 查开发板说明书或原理图,找到BOOT0/BOOT1的跳帽或开关。ISP烧录设BOOT0=1,BOOT1=0;正常运行设BOOT0=0。
2. USART烧录需要什么?
- 硬件:USB转串口模块(CH340、FT232R),接UART引脚(比如PA9/PA10)。
- 软件:STM32CubeProgrammer,选串口模式,波特率通常115200。
- 确保线序正确,驱动正常。
3. CAN烧录怎么弄?
- 硬件:CAN收发器(TJA1050),接CAN2引脚(比如PB5/PB13)。
- 软件:STM32CubeProgrammer(CAN模式)或专用CAN工具,波特率如250kbps。
- 查AN2606确认协议要求。
4. 烧录失败怎么办?
- 检查BOOT引脚设置。
- 确认接口连接(串口线、CAN收发器)。
- 检查Flash是否锁定(用CubeProgrammer解锁)。
- 试降低波特率或换设备。
5. 需要自己写Bootloader吗?
- 新手用ST的内置Bootloader就够,ISP烧录完全支持。想加WiFi、蓝牙更新功能,可学写自定义Bootloader。
八、总结:从懵圈到搞懂
简单总结一下:
- 芯片自举是STM32F4的“开机导航员”,上电后根据BOOT引脚决定去Flash跑程序,还是去Bootloader烧录。
- Bootloader是“程序搬运工”,通过USART(串口)或CAN接收新程序,写入Flash,ISP烧录全靠它。
- ISP烧录是把程序通过通信接口(常用USART,工业用CAN)写入Flash的方式,自举负责跳转,Bootloader负责烧录。
- 手册的“自举烧录”是个广义说法,指自举跳转到Bootloader,由Bootloader完成串口/CAN烧录。
简单举个例子:
你做个STM32F4的智能灯项目,这样能够更好理解其区别:
- 正常运行:BOOT0=0,自举跳转Flash,跑点灯程序。
- 更新程序:BOOT0=1,自举跳转Bootloader,Bootloader通过串口(或CAN)接收新程序,写入Flash,再改BOOT0=0运行。
参考文档:
页:
[1]