单片机 SWD 下载通信底层原理

💡 原文中文,约1900字,阅读约需5分钟。
📝

内容提要

在微控制器领域,常用的编程接口是JTAG和SWD。SWD只需要两条线,是一种理想的选择。常见的Cortex-M处理器都集成了SWD和JTAG调试端口。SWD类似普通外设,有对应的寄存器进行编程操作。

🔎

延伸解读

SWD 与 JTAG 的引脚复用关系

在 Cortex-M 处理器中,SWD 和 JTAG 调试端口通常集成在 SWJ-DP 中,SW-DP 的 2 个引脚与 JTAG-DP 的 5 个引脚中的部分复用。这意味着同一组物理引脚可以支持两种协议,但默认情况下调试接口是 JTAG。若想使用 SWD,调试工具必须发送特定的 JTAG 序列来切换。这种设计让芯片在保持兼容性的同时,为引脚受限的应用提供了选择。

切换至 SWD 的专用序列

从 JTAG 切换到 SWD 并非自动完成,调试工具需要在 TMS/TCK(对应 SWDIO 和 SWCLK)上输出一个专用序列:先输出超过 50 个 TCK 周期的 TMS=1,接着输出 16 位 TMS 信号 0111100111100111(MSB),最后再输出超过 50 个 TCK 周期的 TMS=1。这个序列用于禁止 JTAG-DP 并使能 SW-DP,之后仅用 SWCLK 和 SWDIO 即可激活 SWD 调试。

SWD 协议的三阶段结构

SWD 的每次通信序列包含三个阶段:主机发送的 8 位数据包请求、目标返回的 3 位确认响应,以及主机或目标发送的 33 位数据传输阶段。这种结构与普通通信协议类似,底层操作实际上是对寄存器的位操作。理解这三个阶段有助于调试时分析通信失败的原因,例如确认响应异常可能意味着目标未正确进入空闲状态或访问了错误的寄存器。

SW-DP 状态机的复位与空闲条件

SW-DP 状态机有复位、空闲等主要状态。上电复位后、从 JTAG 切换到 SWD 后,或线路保持高电平超过 50 个周期时,状态机进入复位状态。若复位后线路保持低电平至少两个周期,则进入空闲状态。复位后必须首先进入空闲状态,然后对 DP-SW ID CODE 寄存器执行读访问,否则目标会在下一个事务上发出 FAULT 确认响应。这些条件对调试连接初始化有直接影响。

❓

Q&A

SWD和JTAG的主要区别是什么?

SWD仅需两条线(SWCLK和SWDIO),而JTAG需要多个信号端口,适合引脚资源有限的场合。

SWD协议的基本工作流程是什么?

SWD协议包括数据包请求、确认响应和数据传输三个阶段。

SWDIO引脚的功能是什么?

SWDIO是双向数据引脚,用于串行数据的输入和输出,需在电路板上进行上拉。

如何在JTAG和SWD之间切换?

切换时需在TMS/TCK上提供专用的JTAG序列,以禁用JTAG-DP并使能SW-DP。

SW-DP状态机的主要状态有哪些?

SW-DP状态机主要包含复位状态、空闲状态和ID代码等状态。

SWD的应用场景有哪些?

SWD适用于对Cortex-M内核微控制器的编程和调试,尤其在引脚资源有限的情况下。

🏷️

标签

➡️

继续阅读