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 块板卡独立执行“擦除→写入→校验→写选项字节→回读比对”,只有全部通过才允许进入下一工位。
三、序列号与 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,这些应在规则层直接拦截。
四、烧录校验与防错闭环
很多产线事故不是“烧不进去”,而是“烧进去了但没校验”或“校验了但没拦截”。完整的防错闭环至少包含四层:
- 源文件校验:烧录前对 .hex/.bin 计算 CRC32 或 SHA-256,与发布版本比对,防止拿错固件。
- 写入后回读校验:擦除后先读空片确认全 0xFF,写入后逐块回读比对,而不是只信任烧录器的“成功”状态。
- 选项字节校验:读回 RDP、BOR、IWDG 等配置,确认与量产要求一致;读保护等级写错可能导致整批芯片无法再次烧录。
- 结果拦截:NG 板卡用红灯、蜂鸣或机械挡停物理隔离,并记录 SN、工位、时间、失败原因,便于追溯。
实际产线中,建议把烧录工位的判定结果与 MES 或本地数据库绑定:每块板卡烧录完成后,记录 SN、MAC、固件版本、烧录时间、工位号、结果。这样一旦客户端出现 MAC 冲突或版本异常,可以快速定位到具体批次和操作记录。烧录不是孤立动作,而是量产数据链的起点。