SWD的时序图:
- start单个起始位,值为1(HIGH)
- APnDPA单比特,指示要访问DP还是AP。0用于访问DP(DPACC),1用于访问AP(APACC)
- RnWA单个位,指示访问是读(1)还是写(0)
- A[2:3]2位,给出DP或AP寄存器地址的A[3:2]地址字段。对于DPACC,是SW-DP中寄存器的地址;对于APACC,被寻址的寄存器取决于A[3:2]值和DP的SELECT寄存器中的值。注:[3:2]值首先传输LSB,这就是它显示为“A[2:3]”的原因。
- Parity 前一个数据包的单个奇偶校验位。使用偶数奇偶校验:如果设置为1的位数为奇数,则奇偶校验位设置为1。对于数据包请求,将对APnDP、RnW和A[2:3]位进行奇偶校验。对于数据传输(RDATA和WDATA),奇偶校验是在32数据位。
- stop 单个停止位,始终为0
- Park 1位。调试主机不驱动此位的线路,并且线路被DP拉高。目标将此位读取为1。
- Trn Turnaround。这是一段时间,在此期间线路未被驱动,线路的状态未定义。周转周期的默认长度为一个时钟周期,可以通过在SW-DP的线路控制寄存器中写入TURNROUND字段来更改(通常不需要)
- ACK[0:2]3位目标到主机响应。ACK值首先在线路上传输LSB,因此它显示为ACK[0:2]
- 32位写入数据,从主机到目标。WDATA值首先在导线上传输lsb,因此它显示为WDATA[0:31]。
- RDATA[0:31]从目标到主机的32位读取数据。RDATA值首先在导线上传输lsb,因此它显示为RDATA[0:31]。
电源控制:
DAP模型支持多个功率域;可以有三个电源域:
•常开域
•系统电源域
•调试电源域
DP寄存器位于常开域中,CTRL/STAT寄存器中有两个控制位:
•Bit[28],CDBGPWRUPREQ,用于请求系统电源管理器在调试电源域中完全通电并启用时钟。
•Bit[30],CSYSPWRUPREQ,用于请求系统电源管理器完全通电并启用系统电源域中的时钟。
初始化期间需要设置这两个位,以确保MCU完全通电并启用时钟
DP 寄存器:
AP 寄存器:
ABORT寄存器:
ABORT:AP中止寄存器始终存在于所有DP实现中,仅写,始终可访问。它的主要目的是强制DAP中止,也用于清除错误和粘性标志条件。当APnDP位=0时,它在写入操作时处于地址0x0。对AP中止寄存器的访问不受选择寄存器中CTRLSEL位值的影响。
当调试器发现错误标志被设置为1,或者粘性比较标志被设置成1时,它必须写入AP中止寄存器以将错误或粘性比较标志清除为0。如果有必要,可以使用对AP中止寄存器的一次写入来将多个标志清除为0
IDCODE寄存器:
标识码寄存器是只读的,并且始终可以访问,存在于所有调试端口实现中。它提供有关ARM调试接口的标识信息。当APnDP位=0时,它在读取操作时位于地址0b00
Bits | Function | Description |
[31:28] | Version | Version code, implementation defined. |
[27:12] | PARTNO | 0xba10 for SW-DP |
[11:1] | DESIGNER | Defaults to 0x23b |
[0] | - | Always 1 |
Control/Status寄存器:
这个重要的寄存器提供DP的控制和状态。当APnDP位=0并且选择寄存器中的CTRLSEL位设置为0时,它在读写操作中处于地址0x4
SELECT寄存器:
AP选择寄存器始终存在,其主要目的是选择当前访问端口和该访问端口中的活动4字寄存器窗口,它还选择调试端口地址组。当APnDP=0时,它在写入操作时位于地址0b10,并且仅写入。对AP选择寄存器的访问不受CTRLSEL位值的影响
Bits | Function | Description |
[31:24] | APSEL | Selects the current AP.0x00 = AHB-AP (We use this!)0x01 = APB-AP 0x02 = JTAG-AP 0x03 = Cortex-M3 if present.Reset to Unpredictable. |
[23:8] | Reserved. Should be 0, read as 0. | |
[7:4] | APBANKSEL | Selects the active 4-word register window on the current AP. Reset to Unpredictable |
[3:1] | Reserved. Read as 0, Should be 0. | |
[3:0] | CTRLSEL | (As mentioned many times above) SW-DP Debug Port address bank select. Reset to 0. However the register is WO, so we can’t201430of61read its value. |
RDBUFF寄存器:
当APnDP位=0时,RDBUFF在读取操作中位于地址0b11,并且是只读寄存器。对读取缓冲区的访问不受SELECT寄存器中CTRLSEL位的值的影响。
执行读取读取缓冲区从访问端口捕获数据,该数据是上一次读取的结果,而无需启动新的访问端口事务。这意味着读取读取缓冲区将返回上次访问端口读取访问的结果,而不会生成新的AP访问。读取“读取缓冲区”后,其内容将不再有效。读取缓冲区的第二次读取结果未定义。如果需要读取访问端口寄存器的值,则该读取之后必须是以下其中之一:
•第二个访问端口寄存器读取。可以读取控制/状态寄存器(CSW),以确保第二次读取没有副作用。
•对DP读取缓冲区的读取。
根据使用的选项,对访问端口或调试端口的第二次访问将暂停,直到恢复
WCR寄存器:
有线控制寄存器的目的是选择与SW-DP的物理串行端口连接的操作模式。当选择寄存器中的CTRLSEL位设置为b1时,在读写操作中,它是地址为0b01的读/写寄存器。线控寄存器的许多功能都是由实现定义的。
对于SWD编程,不需要配置此寄存器。
RESEND寄存器:
读取重新发送寄存器使读取数据能够从损坏的调试器传输中恢复,而无需重复原始AP传输。它是一个32位只读寄存器,在读取操作时位于地址0b10。对读重新发送寄存器的访问不受SELECT寄存器中DPBANKSEL位值的影响。对RESEND寄存器执行读取不会从访问端口捕获新数据。它返回上次AP读取或DP RDBUFF读取返回的值。读取RESEND寄存器可以从损坏的传输中恢复读取数据,而无需重新发出原始读取请求或生成新的DAP或系统级访问。RESEND寄存器可以被多次访问。它总是返回相同的值,直到对DP RDBUFF寄存器或访问端口寄存器进行新的访问
MEM-AP的访问:
MEM-AP寄存器:
CSW寄存器:
CSW寄存器通过MEM-AP配置和控制对连接的存储器系统的访问或从连接的存储系统的访问。CSW是一个R/W寄存器,但有些位是只读的。CSW位于MEM-AP寄存器空间中的偏移0处,因此它是第一寄存器组中的第一个寄存器。对于SWD编程,我们可以将CSW设置为(2<<0|1<<4|1<<24|1<<25),使其访问为32位,递增单个,特权访问,作为调试器访问。
TAR寄存器:
该R/W寄存器保存要访问的32位系统存储器地址;它在MEM-AP寄存器空间中处于偏移0x04。当使用数据读/写寄存器(DRW)时,TAR指定要访问的内存地址,并且在成功访问DRW时可以自动递增
DRW寄存器:
这个R/W寄存器保存一个32位的数据值。在写入模式下,DRW将当前传输要写入的值保存到TAR中指定的地址;在读取模式下,DRW保持从TAR中指定的地址在当前传输中读取的值。DRW寄存器将AP访问直接映射到一个32位内存访问:对DRW的写入命令MEM-AP启动对内存系统的写入访问DRW的读取命令MEM-AP启动对内存系统的读取访问。请注意,在内存访问完成之前,AP访问不会完成
CORE DEBUG:
DCRDR寄存器:
DCRDR寄存器是一个数据临时缓存,用于读取和写入ARM核心寄存器、专用寄存器和浮点扩展寄存器。DCRDR也可以单独使用,在外部调试器和处理器上运行的调试代理之间提供消息传递资源
DHCSR寄存器:
这个寄存器有两个字段排列视图:当读取时,[31:16]是一些状态位;写入时,[31:16]是一个“调试密钥”值,必须将其设置为0xA05F才能更新[15:0]。
DCRSR寄存器:
使用DCRDR,此寄存器提供对ARM核心寄存器、专用寄存器和浮点扩展寄存器的调试访问。对DCRSR的写入指定要传输的寄存器、方向(读/写)并开始传输。