3. 烧录原理与协议:从波形到固件落地的完整链路
烧录这件事,说白了就是把编译好的二进制文件,通过某种物理通道写进芯片的非易失性存储器里。听起来简单,但量产线上每多花 0.5 秒,乘以十万片就是十几个小时。我见过太多项目因为烧录环节没选对协议,最后产线跑不起来,只能返工改硬件。
这一章我们就把常见烧录协议掰开揉碎,再串成一条完整的烧录流程。你理解了背后的原理,选方案的时候心里就有底了。
3.1 四大烧录协议:选对路子,事半功倍
量产烧录常用的协议就四种:USB、UART、SPI、JTAG。它们各有各的脾气,适用场景也不一样。我按个人习惯,从最通用的开始讲。
3.1.1 USB 烧录:快,但依赖芯片内置 BootROM
USB 烧录是目前消费电子量产的主流方案。芯片上电后,内置的 BootROM 先检测 USB 口有没有主机请求,有的话就直接进入下载模式。
- 优点:速度快(USB 2.0 High-Speed 可达 480 Mbps),不需要额外烧录器,一根 USB 线搞定。
- 缺点:芯片必须内置支持 USB 的 BootROM,且主机端需要装驱动或工具。
- 典型场景:手机、平板、物联网模组(ESP32、STM32 的 DFU 模式)。
3.1.2 UART 烧录:简单可靠,但慢
UART 烧录是很多工程师的入门选择。它只需要 TX、RX、GND 三根线,配合芯片的 BootROM 就能工作。速度一般跑 115200 bps 或 921600 bps,再高就容易丢包了。
- 优点:硬件简单,几乎所有 MCU 都支持,调试方便。
- 缺点:速度慢,大固件(比如几 MB)烧起来很煎熬。
- 典型场景:小容量 MCU(如 STM32F103 的串口 ISP)、产线调试口复用。
3.1.3 SPI 烧录:离线烧录的主力
SPI 烧录通常用于外部 Flash(如 W25Q64)或支持 SPI Slave 模式的芯片。量产时常用离线烧录器(如 Dediprog、Xeltek)直接夹住 Flash 芯片烧录,烧完再贴片。
- 优点:速度快(SPI 时钟可达 50 MHz 以上),可以离线批量操作。
- 缺点:需要额外的烧录器硬件,且只能烧录 SPI 接口的存储设备。
- 典型场景:Nor Flash、Nand Flash 预烧录,或者芯片通过 SPI 从外部 Flash 启动。
嗯,这里要注意:SPI 烧录的时序很关键。不同 Flash 厂商的指令集略有差异,量产工具必须能自动识别 Flash ID 并匹配算法。我见过有人把 W25Q64 的烧录算法用在 GD25Q64 上,结果校验一直失败,折腾了两天才发现是读 ID 的指令时序差了几个时钟周期。
3.1.4 JTAG/SWD 烧录:调试与烧录一体
JTAG 和 SWD(ARM 的简化版)是调试接口,但也能用来烧录。它们通过边界扫描或内存访问直接操作芯片的 Flash 控制器。
- 优点:可以同时烧录和调试,支持单步、断点,适合开发阶段。
- 缺点:引脚多(JTAG 需要 5 根线),速度受限于调试器(一般 10-50 MHz)。
- 典型场景:开发调试、小批量产、需要加密烧录的场景。
3.2 烧录流程:四步走,一步都不能省
不管用哪种协议,烧录的底层逻辑都是一样的:识别、擦除、写入、校验。这四步缺一不可,顺序也不能乱。我画了一张流程图,你看完就明白了。
3.2.1 识别:先确认你是谁
烧录器上电后,第一件事就是和芯片握手。通常的做法是发送读 ID 指令,芯片返回自己的厂商 ID、设备 ID 和版本号。量产工具拿到这些信息后,和配置文件里的白名单比对,匹配了才继续往下走。
为什么要做这一步?我遇到过最坑的一次,产线工人把两种不同型号的芯片混料了,外观一模一样,但 Flash 容量差了一倍。如果没有识别步骤,直接擦除写入,轻则烧录失败,重则把芯片锁死。所以识别这一步,是量产的第一道防线。
3.2.2 擦除:清空才能重写
Flash 存储器的特性决定了它只能从 1 写为 0,不能从 0 写为 1。所以写入前必须先把目标区域擦除成全 1(即 0xFF)。擦除的最小单位通常是扇区(Sector)或块(Block),整片擦除虽然快,但会清掉所有数据,包括校准参数和序列号。
量产时我建议按扇区擦除,只擦除固件占用的区域。保留校准区和序列号区不动,这样即使固件升级失败,芯片还能回退到上一版。
| 擦除方式 | 速度 | 风险 | 推荐场景 |
|---|---|---|---|
| 整片擦除 | 最快(几百 ms) | 清空所有数据 | 首次量产、空片 |
| 扇区擦除 | 较慢(每扇区几十 ms) | 保留非目标区域 | 固件升级、保留校准数据 |
| 块擦除 | 介于两者之间 | 按块粒度控制 | 大容量 Flash 分区管理 |
3.2.3 写入:把固件搬进去
擦除完成后,就可以把固件数据按页(Page)或块写入 Flash。写入速度取决于协议带宽和 Flash 的编程时间。比如 SPI Flash 写一页(256 字节)大约需要 1-5 ms,而 USB 批量传输一包 512 字节只需要几十微秒。
写入时有个容易被忽略的细节:对齐。很多 Flash 要求写入地址必须按页对齐,否则会报错。量产工具必须自动处理地址对齐和填充,不能把这个问题抛给操作员。
3.2.4 校验:确保万无一失
写入完成后,必须把 Flash 里的数据读回来,和原始固件做比对。校验方式有两种:
- 逐字节比对:最可靠,但速度慢。适合小容量芯片。
- CRC 或哈希校验:速度快,但存在碰撞概率(极低)。适合大容量固件。
量产时我建议两种都用:写入过程中每写完一页就计算一次 CRC,写入完成后随机抽几个地址做逐字节比对。这样既保证了速度,又覆盖了极端情况。
3.3 量产烧录的常见坑与对策
讲完了原理和流程,最后分享几个我在产线上踩过的坑,希望能帮你省点时间。
- 电源不稳导致烧录失败:芯片在擦除和写入时电流会突然增大,如果电源纹波太大,Flash 编程就会出错。对策是在烧录夹具上加一颗 100 µF 的电解电容,靠近芯片供电引脚。
- 接触不良:探针或烧录座用久了会氧化,导致信号衰减。我建议每 10 万次烧录后更换一次探针,或者用带自清洁功能的探针。
- 固件版本管理混乱:产线上同时跑多个项目时,操作员容易拿错固件。量产工具必须绑定固件文件的 MD5 校验值,文件不对直接拒绝烧录。
- 序列号重复:如果烧录工具没有独立的序列号管理模块,很容易出现两台电脑同时烧录导致序列号冲突。我习惯用中心服务器分配序列号段,每台烧录器预领 1000 个号,用完再申请。
好了,烧录原理和协议这部分就讲到这里。你把这些基础打牢了,后面讲量产工具架构和定制开发的时候,就能更快上手。