1.写这个文章主要是介绍整理一下关于SWD协议,感觉网上对它的介绍不多。再就是自己进行一个学习记录的总结。丰富一下网络的资料。
正文:
首先,SWD协议是ARM内核调试器的一种通信协议。ST的单片机stm32103系列的调试端口可以是jtag或者是SWD的端口。今天主要说一下用一个单片机的IO口模拟swd协议来烧录另一片单片机。主要参考文档<<ARM®Debug Interface Architecture Specification ADIv5.0 to ADIv5.2 >>
SWD协议简单来说可以说是另一种方式来配置单片机内部寄存器,通过它可以配置单片机内部几乎所有的寄存器(不太严谨)。想用SWD协议和单片机进行通信首先必须了解DP,AP所相关寄存器。关于DP,AP所包含的寄存器的具体意义就自己慢慢看文档理解。我说的主要是其中可能会出问题的地方:1.当用SWD协议进行通信的时候首先是发送jtag转SWD接口的命令。2.就是关于协议的读写,我理解的是数据会在时钟的下降沿的时候进行采样(我这样写的程序没有任何问题)。在上升沿的时候进行数据的翻转。
读协议:
我们可以看到协议先发送命令然后目标机回应数据,根据回应 的值进行判断是否准备好或者错误或者等待。接下来的就是可以读取的数据。这个读的协议没什么问题。
写协议:这是需要重点注意的地方
我当时写数据的时候发现有时候写的进去不会报错,有的时候写的数据会报错。当时很是不解看示波器波形也都是没什么问题。后来经过自己反复实验在写数据之后也就是校验位之后再加一个周期的时钟。后来发现文档上最后竟然还有一个时钟周期,当时没有注意。这告诉我千万不要忽略文档上任何一个小的细节。一般来说像ARM这种大公司的官方文档还是很可靠的。
当通信协议都没有问题了,就可以通过通信协议修改单片机内部的寄存器了。我们可以看到每次读写的数据都是32位的数据,但是发现当想通过它来写内部flash的时候发现对flash的写操作只能是半字(16位)的形式。此时就需要修改AP寄存器组的CSW寄存器SIZE位。以此改变传输的位。这里发现网上很多都没有介绍。当可以烧写flash的时候已经就可以制作一个离线下载器了。
关于SWD数据一级一级的进行传递的方式,看文档一般都可以理解的。参考下图: