DKENNY 发表于 2025-7-5 17:36

从零搞懂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]
查看完整版本: 从零搞懂STM32F4:自举、Bootloader和ISP烧录的“前世今生”