SWO(Serial Wire Debug,串行线调试)是ARM为Cortex-M系列处理器设计的两线制调试接口。它用两根线实现了JTAG四线制的主要调试功能,已经成为现代微控制器调试与烧录的主流选择。

核心定位:JTAG的精简与进化

SWD并非要完全取代JTAG,而是在引脚资源有限的情况下提供替代方案。它保留了JTAG的核心调试能力,但放弃了边界扫描功能。

对比项 SWD JTAG
引脚数 2(SWCLK+SWDIO) 4+(TCK/TMS/TDI/TDO)
边界扫描 不支持 支持
调试能力 与JTAG相当 标准
典型场景 小封装MCU、引脚受限 FPGA、复杂板级测试

SWD与JTAG在协议层并不兼容,但许多芯片的调端口(SWJ-DP)支持两种模式切换,通过发送特定的切换序列即可在两种协议之间切换。

物理层:两线制与电气特性

SWD仅需两根信号线即可完成所有的调试通信:

  • SWCLK(Serial Wire Clock):时钟线,由调试器(如J-Link、ST-Link)驱动,单向输入到芯片。
  • SWDIO(Serial Wire Data I/O):双向数据线,在调试器和目标之间分时切换方向,承载请求、应答和数据。

上拉与下拉是保证总线空闲状态确定的关键:SWDIO需要上拉(推荐100K𝛺),SWCLK需要下拉。大多数芯片内部已经集成这些电阻,外部无需额外添加。

SWCLK频率通常可达10MHz甚至更高(视具体芯片),足以满足大多数调试和少虑需求。

协议层:极简的包交换

SWD的通信包(Packet)为单位,每次操作包含三个阶段:

  1. 主机请求包(8 bits)
    调试器发出,包含一下字段:
  • Start:固定为1,标志包开始。
  • APnDP:0表示访问调试端口(DP),1表示访问接入端口(AP)。
  • RnW:0为写,1为读。
  • A[3:2]:寄存器地址的低两位,决定访问哪个寄存器。
  • Parity:前几位(除Start外)的奇偶校验位。
  • Stop:固定为0.
  • Park:主机驱动为高,确保转向期间目标能读到确定的电平。
  1. 目标应答(3 bits)
    目标芯片返回,表示操作结果:
  • 001:OK,操作成功。
  • 010:WAIT,目标忙,请求稍后重试。
  • 100:FAULT,发生错误,需要复位重试。
  1. 数据阶段(33 bits,读写方向而定)
  • 写操作:主机发送32位数据 + 1位奇偶校验。
  • 读操作:目标芯片发送32位数据 + 1位奇偶校验。

转向时间(Turnaround)是SWD协议中一个容易被忽视但很关键的细节:每当SWDIO的驱动发生切换(主机->目标,或目标->主机),协议会插入一个转向周期,期间双方都不驱动线路,避免总线冲突。默认长度为1个时钟周期,可通过寄存器配置为更长。

与SWO的配合:调试信息输出

SWO的调试能力不仅限于“控制”,还支持“观测”。SWO(Serial Wire Output)是SWO的可选扩展,通过一根额外的单线输出实时数据:

  • ITM输出:应用程序可以通过ITM(Instrumentation Trace Macrocell)发送printf风格的调试信息,不占用UART。
  • 数据追踪:记录变量变化、函数调用等。
  • 性能分析:提供PC采样、中断计数等profiling数据。

SWO复用JTAG的TDO引脚,因此SWO只能在SWD模式下使用,JTAG模式下无法使用。

多核与系统级调试

SWD通过DAP(Debug Access Port)访问芯片内部资源。DAP是调试器与芯片调试架构之间的桥梁:

  • DP(Debug Port):管理调试连接的“门户”,处理协议层的事务。
  • AP(Access Port):托过DP访问芯片内部的各类总线(如AHB-AP访问内存和外设,APB访问调试组件)。

多核系统中,调试器可以通过SWD分别访问不同核心的AP,实现多核调试。

使用中常见的问题

调试端口被禁用:许多芯片允许在软件启动后禁用SWD引脚以复用为GPIO。一旦禁用,普通的复位无法恢复,必须在POR(上电复位)期间保持NRST引脚为低,阻值用户代码运行,然后通过调试器发送批量擦除命令清除禁用代码,才能重新获得调试权限。

连接失败:如果调试器无法识别目标,常见原因是SWDIO缺少上拉,SWCLK被持续拉低、或芯片处于低功耗模式。部分芯片支持通过有效的SWD活动从SHUTDOWN模式唤醒。

SWD的设计哲学很清晰:用最少的引脚、保留最核心的能力。对于绝大多数Cortex-M项目,SWD是比JTAG更务实的选择。