赞
踩
对SWD协议做一个简单的总结
SWD协议可以配置单片机内部几乎所有的寄存器。整个SWD过程是分级进行的,时钟信号由SWCLK 管脚输入,数据信号从SWDIO管脚输入输出。首先HOST对SW-DP进行操作,确定AP寄存器的参数,达到对Cortex Memory Map进行操作。
Debug Access Port(DAP)由两部分组成:
Debug Port(DP)
Memory Access Port(MEM-AP)(AP)
IDCODE:识别码寄存器,用于识别SW-DP。ID:0x0BB11477(M0)
ABORT:中止寄存器,强制AP事务中止。在通信中,若发生粘性错 误位置1(ack = 4)。将0b1写入ABORT中,会生成一个DAP中止使当前AP事务中止。
CTRL_STAT_W/R:控制状态寄存器,用于控制和获取有关DP的状态信息。
SELECT:AHB-AP选择寄存器,选择要访问的端口(AP)和AP中的bank地址和DP的bank地址。
RDBUFF:读缓冲寄存器,在SW-DP上,RDBUFF显示了在上一次AP读取期间捕获的数据,允许重复返回值而不生成新的AP访问。
CSW_W:控制/状态字寄存器,CSW配置和控制通过MEM-AP访问连接的内存系统。size:32bit-0b010;16bit-0b001
TAR_W:传送地址寄存器,TAR保存要通过AP访问的内存地址。
DRW_W/R:数据读/写寄存器,DRW将AP访问中传递的值直接映射到TAR中指定的地址的一个或多个内存访问。
IDR:识别寄存器,IDR标识访问的端口
1、SWD时序
1)成功的写时序 (烧录器往DP或MEM-AP寄存器的写操作)
2)成功的读时序 (指烧录器读取DP或MEM-AP寄存器的数据)
3)DAP没准备好,响应WAIT给HOST,此次通讯结束
4)DAP出错,响应FAULT给HOST,此次通讯结束
2、SWD命令详情
1)主机 HOST 发出的请求由 8bit 组成
Bit0:Start,固定为 1。
Bit1:APnDP,0表示访问 DP 寄存器,1 表示访问 MEM-AP 寄存器。
Bit2:RnW,0表示写请求,1表示读请求。
Bit[4:3]:地址值A[3:2],存放DP/AP寄存器的地址。
Bit5:Parity,用于表示由{APnDP,RnW, A[2:3]}组成这四位数的奇偶总个数。
Bit6:Stop,固定为0。
Bit7:Park,固定为1。
2)Target返回的ACK值由3bit组成
ACK[0:2]==001,表示FAULT
ACK[0:2]==010,表示WAIT
ACK[0:2]==100,表示OK response
3)数据由32bit有效数据 + 1bit数据的奇偶校验位组成
SWD协议的操作步骤:
1、SWD初始化步骤:
a)初始化IO口,SWCLK和SWIO设置为输出模式,保持SWDIO=1,保证Host连续发送至少50个“1”,使得Target进行Line Reset。
b)发送JTAG to SWD命令,0x79、0xE7两个byte(在ARM-Debug_Interface官方文档中可以查到),随后再发送一次line reset操作。
c)至少发送两个Idle信号,保持SWDIO=0。
d)读取Chip ID,从而完成SWD初始化操作。此时只能访问DP寄存器组,AP寄存器组还无法访问。
2、解锁AP
步骤如下:
1)CTRL/STAT寄存器写入0x50000000 (第28位和第30位),开启debug port及其时钟
2)SELECT寄存器写入的数据为0x000000F0,bank:0xF
3)读取IDR寄存器(addr = 0xFC)的数据并验证
4)SELECT寄存器写入的数据为0x00000000,bank:0x0
5)CSW寄存器写入0x00000002,data_size:32bit
注意:
1、CTRL/STAT寄存器:
CSYSPWRUPREQ:System powerup request
CDBGPWRUPREQ:Debug powerup request
2、SELECT寄存器:
APSEL=0X00表示AHB访问;APBANKSEL:选择当前AP的bank地址。
3、读取IDR寄存器的数值时,需要两次,第一次是dummy read,第二次读取到的才是正确的数据。(第二次也可以读RDBUFF寄存器)
4、CSW寄存器:
Size:访问MEM-AP的数据类型的大小
其中:寄存器的数据是32bit–0b010,编程写入Flash的数据是16bit–0b001。
如果想要写入/读出MCU内部Flash的数值,需要用到两个AP寄存器:TAR(The Transfer Address Register)和DRW(The Data Read/Write Register)。
1)在TAR_W寄存器中写入要访问的内存地址数值 (addr = 0x08000000)
2)在DRW_W寄存器中写入要往内存中写入的数据 (data = 0x12345678)
1)在TAR_W寄存器中写入要访问的内存地址数值 (addr = 0x08000000)
2)从DRW_R寄存器中读取要访问的内存中存放的数据
3)从RDBUFF寄存器(DP)中读取数据/从DRW_R寄存器(AP)中读取数据
注意:
由于读取AP寄存器的特殊性,当读取AP寄存器时,返回的数据是上一次传输的值。也就是说,有两种方式可以得到正确的 AP 寄存器的值。
发送两次读DRW寄存器的操作
发送一次读DRW寄存器的操作(读取上一周期的数据),再发送一次读RDBUFF寄存器的操作(读取自己需要的数据)
总的来说,读写DP寄存器没有迟滞,不需要读写两次。读取AP寄存器,有迟滞,第一次读AP,是上一周期的值,第二次读AP才是想要的值。写AP寄存器,没有迟滞。如TAR,DRW只需要写一次即可写进去。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。