赞
踩
什么是DAP?
看下边这张图。为了访问系统资源,需要debugger传递正确的地址信息到DAP。DAP去执行这个请求。简单说就是DAP是为debugger打工的,或者说是debgger访问访问系统资源的钥匙。
什么是AP?
AP 不是寄存器,全名Aceess Port,也就是访问端口。AP通过使用特殊资源传递机制去访问内核中需要被调试的信息。同时,AP还可以通过AP访问机制将这些调试信息传递给DP。调试信息包括的内容:
内核的调试寄存器、ROM、memory等等。
什么是DP?
同理DP也不是寄存器,全名Debug Port(DP),也就是调试端口。DP提供接口访问AP中的信息。DP根据不同的物理连接方式可以分为:JTAG-DP、SW-DP、SWJ-DP。
模拟SWD接口的板子简称为Host,目标MCU(即我要连接的板子)简称为Target。
Host Target
swdio --------------------------------> swdio
swclk --------------------------------> swclk
GND ---------------------------------> GND
Host板上的swdio swclk用普通gpio模拟。直接用杜邦线连接到目标板上已经创建好的SWD接口(注意:目标板上的SWD接口,不需要再重定义,板子上一般都带有SWD接口)以我的板子为例,奉上一副原理图:
这里自己迈过一个坑:将目标板上的SWDIO 和 SWCLK引脚也用普通GPIO引脚进行模拟,出现的问题是始终得不到理想的预期。如果能得到回复才怪。
这里还有一个问题:需不需要连接目标板的RESET引脚。在看网络上的一些开源代码的时候,有复位目标板的内容。这里自己做了个实验不需要RESET引脚连接也是可以的。自己可以下看下离线下载器的确也是不需要RESET引脚的,下图为离线下载器的引脚图定义:
现在硬件连接完毕,当然别忘了给两个板子供电,这里就不在赘述到硬件连接上。
SWD:串行调试总线接口
SWD协议的理解主要是参看官方文档《debug_interface_v5_2_architecture_specification_IHI0031E》,以下也是摘自官方文档,同时附上自己的理解。
上边的大概意思是:Arm SWD接口使用单个双向数据连接和单独的时钟来同步传输数据。一个操作在总线上大概包含两三步操作:因为是同步传输信息,因此需要SWCLK同步时钟。
1、数据访问请求:外部主机debugger请求访问目标机的DP
2、ACK响应。目标机回复ACK给主机
3、数据传输:读写
对于写数据请求,有一个turnaround周期在ACK阶段和数据传输阶段。在数据传输后,主机继续驱动总线,没有额为的turnaround周期
1、通过具有具有不同数量的连接的变量,它使物理连接标准变得复杂。
等等。。。不再解释。目前用不到这种一对多的架构。
Line turnaround
读命令为 数据头+Trn+ACK+RDATA+Parity构成,但实际操作发现Trn这位是忽略掉的(所以不知道对此Trn的理解是否有误),即发送完数据头后立即读入ACK,判断Target是否正确响应。
写命令为数据头+Trn+ACK+Trn+WDATA+Parity,在这不同的是,在写命令时必须要考虑2个Trn的位置
SWD协议传输前操作:
首先我们需要读取目标板IDCODE,具体操作实现为:
先进行一次LineReset,LineReset具体实现为:先保证Host连续送出至少50个“1”,使得Target进行Line Reset。随后发送0xE79E(LSB)接着再一次LineReset,随后便可以读IDCODE。F1系列读取的是0x1BA01477。
读取完ID_CODE寄存器,需要去连接到AHB-AP了。用DP寄存器的SELECT来进行选择。然后读取下APID 。实际读出来是0x14770011(F103)
上述操作完成后,说明连接是建立了,可以进行下一步程序下载操作。
时序的实现。
上边巴拉巴拉介绍了一堆东西,那么需要怎样用程序实现协议,并通过调试解决,这个开发过程中出现的问题,才是成长的过程。只有这样在以后如果遇到没有任何开源代码可以分享学习,只有份协议可供参考的情况下,才不至于懵逼。
未完待续。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。