4. STM32固件烧录与量产编程

研发阶段的烧录通常只关心“程序能不能跑起来”,而量产阶段的烧录要同时满足三个硬指标:节拍、一致性、可追溯。一条日产 2000 台的产线,如果单板烧录耗时 25 秒,仅烧录工位就需要 2 个以上才能跟上节拍;而一旦出现序列号重复、MAC 地址冲突或烧录未校验就放行,返工成本会远高于烧录本身。本节围绕烧录器选型、离线烧录、多路并行、动态数据写入和校验防错展开。

一、烧录方式与烧录器选型

STM32 的固件写入主要有三条路径:SWD/JTAG 调试口烧录、系统存储器 Bootloader(UART/I2C/SPI/CAN/USB DFU)烧录、以及出厂预烧录。量产中最常用的是 SWD,因为它速度快、可读写任意 Flash 区域、可访问选项字节,并且能配合烧录器实现序列号动态写入。

选型时不要只看“支持不支持 STM32”,而要逐项核对以下参数:

  • 目标芯片与 Flash 容量:是否覆盖 STM32F0/F1/F4/G0/G4/H7 等全系列,是否支持双 Bank、外部 QSPI Flash 烧录。
  • 烧录速度:以 256 KB 固件为例,优质量产烧录器在 SWD 4 MHz 下约 3~6 秒完成擦除+写入+校验,低速调试器可能超过 20 秒。
  • 离线能力:是否支持脱机运行、内置存储、按键触发、结果指示(LED/蜂鸣/继电器)。
  • 并行通道数:1/2/4/8 路,通道间是否真正独立(独立供电、独立信号、独立结果判定)。
  • 动态数据支持:是否支持从文件、计数器或脚本生成序列号/MAC/密钥并写入指定地址。
  • 接口与集成:是否提供 SDK、命令行、MES 对接接口、扫码枪输入。

常见方案中,ST-LINK/V2、J-Link 适合研发与小批量;量产则多采用专用离线烧录器(如支持多路并行的量产型编程器),或自研“工装 + 多路 ST-LINK + 上位机”的方案。前者稳定、防错强,后者灵活、成本可控,但需要自行实现校验与追溯逻辑。

二、离线烧录与多路并行

离线烧录的核心价值是脱离 PC 独立运行:把固件、配置和动态数据规则预先下载到烧录器内部存储,产线工人只需放板、按键或踩脚踏,烧录器自动完成擦除、写入、校验、写选项字节,并用 LED/蜂鸣器给出 OK/NG。这样既减少 PC 死机、USB 掉线带来的停线风险,也降低了操作门槛。

多路并行不是简单地把几路烧录器并排。真正影响良率和节拍的是:

  • 供电独立性:每路单独 LDO 或限流,避免某路短路拖垮全部通道。
  • 信号隔离:SWCLK/SWDIO/NRST 建议加缓冲或隔离,防止一路异常拉低总线。
  • 结果独立判定:每路单独 OK/NG 指示,不能“一路通过全部通过”。
  • 节拍匹配:4 路并行时,单板平均耗时约为单路的 1/3~1/4,但受夹具上下料时间限制,实际提升通常为 2.5~3.5 倍。

下面这张图给出了一条典型的 4 路并行离线烧录工位的数据流与防错关系:固件与动态数据规则先下发到烧录器,烧录器对 4 块板卡独立执行“擦除→写入→校验→写选项字节→回读比对”,只有全部通过才允许进入下一工位。

4 路并行离线烧录工位:数据流与防错关系 烧录准备(PC 侧) 固件 .hex/.bin 序列号/MAC 规则文件 选项字节配置 校验算法与地址表 下发 离线烧录器 内部存储固件+规则 脱机运行,无需 PC 按键/脚踏触发 OK/NG 声光指示 4 路独立 通道 1 · 板卡 SWD + 独立供电 通道 2 · 板卡 SWD + 独立供电 通道 3 · 板卡 SWD + 独立供电 通道 4 · 板卡 SWD + 独立供电 擦除 + 写入 固件 + 动态数据 校验 + 回读 CRC/逐字节比对 写选项字节 读保护/看门狗 结果判定 OK 放行 / NG 拦截 动态数据写入(序列号 / MAC) ① 规则:SN = 前缀 + 日期 + 4 位递增序号 ② 地址:SN 写入 0x0801F800,MAC 写入 0x0801F80C ③ 唯一性:烧录器内部计数器 + 上位机数据库双校验 ④ 冲突处理:发现重复立即 NG,禁止覆盖已用号段 ⑤ 追溯:SN/MAC 与工位、时间、操作员绑定入库 ⑥ 防错:写入后回读比对,不一致判 NG 烧录校验与防错要点 • 固件 CRC32 与源文件比对,防止传输损坏 • 回读 Flash 逐字节/分块比对,不只看“写入成功” • 选项字节校验:读保护等级、BOR、看门狗 • 芯片 ID / UID 读取,防止空片或错料 • 烧录前检测短路/过流,保护工装与板卡 • NG 板卡物理隔离,禁止流入下一工位 关键原则:先校验再放行,动态数据唯一且可追溯,NG 必须被物理拦截

三、序列号与 MAC 地址动态写入

动态数据写入是量产烧录区别于研发烧录的核心。常见做法是:在固件中预留固定地址区域(例如 0x0801F800 起 16 字节),烧录器在写入主固件后,把生成的序列号和 MAC 写入该区域,再回读比对。

一个可参考的规则示例:序列号格式为 SN-YYYYMMDD-NNNN,其中 NNNN 为当日 4 位递增序号;MAC 地址从 IEEE 分配的 OUI 段(例如 00:1A:2B)起顺序分配。烧录器内部维护计数器,上位机数据库记录已用号段,两者在开工前同步一次,避免跨班次重复。

// 固件中预留的动态数据区(示例)
#define SN_ADDR    0x0801F800
#define MAC_ADDR   0x0801F80C

typedef struct {
    char     sn[16];   // "SN-20250401-0001"
    uint8_t  mac[6];   // 00:1A:2B:xx:xx:xx
    uint32_t crc;      // 上述数据的 CRC32
} ProdInfo_t;

烧录器写入后,应回读该结构体并重新计算 CRC,与写入值比对。若不一致,说明写入过程受干扰或 Flash 未擦净,必须判 NG。对于 MAC 地址,还要注意不能写入广播地址、组播地址或全 0/全 F,这些应在规则层直接拦截。

四、烧录校验与防错闭环

很多产线事故不是“烧不进去”,而是“烧进去了但没校验”或“校验了但没拦截”。完整的防错闭环至少包含四层:

  1. 源文件校验:烧录前对 .hex/.bin 计算 CRC32 或 SHA-256,与发布版本比对,防止拿错固件。
  2. 写入后回读校验:擦除后先读空片确认全 0xFF,写入后逐块回读比对,而不是只信任烧录器的“成功”状态。
  3. 选项字节校验:读回 RDP、BOR、IWDG 等配置,确认与量产要求一致;读保护等级写错可能导致整批芯片无法再次烧录。
  4. 结果拦截:NG 板卡用红灯、蜂鸣或机械挡停物理隔离,并记录 SN、工位、时间、失败原因,便于追溯。
注意:读保护(RDP)等级一旦从 Level 0 提升到 Level 1,再降回 Level 0 会触发整片擦除。量产中若需要返修,必须提前规划 RDP 策略,避免“烧录即锁死”。

实际产线中,建议把烧录工位的判定结果与 MES 或本地数据库绑定:每块板卡烧录完成后,记录 SN、MAC、固件版本、烧录时间、工位号、结果。这样一旦客户端出现 MAC 冲突或版本异常,可以快速定位到具体批次和操作记录。烧录不是孤立动作,而是量产数据链的起点。