SWD学习笔记

SWD其实和JTAG类似,是一种调试串口。

JTAG大致了解了一下。JTAG(Joint Test Action Group)主要4 lines:TMS(模式选择),TCK(时钟),TDI(数据输入),TDO(数据输出)。都是串行总线。JTAG model中通过状态机的方式,对cmd进行解析后控制TMS和TDI的输出。

SWD(Serial Wire Debug)主要2 lines: SWDIO(双向串行数据线),SWDCLK(串行时钟线,Master drive)。协议:ARM CPU standard bi-directional wire protocol

ADI:ARM Debug Interface。

DAP(Debug Access Port)分为 DP (debug port)and AP(Access port)。通过物理连接访问DAP register实现debug控制。

因为DAP分为DP和AP,所以访问方式分为两种: 1. DPACC(debug port access访问DP REG) 2.APACC(debug port access访问AP REG)

DP分为 SW-DP(Seiral Wire Debug Port),JTAG-DP和SWJ-DP(SW-DP和JTAG-DP的结合)。我要用到的是SWJ-DP

DP可以访问多个AP.其中AP分为MEM-AP和JTAG-AP。MEM-AP的作用是用来作为连接AHB/APB的桥梁,可以访问内存,比如AHB-AP,APB-AP,JTAG-AP,Cortex-M3

DP就是调试接口的硬件,AP 就是一个访问周边外设和内存的硬件接口。

外部设备通过SWDIO/SCLK pins来通信。

Trn-Trn:即Line turn-round,当总线上的数据传输方向发送改变时(比如由Host->Target变为Target->Host),需要插入Trn,Trn为一个CLK时序,

Idle  cycles:在一个总线完成后,可以立即进入下一个总线操作或者是勒令总线进入Idle 状态,此时可以插入Idle cycle。

 初始化

看协议中首先在连接Target时需要进行LineReset,这个是最基础也是最最简单的命令。

具体实现为:

STM32:

首先保证Host连续送出至少50个“1”,使得Target进行Line Reset,至少插入2个Idle,然后可以读取目标板的IDR,判断Target的类型。(注意:STM32可能需要进行linereset后切换JTAG/SWD mode后才能读到IDR)

get IDR后,cfg DP<SELECT>。

ARM上:

linereset方法一致。切换JTAGdao SWD mode的方法为:SWDIOTMSpins:16'h79E7(MSB first) or 16'hE79E(LSB first)

反之也可以切换啦:0x3CE7(MSB),0xE73C(LSB)

linereset后写TARGETSEL(include DPIDR+TARGETID)。然后read  IDCODE register(DPIDR)看看和写的TARGETSEL的ID对的上不.这个ID有讲究的,见intf_spec P54

啰嗦一句,不同AP的IDCODE是固定的,这里可以先读一下DPIDR,然后决定TARGETSEL怎么填。填写TARGETSEL的目的是让DP可以片选到正确的AP。

TARGETSEL包括APSEL/APBANKSEL/DPBANKSEL。分别用于 AP片选 ; 要访问的AP REG的BANK地址(adddr[7:4]);DP的4个寄存器选择(见314H文档中P63)

ARM IDCODE如下:

协议:

Host send 8-bit request to target -> Target response 3-bit OK acknowledge to host -> 33-bit data phase (write by host / read by target)

request phase:共8bit

-Start     起始位,始终为1,这也是Target判断总线从空闲状态退出的条件

-APnDP  选择要访问的是DP寄存器还是AP寄存器。0:DP   1:AP

- Rnw    选择是读还是写。0:Write   1:Read

-A[2:3]   DP或者AP寄存器的地址,注意它是低位在前。

-Praity   奇偶校验位,它是APnDP、RnW和A[2:3]共4个bit的校验位

-Stop    停止位。始终为0。

-Park     该位确切来说应该始终为1

acknowledge phase:

-OK : means successful —— 3‘b001

-WAIT:means host must retry the operation later —— 3'b010

-FAULT: means an error has occurred and one of the sticky bits in CTRL/STAT is set. The host can check the sticky error bits to see what kind of error has occurred.It must clear the sticky bits in ABORT register before using any AP commands, because the target will always respond with FAULT as long as one of the sticky error bits are set. ——3‘b100

data phase:

 32*data_bits + 1*parity_bit

 

 

读命令为  数据头+Trn+ACK+RDATA+Parity    构成,但实际操作发现Trn这位是忽略掉的(所以不知道对此Trn的理解是否有误),及发送完数据头后立即读入ACK,判断Target是否正确响应。

写命令为  数据头+Trn+ACK+Trn+WDATA+Parity,在这不同的是,在写命令时必须要考虑2个Trn的位置。

 寄存器

SW-DP (serial write debug port)registers:

占位,待续

依据官方spec的补充笔记

 MEM-AP 访问方式见下图。从上往下看依次寻址,最后访问到目的寄存器

PS:注意auto addr++ 4K边界的问题

 参考:

1.blog :https://blog.csdn.net/baiyibin0530/article/details/51682179 这个blog的内容是以对STM32开发板做SWD调试写的。对于我来说比较有参考意义的为初始化部分。

2.github: https://github.com/MarkDing/swd_programing_sram  基于cortex M3的debug port,programming internal SRAM。对于我来说,只有协议部分比较有用。

3.自用。ARM 官方出品的Debug interface spec。

4.https://www.cnblogs.com/wuhh123/p/10711222.html

原文地址:https://www.cnblogs.com/daisyuer/p/12373207.html