烧录协议基础:SWD、JTAG、UART 怎么选?

烧录协议,说白了就是烧录工具和芯片之间沟通的“语言”。你选对了协议,烧录就顺风顺水;选错了,可能连设备都认不出来。我刚开始做嵌入式那会儿,就吃过这个亏——拿着 JTAG 去烧一颗只支持 SWD 的芯片,折腾了半天才发现是协议不匹配。

这一章,我把三种主流协议掰开揉碎讲清楚。你不需要背任何寄存器,只需要理解它们各自的特点和适用场景。

SWD 协议:ARM 芯片的“亲儿子”

SWD(Serial Wire Debug)是 ARM 公司专门为 Cortex-M 系列设计的调试接口。它只用两根线:SWDIO(数据线)和 SWCLK(时钟线)。

我个人习惯在调试低引脚数的 MCU 时首选 SWD。比如 STM32F0 系列,总共才 20 个引脚,你不可能为了烧录占用太多 IO。SWD 两根线就能搞定,省下的引脚可以留给传感器或通信接口。

SWD 核心特点:
  • 引脚少:最少只需 2 根信号线(SWDIO + SWCLK)
  • 速度快:最高可达 50 MHz 时钟频率
  • 支持热插拔:带电连接一般不会损坏接口
  • 兼容性好:所有 ARM Cortex-M 芯片都支持
我的经验: 如果你用 J-Link 或 DAP-Link 调试器,SWD 模式下的传输速率通常比 JTAG 更快。因为 SWD 协议开销更小,握手过程更简洁。

JTAG 协议:老牌工业标准

JTAG(Joint Test Action Group)诞生于 1985 年,最初是为了测试 PCB 板级连接。后来被广泛用于芯片调试和烧录。它需要 4 根信号线:TMS(模式选择)、TCK(时钟)、TDI(数据输入)、TDO(数据输出)。

JTAG 的优势在于它的“链式结构”。你可以把多个芯片的 JTAG 接口串联起来,形成一个扫描链。我在做 FPGA 项目时,经常需要同时烧录 FPGA 和配置芯片,JTAG 链式连接就特别方便——一根线缆搞定所有设备。

注意: JTAG 的引脚占用比 SWD 多一倍。如果你的板子空间紧张,或者芯片引脚数很少,JTAG 可能不是最佳选择。我曾经在一个 0.5mm 间距的 BGA 封装上布线 JTAG,那叫一个痛苦。

UART 串口烧录:最通用的“备胎”

UART(Universal Asynchronous Receiver/Transmitter)串口烧录,本质上就是通过串口把固件数据发送给芯片内部的 Bootloader。它只需要 TX、RX 两根线(加上 GND)。

很多芯片出厂时内部就固化了一个串口 Bootloader。比如 STM32 的 System Memory 模式、ESP32 的下载模式。你不需要额外的调试器,一根 USB 转串口线就能烧录。

但 UART 烧录有个明显的缺点:速度慢。串口的波特率通常限制在 115200 或 460800,传输 1MB 的固件可能要等十几秒。相比之下,SWD 或 JTAG 几秒钟就能搞定。

UART 烧录适用场景:
  • 产品量产时的固件更新(成本低,不需要调试器)
  • 现场维护(工程师只带一根串口线)
  • 芯片首次烧录(出厂 Bootloader 模式)

三种协议对比:一张表看懂

特性 SWD JTAG UART
信号线数量 2 根 4 根 2 根
最大时钟频率 50 MHz 50 MHz 通常 115200 bps
是否需要调试器 需要 需要 不需要(串口即可)
链式多设备支持 不支持 支持 不支持
热插拔支持 支持 部分支持 支持
传输速度 快 快 慢
适用芯片 ARM Cortex-M ARM、FPGA、DSP 几乎所有 MCU

如何选择烧录协议?

这个问题没有标准答案,但你可以根据以下几个维度来判断:

  1. 芯片类型: ARM Cortex-M 优先选 SWD;FPGA 或 DSP 选 JTAG;普通 8 位 MCU 选 UART。
  2. 引脚资源: 引脚紧张选 SWD 或 UART;引脚充裕选 JTAG。
  3. 速度要求: 量产烧录选 SWD 或 JTAG;调试阶段无所谓。
  4. 成本控制: 不想买调试器选 UART;愿意投资调试器选 SWD。
  5. 多设备烧录: 需要同时烧录多个芯片选 JTAG 链式连接。
我的建议: 如果你刚开始学习嵌入式,先掌握 SWD 和 UART 两种协议。SWD 用于日常调试,UART 用于量产和现场维护。JTAG 等你遇到 FPGA 或复杂多芯片项目时再学也不迟。

协议选择决策流程图

下面这张图帮你快速决策:

烧录协议选择决策流程图 烧录协议选择决策流程 开始选择协议 芯片类型是什么? ARM Cortex-M SWD 协议 FPGA/DSP JTAG 协议 普通 MCU UART 协议 引脚紧张?选 SWD 决策说明 SWD 适合 ARM 芯片且引脚少;JTAG 适合多设备链式烧录;UART 适合低成本量产 实际项目中,建议同时支持 SWD 和 UART 两种方式,兼顾调试和量产

避坑指南:我踩过的那些坑

做嵌入式这些年,我在烧录协议上栽过不少跟头。分享几个典型问题:

  • SWD 引脚被复用: 有一次我把 SWDIO 引脚配置成了普通 GPIO,结果调试器死活连不上。后来才发现是初始化代码把调试接口给关了。解决办法:在芯片初始化前保留 SWD 功能,或者用“连接复位”模式。
  • JTAG 链式连接时序问题: 链式连接时,所有芯片的 TCK 必须同步。如果线缆太长或阻抗不匹配,高频时钟下会出现数据错位。我后来在 TCK 线上加了 22Ω 的串联电阻,问题就解决了。
  • UART 烧录波特率不匹配: 芯片内部的 Bootloader 通常有固定的波特率。如果你用的串口工具波特率设置不对,烧录就会失败。我的习惯是:先发一个 0x7F 的同步字节,等芯片回 ACK 后再开始传输。
重要提醒: 无论用哪种协议,烧录前一定要确认芯片的供电电压和调试器的电平匹配。3.3V 的芯片接 5V 的调试器,轻则烧录失败,重则烧毁芯片。我见过太多这样的案例了。