烧录协议基础:SWD、JTAG、UART 怎么选?
烧录协议,说白了就是烧录工具和芯片之间沟通的“语言”。你选对了协议,烧录就顺风顺水;选错了,可能连设备都认不出来。我刚开始做嵌入式那会儿,就吃过这个亏——拿着 JTAG 去烧一颗只支持 SWD 的芯片,折腾了半天才发现是协议不匹配。
这一章,我把三种主流协议掰开揉碎讲清楚。你不需要背任何寄存器,只需要理解它们各自的特点和适用场景。
SWD 协议:ARM 芯片的“亲儿子”
SWD(Serial Wire Debug)是 ARM 公司专门为 Cortex-M 系列设计的调试接口。它只用两根线:SWDIO(数据线)和 SWCLK(时钟线)。
我个人习惯在调试低引脚数的 MCU 时首选 SWD。比如 STM32F0 系列,总共才 20 个引脚,你不可能为了烧录占用太多 IO。SWD 两根线就能搞定,省下的引脚可以留给传感器或通信接口。
- 引脚少:最少只需 2 根信号线(SWDIO + SWCLK)
- 速度快:最高可达 50 MHz 时钟频率
- 支持热插拔:带电连接一般不会损坏接口
- 兼容性好:所有 ARM Cortex-M 芯片都支持
JTAG 协议:老牌工业标准
JTAG(Joint Test Action Group)诞生于 1985 年,最初是为了测试 PCB 板级连接。后来被广泛用于芯片调试和烧录。它需要 4 根信号线:TMS(模式选择)、TCK(时钟)、TDI(数据输入)、TDO(数据输出)。
JTAG 的优势在于它的“链式结构”。你可以把多个芯片的 JTAG 接口串联起来,形成一个扫描链。我在做 FPGA 项目时,经常需要同时烧录 FPGA 和配置芯片,JTAG 链式连接就特别方便——一根线缆搞定所有设备。
UART 串口烧录:最通用的“备胎”
UART(Universal Asynchronous Receiver/Transmitter)串口烧录,本质上就是通过串口把固件数据发送给芯片内部的 Bootloader。它只需要 TX、RX 两根线(加上 GND)。
很多芯片出厂时内部就固化了一个串口 Bootloader。比如 STM32 的 System Memory 模式、ESP32 的下载模式。你不需要额外的调试器,一根 USB 转串口线就能烧录。
但 UART 烧录有个明显的缺点:速度慢。串口的波特率通常限制在 115200 或 460800,传输 1MB 的固件可能要等十几秒。相比之下,SWD 或 JTAG 几秒钟就能搞定。
- 产品量产时的固件更新(成本低,不需要调试器)
- 现场维护(工程师只带一根串口线)
- 芯片首次烧录(出厂 Bootloader 模式)
三种协议对比:一张表看懂
| 特性 | SWD | JTAG | UART |
|---|---|---|---|
| 信号线数量 | 2 根 | 4 根 | 2 根 |
| 最大时钟频率 | 50 MHz | 50 MHz | 通常 115200 bps |
| 是否需要调试器 | 需要 | 需要 | 不需要(串口即可) |
| 链式多设备支持 | 不支持 | 支持 | 不支持 |
| 热插拔支持 | 支持 | 部分支持 | 支持 |
| 传输速度 | 快 | 快 | 慢 |
| 适用芯片 | ARM Cortex-M | ARM、FPGA、DSP | 几乎所有 MCU |
如何选择烧录协议?
这个问题没有标准答案,但你可以根据以下几个维度来判断:
- 芯片类型: ARM Cortex-M 优先选 SWD;FPGA 或 DSP 选 JTAG;普通 8 位 MCU 选 UART。
- 引脚资源: 引脚紧张选 SWD 或 UART;引脚充裕选 JTAG。
- 速度要求: 量产烧录选 SWD 或 JTAG;调试阶段无所谓。
- 成本控制: 不想买调试器选 UART;愿意投资调试器选 SWD。
- 多设备烧录: 需要同时烧录多个芯片选 JTAG 链式连接。
协议选择决策流程图
下面这张图帮你快速决策:
避坑指南:我踩过的那些坑
做嵌入式这些年,我在烧录协议上栽过不少跟头。分享几个典型问题:
- SWD 引脚被复用: 有一次我把 SWDIO 引脚配置成了普通 GPIO,结果调试器死活连不上。后来才发现是初始化代码把调试接口给关了。解决办法:在芯片初始化前保留 SWD 功能,或者用“连接复位”模式。
- JTAG 链式连接时序问题: 链式连接时,所有芯片的 TCK 必须同步。如果线缆太长或阻抗不匹配,高频时钟下会出现数据错位。我后来在 TCK 线上加了 22Ω 的串联电阻,问题就解决了。
- UART 烧录波特率不匹配: 芯片内部的 Bootloader 通常有固定的波特率。如果你用的串口工具波特率设置不对,烧录就会失败。我的习惯是:先发一个 0x7F 的同步字节,等芯片回 ACK 后再开始传输。