【每周分享】你了解过SWD协议吗?
发布时间:2026/10/20 11:04:20 锦皓数字建站

我们在使用JLINK和STLINK等工具对MCU进行编程烧录程序的时候都会有一个通信接口也称端口、类型等方式的选择是选SWD有些IDE标注的可能是SW还是JTAG还是其他方式一般在Keil或者J-Flash等软件里面都会有配置窗口其实这里的SWD和JTAG一样都是一种通信协议我们平时可能很少关注这个协议的具体内容除非项目中会用到那今天就通过这篇帖子与大家分享一下SWD的相关内容当我们以后遇到编程失败的时候就可以尝试抓包来分析一下说不定能定位到问题原因不足之处欢迎补充。1、基本概念SWDSerial WireDebug串行线调试是由ARM公司开发的一种调试接口协议主要用于ARM Cortex-M系列微控制器应用于嵌入式系统和物联网设备等领域。SWD之所以应用非常广泛主要是因为该接口协议只需要两条信号线即可数据线SWDIO和时钟线SWCLK通过使用单一双向数据连接进行通信即可完成程序烧录其实有点类似于I2C协议。现在大部分MCU都是使用这种方式进行下载一般原理图的烧录口调试口都会有这样的丝印其中通信的SWDIO为双向数据线即数据可以从仿真器主机到MCU从机也可以从MCU从机到仿真器主机通信的SWCLK时钟频率一般都支持配置频率越高编程越快但如果编程不稳定则需要适当降低频率然后SWD的信号传输机制可以基本概括如下差分编码每个时钟周期传输两位数据上升沿和下降沿各一位理论上带宽是JTAG的两倍半双工模式同一时刻只能单向传输通过转向周期切换方向同步机制SWCLK的上升沿驱动数据下降沿采样数据。我们也顺便来看下SWD和JTAG的一些区别JTAG接口的信号线比较多主要包括下面几根TDITest Data In串行输入引脚TDOTest Data Out串行输出引脚TCKTest Clock时钟引脚TMSTest Mode Select模式选择控制信号引脚TRSTTest Reset复位引脚。相比于SWD其优点主要是不仅支持ARM内核还可以用于更多MCU控制器不仅用于编程和调试还可以用于生产测试。其缺点也比较明显需要更多的MCU引脚与其连接。2、协议层详解看完了SWD协议的一些基本信息和概念接下来我们再通过实际抓包来看下协议数据看看这个协议大概是什么样的。抓包环境搭建使用KeilIDE通过JLINK连接目标MCU使用软件逻辑分析仪工具连接JLINKMCU的SWDIO和SWCLK信号线并使用逻辑分析仪上位机抓包通过Keil对MCU进行编程的数据包环境框图大概如下逻辑分析仪上位机配置为了能自动解析数据包对应的协议我们需要选择协议类型为SWD并且将采样通道配置为与实际连接的一致实际是通道1接了SWCLK通道2接了SWDIO配置完成点击确定即可开始运行抓包流程。抓包数据为了能够抓到整个编程过程的数据包我们可以将抓包时长配置长一点对于我这个来说10s应该够了先点击开始运行抓包然后再在Keil里点击下载程序这样就可以抓到整条数据包了然后也会有对应的协议解析显示软件右侧也会按照列表方式显示数据包的相关参数包括时间类型等如果你需要保存数据包到本地也可以直接导出再慢慢分析最左侧的“SWD******”显示表示协议操作过程是复位RESETS、使能ENABLES、读取READS、写入WRITES、应答ACKS还是数据DATAS对应的数据为右侧同一行所示数据包分析如下图所示外部设备通过SWDIO和SWCLK两条信号线与MCU控制器的调试端口SW-DPDebug Port执行通信而SW-DP可以访问一个或者多个访问端口APAccess Port包括访问APB或AHB总线上的所有寄存器等等。另外通过这种架构SWD 不仅支持寄存器调试还能直接访问系统内存实现完整的设备控制与编程。SWD接口支持三种基本操作建立连接线路复位数据传输。对于SWD协议的数据格式和其他协议一样的都是以数据包为单位一次完整的通信由主机仿真器调试器发起并按照请求-响应-数据传输的模型进行具体来说其核心数据包格式分为三种主机发送的请求包目标MCU返回的响应包应答包ACK后续的数据包。数据包的格式大概是下面这样请求包主机到从机[Start(1)][APnDP(1)] [RnW(1)] [Addr(2)] [Parity(1)] [Stop(1)] [Park(1)]Start固定为1标识传输开始APnDP0表示访问调试端口DP1表示访问应用端口APRnW0为写操作1为读操作Addr寄存器地址DP为2位AP为4位Parity校验位APnDP RnW Addr的奇校验Stop固定为0Park固定为1释放SWDIO控制权。响应包从机到主机[ACK(3)][Data(32)] [Parity(1)]ACK三位状态码其中100成功010等待001失败Data32位数据读操作时返回Parity数据校验位。主要的数据包内容如下所示以上数据包可以分为三个部分LINERESETDP 发送一个持续超过50个时钟周期的高电平信号用于初始化连接或执行线路复位JTAG-SWD当需要从JTAG切换到SWD时复合调试端口SWJ-DP会检测 SWDIO引脚上的一个特定的 16 位切换序列用于模式切换如图为0x79E7LINERESET再执行一次确保DP处于SWD模式时能正确复位线路。当识别到序列后仿真器会读取MCU的IDCODE寄存器以确认成功进入SWD模式数据包内容如下其实如果你比较细心的话在Keil配置里面连接MCU成功的话也可以看到这个IDCODE为什么要读取两次IDCODE估计是为了进一步确认是否成功吧个人猜测。以上这些在一起可以理解为完整的初始化流程。对于寄存器访问流程主要包括调试端口DP和访问端口AP调试端口IDCODE芯片唯一标识如上所述ABORT中止当前事务处理错误状态如数据包所示CTRL_STAT控制调试端口状态如数据包所示中间的间隔一般是称为转向周期RDBUFF存储AP返回的数据应用端口CSW配置访问内存的大小8位/16位/32位TAR指定内存地址DRW读写数据寄存器IDRAP模块标识。数据包的写过程大概如下所示对应我所抓的数据包可以看一下“W”表示写的意思后面跟着的是写操作类型数据包的读过程大概如下所示对应我所抓的数据包可以看一下“R”表示读的意思后面跟着的是读操作类型这个对MCU的编程过程主要的数据包操作内容就是W APx和R APx看完这些具体的数据包我们可能还有点懵一开始我也一样正常多看看就理解了那我们再来总结一下三个过程请求阶段主机发送一个8位请求包给从机各位含义再回顾一下起始位固定为1APnDP位1表示访问AP0表示访问DPRnW位0表示写操作1表示读操作A[2:3]位指定AP或DP寄存器地址奇偶校验位对APnDP、RnW和A[2:3]进行奇偶校验若1的数量为奇数则为1否则为0停止位保留位固定为1。应答阶段从机收到请求包以后会返回一个3位应答ACK信号其中b001OK表示操作成功b010WAIT表示从机暂时无法处理请求主机需稍后重试b100FAULT表示发生错误同时设置STAT或CTRL寄存器中的错误标志位数据传输阶段根据读写类型主机或从机会发送一个33位的数据包其中32位表示数据1位表示奇偶校验位和请求阶段的校验方式是一样的。以上通过理论结合实际抓包一次KeilJLINK给MCU执行SWD方式的编程的通信过程数据包用不是很专业的方式简单解读了一下SWD接口协议的一些内容当我们遇到编程和烧录失败的时候如果实在搞不定找不到原因就可以尝试抓包来看一下不足之处欢迎补充毕竟这样才能一起更好的进步和学习~~后续如有条件和机会再来看看JTAG协议是什么样子的~~。---------------------作者dffzh链接https://bbs.21ic.com/icview-3508729-1-1.html来源21ic.com此文章已获得原创/原创奖标签著作权归21ic所有任何人未经允许禁止转载。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。