烧录协议基础:从物理层到实战选型
做量产烧录这些年,我最大的体会就是——协议选对了,后面能省一半的折腾。你想想看,产线上几百台设备同时跑,如果协议不稳定或者速度跟不上,那可不是改几行代码能解决的。
这一章,咱们就把几种主流烧录协议掰开揉碎讲清楚。我会结合自己踩过的坑,帮你建立一套「什么场景该用什么协议」的判断力。
UART 烧录协议详解
UART 烧录,说白了就是通过串口把固件灌进芯片。它可能是最古老、也最通用的方式了。我最早接触量产烧录时,用的就是 UART。
为什么 UART 能烧录?
芯片出厂时,ROM 里有一段固化代码(叫 Bootloader)。上电后,它先检查某个引脚的电平——比如拉低就进入烧录模式。然后通过 UART 接收数据,写入 Flash。
这个过程其实很简单:
- 芯片上电,Bootloader 启动
- 检测烧录触发条件(引脚电平/无有效程序)
- 通过 UART 接收握手信号
- 按协议格式接收固件数据
- 写入 Flash,校验,完成
核心参数:波特率、数据位(8)、停止位(1)、校验位(无/奇/偶)。量产时我建议用 115200 或 460800,再高容易丢包。
我在项目中遇到过一件事:某款芯片的 Bootloader 有 bug,波特率超过 230400 就会随机丢字节。排查了整整两天,最后发现是芯片 errata 里写着呢……从那以后,我养成了先看勘误表的习惯。
UART 烧录的优缺点
| 优点 | 缺点 |
|---|---|
| 引脚少(TX/RX/GND 三根线) | 速度慢(通常 < 1MB/s) |
| 几乎所有 MCU 都支持 | 无硬件流控,长线易受干扰 |
| 协议简单,容易实现 | 无校验机制(需软件层加) |
| 调试方便,串口工具遍地都是 | 不适合大容量固件(> 1MB) |
我的建议:如果固件小于 512KB,产线节拍要求不高,UART 是最省成本的选择。线缆用屏蔽双绞线,长度控制在 1.5 米以内。
SPI / I2C 烧录协议对比
这两种协议在烧录场景里,通常不是直接烧 MCU,而是烧外挂的 Flash 或 EEPROM。说白了,就是「离线烧录」或「在线编程」时用的。
SPI 烧录
SPI 是四线制:SCK、MOSI、MISO、CS。全双工,速度快。我见过最快的 SPI Flash 烧录器能跑到 80MHz,每秒灌 10MB 数据。
SPI 烧录的典型流程:
- 发写使能命令(0x06)
- 发扇区擦除命令(0x20)
- 等待擦除完成(读状态寄存器)
- 发页编程命令(0x02)+ 地址 + 数据
- 等待编程完成
- 读回校验
// SPI Flash 页写入示例(伪代码)
void spi_flash_page_write(uint32_t addr, uint8_t *data, uint16_t len) {
spi_cs_low();
spi_send_byte(0x06); // 写使能
spi_cs_high();
spi_cs_low();
spi_send_byte(0x02); // 页编程命令
spi_send_byte((addr >> 16) & 0xFF); // 地址高字节
spi_send_byte((addr >> 8) & 0xFF); // 地址中字节
spi_send_byte(addr & 0xFF); // 地址低字节
for (uint16_t i = 0; i < len; i++) {
spi_send_byte(data[i]);
}
spi_cs_high();
// 等待忙状态结束
while (spi_flash_is_busy());
}
I2C 烧录
I2C 是两线制:SCL、SDA。半双工,速度慢(标准模式 100kHz,快速模式 400kHz)。但它有个好处——多设备共用总线。
我记得有个项目,一块板子上挂了 4 个 EEPROM,用 I2C 烧录,一条总线搞定。要是用 SPI,得 4 个 CS 引脚,麻烦不少。
直接对比
| 对比项 | SPI | I2C |
|---|---|---|
| 引脚数 | 4(最少 3) | 2 |
| 速度 | 最高 80MHz+ | 最高 3.4MHz(超快速模式) |
| 通信方式 | 全双工 | 半双工 |
| 多设备支持 | 需独立片选 | 地址寻址,总线共享 |
| 协议复杂度 | 简单 | 中等(有起始/停止/应答) |
| 烧录典型速率 | 2~10 MB/s | 50~400 KB/s |
| 适用场景 | 大容量 Flash | 小容量 EEPROM/配置芯片 |
避坑指南:我曾经在产线上遇到过 I2C 烧录时总线被锁死的情况——某个从机把 SDA 拉低了不释放。后来所有烧录脚本里都加了「总线恢复」步骤:先发 9 个时钟脉冲,再发 STOP 信号。这个习惯我一直保留到现在。
JTAG / SWD 烧录原理
JTAG 和 SWD 是调试接口,但量产烧录时也经常用。尤其是 ARM 内核的芯片,SWD 几乎成了标配。
JTAG
JTAG 是 IEEE 1149.1 标准,最初用于 PCB 边界扫描测试。它有 5 根线:TCK、TMS、TDI、TDO、TRST(可选)。
JTAG 的核心是 TAP(测试访问端口)状态机。通过 TMS 在不同时钟沿切换状态,可以进入「Shift-DR」或「Shift-IR」模式,然后通过 TDI/TDO 移位数据。
烧录时,我们利用 JTAG 的 DAP(调试访问端口) 来读写芯片内存和寄存器。说白了,就是通过 JTAG 把烧录算法加载到芯片 RAM 里,然后让它自己写 Flash。
SWD
SWD 是 ARM 公司搞的简化版,只有两根线:SWDIO(数据)和 SWCLK(时钟)。它用 包序列 代替了 JTAG 的状态机,效率更高。
SWD 的包格式很简单:
- 起始位(1 bit)
- AP/DP 选择(1 bit)
- 读写操作(1 bit)
- 地址(2 bits)
- 数据(32 bits)
- 校验位(1 bit)
- 应答(3 bits)
你看,一个包才 41 个 bit,比 JTAG 的移位操作快多了。
关键区别:JTAG 可以同时调试多核(菊花链),SWD 只能单核。但量产烧录通常只烧一个芯片,SWD 的 2 线优势非常明显。
三种协议选型指南
我整理了一张图,帮你快速决策:
嗯,这张图基本覆盖了 90% 的场景。剩下 10% 是特殊情况,比如用 USB 烧录、用 CAN 烧录,那些咱们后面章节再聊。
实际产线中的协议选择
我最后说一个真实案例。之前做智能家居网关,用的是 ESP32 芯片,固件 1.2MB。一开始用 UART 烧录,波特率 921600,单台烧录要 18 秒。产线一天 2000 台,光烧录就占 10 个小时。
后来改成 SWD 烧录,速度直接拉到 10MHz,单台降到 3 秒。而且 SWD 还能顺便读芯片 ID、校验 Flash 内容,可靠性高了不少。
所以我的建议是:别在协议上省钱。如果量产后发现烧录是瓶颈,改协议的成本远高于一开始就选对。
小技巧:设计电路板时,把 SWD 接口(SWDIO、SWCLK、GND、VCC)用 4pin 排针引出来。哪怕你暂时用 UART 烧录,也留个 SWD 接口。万一要改,焊几根线就行,不用重新 layout。