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