打印
[应用相关]

SWD应用接口

[复制链接]
26009|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
稳稳の幸福|  楼主 | 2016-1-26 16:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SWD应用接口
       随着ARM公司对Cortex系列的推出,采样SWD方式调试成了大家的首选。SWD不仅速度可以与JTAG媲美,而且使用的调试线少得多。很多人在采样SWD方式进行调试时,一般都是采用4线:
① VCC     -     电源
② GND     -    地线
③ SWDIO -    数据
④ SWCLK -   时钟
        在对NXP的LPC1114下载仿真时,用ULINK2和JLINK V8都是可以的,但是对于STM32,如果用JLINK V8可以下载,而用ULINK2下载时总是超时,而加上NRESET复位线则可以正常下载。所以为了兼容所有芯片和调试工具,最好按照一下方式进行预留接口:
PIN 1:  GND  
PIN 2:  NRST  
PIN 3:  VCC
PIN 4:  SWDIO
PIN 5:  SWDCLK
当然有时候只需三条线就可以,但是对于有些芯片就不稳定:
PIN 1:  GND  
PIN 2:  SWDIO
PIN 3:  SWDCLK
所以也可以采用如下方式:
1 - VCC;  
2 - GND;  
3 - SWDCLK;  
4 - SWDIO;  
5 - NRST.  
中间三根是必须,NRST可加可不加,有人说VCC要给JLink的输出接口芯片ALVC164245供电也可以加上。


沙发
稳稳の幸福|  楼主 | 2016-1-26 16:41 | 只看该作者
SWD协议
         故名思议,串行总线调试接口。我们需要3根线与目标MCU相连,SWDIO,SWDCLK和GND。
        -SWDIO 为双向Data口,主机到目标的数据传送。
        -SWDCLK 为时钟口,主机驱动。
        -GND  GND脚。
        首先参考《ARM Debug Interface V5》(注:该文档已有更新版本,并且对V5版本做了勘误),对一些相关的协议相关说明有了较浅的认识。那接下来便找了个带SWD接口的板子,我这首先选了STM32F030,因为以后可以为生产线做离线编程器,当然随后也出现了一些问题,下文会说明。
        连上相关物理连线,开始折腾。
        看手册中有几个相对较重要的时序说明。
Trn-Trn:即Line turn-round,当总线上的数据传输方向发送改变时(比如由Host->Target变为Target->Host),需要插入Trn,Trn为一个CLK时序,关于对于Trn的理解自己也有些疑问。
Idle  cycles:在一个总线完成后,可以立即进入下一个总线操作或者是勒令总线进入Idle 状态,此时可以插入Idle cycle。在这我用连续送出8个’0b0’来使得总线进入Idle状态。
Parity :校验位,这个比较简单。分两个内容对命令头进行校验和对数据进行校验。命令头下文会说明。数据校验是对Data的0b0-0b31进行校验,如果‘1’的个数为奇数那校验位就为‘0b1’,如果‘0b1’的个数为偶数校验位就为‘0b0’。
        理解了这几个,我们接下来看读写命令。
        每个读写命令之前都会有个Host->Target的数据头。每个数据头为1Byte.
-Start     起始位,始终为1,这也是Target判断总线从空闲状态退出的条件。
-APnDP  选择要访问的是DP寄存器还是AP寄存器。
- Rnw    选择是读还是写。
-A[2:3]   DP或者AP寄存器的地址,注意它是低位在前。比如寄存器DP寄存器 Select 它的地址为0x08,那这儿的A为C(0b1000),显然A[2:3]就为01。
-Praity   校验位,它是APnDP、RnW和A[2:3]共4个bit的校验位。
-Stop    停止位。始终为0。
-Park     该位确切来说应该始终为1,ADI V5中描述此位由总线上拉,但由于总线的上拉能力不足,会导致Target识别不了这个1。该勘误在ADI V5.2中有说明。

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

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

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

具体实现为首先保证Host连续送出至少50个“1”,使得Target进行Line Reset,至少插入2个Idle,然后可以读取目标板的IDR,判断Target的类型。
理解了整个,然后就进行操作验证,发现偶尔可以有数据ACK,继续查看手册,发现需要进行JTAG和SWD的切换操作。查看手册发现切换操作的时序如下。

可以简化为先进行一次LineReset,随后发送0X79,0XE7(高字节首先传送),接着再一次LineReset,随后便可以读IDR。但是发现了问题,用此方式可以读取到STM32F103的IDR,但STM32F030不行,在ARM网站查阅相关资料,发现了这个。

上图主要说在一个更早的协议中需要发送如下命令才能进行JTAG和SWD的切换。就是要发送0X6D,0XB7,尝试了下,这下能顺利读取到IDR了。疑惑的是STM32F0系列比F1出来要晚,居然用的老版本的协议?
既然能够获取到IDR了,那接下来可以尝试着进行连接到AHB-AP了。用DP寄存器的SELECT来进行选择。这儿为了能够使得结果明显和确切,我选择了读取AP 0XFC 的IDR寄存器,来获取AP的特性,因为这个数据是只读的和确切的。
首先要用写入DP寄存器SELECT。

SELECT的具体描述可以参见ADI V5手册,在这有个说明,当时走了弯路。SELECT寄存器中有个APSEL选择位,这个是选择当前连接的AP,手册中没有详细说明它的定义。后来在另外的文档中发现该值为0x00,AHB-AP。APBANKSEL为选择需要访问的BANK地址,比如IDR寄存器的地址为0XFC,那它的BANKSEL为F,如果为TAR寄存器,那它的BANKSEL为0。
连接到AHB-AP后就能进行你想要的操作了。比如我可以读取MCU的独立ID,就可以通过MEM-AP来操作。也可以对MCU进行擦除或者编程。
在做编程之前,首先将MCU进入Halt状态,然后访问MCU相关FLASH控制寄存器进行读写即可。
在STM32F030编程时需要注意的是STM32F030的FLASH的传输方式,我未采用Packet的传输方式。

使用特权

评论回复
板凳
稳稳の幸福|  楼主 | 2016-1-26 16:42 | 只看该作者
J-Link接口是如何定义的?

下面为J-Link接口定义:

仿真器端口连接目标板备注
  1. VCC  MCU电源VCC
VCC
  2. VCC  MCU电源VCC
VCC
  3. TRST  TRST
Test ReSeT/ pin
  4. GND  GND或悬空
  5. TDI  TDI
Test Data In pin
  6. GND  GND或悬空
  7. TMS, SWIO  TMS, SWIO
JTAG:Test Mode State pin ; SWD: Data I/O pin
  8. GND  GND或悬空
  9. TCLK, SWCLK  TMS, SWCLK
JTAG: Test Clock pin ; SWD: Clock pin
  10. GND  GND或悬空
  11. RTCK   RTCK
  12. GND  GND或悬空
  13. TDO  TDO
Test Data Out pin
  14. GND  GND或悬空
  15. RESET  RESET
RSTIN pin
  16. GND  GND或悬空
  17. NC  NC
  18. GND  GND或悬空
  19. NC  NC
  20. GND  GND或悬空



使用特权

评论回复
地板
稳稳の幸福|  楼主 | 2016-1-26 16:42 | 只看该作者
下面是标准的接口排列:

                          
J-Link指定的标准接口

使用特权

评论回复
5
mcuisp| | 2016-1-26 17:11 | 只看该作者
不错,硬件层面讲的很透彻。

使用特权

评论回复
6
玄德| | 2016-1-26 17:23 | 只看该作者

呵呵,不错
RST线在有些时候很有用,遇到过一次。不过机会很少。


使用特权

评论回复
7
稳稳の幸福|  楼主 | 2016-1-26 17:42 | 只看该作者
SELECT寄存器中有个APSEL选择位,这个是选择当前连接的AP,手册中没有详细说明它的定义

使用特权

评论回复
8
xiashengcheng| | 2016-1-26 18:04 | 只看该作者
不过boot在画板子的时候最好引出来或是装个开关可以选,要不然有时候把SWD关了,又无法设置BOOT那可以蛋疼了

使用特权

评论回复
9
稳稳の幸福|  楼主 | 2016-1-26 19:43 | 只看该作者
xiashengcheng 发表于 2016-1-26 18:04
不过boot在画板子的时候最好引出来或是装个开关可以选,要不然有时候把SWD关了,又无法设置BOOT那可以蛋疼 ...

对,一般用两排三线插针,可以选择接地还是接高电平。

使用特权

评论回复
10
quray1985| | 2016-1-26 20:17 | 只看该作者
这个cmsis-dap也有jtag和swd接口,和Jlink等的区别是啥啊

使用特权

评论回复
11
稳稳の幸福|  楼主 | 2016-1-26 20:38 | 只看该作者
和一些国内用户沟通的过程中,发现他们还是很“喜欢”使用D版JLINK。

为什么?还不是因为JLINK本身的功能很齐全么?作为一款商用软件,配合合法的JTAG/SWD接口板可以实现调试、编程和量产等诸多方面要求。安装SEGGER JLINK之后,可以发现有:
J-Flash
J-LINK commander
J-LINK RDI
J-LINK GDB
芯片相关工具
其他如SWO/MEM

ARM推出的CMSIS-DAP虽然推出有些日子了。但是不算太流行。我发现CMSIS-DAP仅适合调试Cortex-M/A7控制器之外,还因为CMSIS-DAP目前只能够在Keil/IAR的IDE里使用,没有单独的Programmer应用。其实CooCox的CoFlash支持CMSIS-DAP作为编程器使用,但是MCU支持种类不够多。

pyOCD + pyWinUSB/pyUSB (argparse + setuptools) + CMSIS-DAP
这个标题名字很长,但是很实用。我喜欢Python。

PyOCD的特性有:
停止、单步、恢复执行;
读写存储器、存储器块;
读写核心寄存器(应该也可以读写外设寄存器吧?);
设定、移除硬件断点;
写入新固件;
复位运行;

有了PyOCD,CMSIS-DAP可以实现J-LINK的大多数功能:
CMSIS-DAP调试:Keil/IAR支持USB-HID的驱动进行调试,已经验证;
GDB调试:CoIDE本身就支持CMSIS-DAP,已经验证;可以利用PyOCD启动GDB在GCC下调试;
Commander:PyOCD本身就是命令行模式下工具,可以很容易地进行CMSIS-DAP的底层操作;
Programmer:PyOCD可以用来对目标MCU进行编程,由于采用Python,可以很容易地脚本化批处理(不过还未研究如何添加新的MCU编程算法);

唯一缺乏的是Programmer和其他工具的UI而已。这个使用wxPython可以很容易地实现。

我今天花了一番功夫安装并在MKL25Z的OpenSDA/CMSIS-DAP上测试了PyOCD,结果让人满意。但是Windows XP/Windows 7/Windows 8和不同Python版本和元件版本的组合测试是一个问题。需要一个整合方案。

使用特权

评论回复
12
Tennasi| | 2016-1-31 11:04 | 只看该作者
用sw的速度也挺快的,并且线用的少

使用特权

评论回复
13
稳稳の幸福|  楼主 | 2016-2-12 17:37 | 只看该作者
唯一缺乏的是Programmer和其他工具的UI而已。这个使用wxPython可以很容易地实现。

使用特权

评论回复
14
maiweiqi| | 2016-2-13 16:29 | 只看该作者
我画了块板,焊的是stm32f103,swd接口,怎么样都能成功下载,后来我把芯片stm32l052,stm32l152焊上去,就要按着才能成功下载,后来我把连接的杜邦线剪短了一半,就不用按也能成功下载。

还有我有一块stm32f4discovery开发板,swd接口,如果我把杜邦线撕开,下载会失败,我把杜邦线揉成一团,就能够成功下载。
这是什么一回事?

使用特权

评论回复
15
maiweiqi| | 2016-2-13 16:31 | 只看该作者
maiweiqi 发表于 2016-2-13 16:29
我画了块板,焊的是stm32f103,swd接口,怎么样都能成功下载,后来我把芯片stm32l052,stm32l152焊上去,就 ...

而且改变下载的速率也解决不了问题。

使用特权

评论回复
16
Soraka| | 2016-2-13 19:34 | 只看该作者
为什么这样设计啊,有些线不是也没用吗

使用特权

评论回复
17
mintspring| | 2016-2-14 10:52 | 只看该作者
具体实现为首先保证Host连续送出至少50个“1”,使得Target进行Line Reset,至少插入2个Idle,然后可以读取目标板的IDR,判断Target的类型。

使用特权

评论回复
18
mintspring| | 2016-2-14 10:53 | 只看该作者
Soraka 发表于 2016-2-13 19:34
为什么这样设计啊,有些线不是也没用吗

用的话更好,不用还能凑合的意思。比如串口标准是9根线,实际上一根就行

使用特权

评论回复
19
mintspring| | 2016-2-14 10:54 | 只看该作者
不过boot在画板子的时候最好引出来或是装个开关可以选,要不然有时候把SWD关了,又无法设置BOOT那可以蛋疼了

使用特权

评论回复
20
mcuisp| | 2016-2-14 22:32 | 只看该作者
maiweiqi 发表于 2016-2-13 16:29
我画了块板,焊的是stm32f103,swd接口,怎么样都能成功下载,后来我把芯片stm32l052,stm32l152焊上去,就 ...

SWD通讯确实不如SWIM、BDM等皮实。
EP968配有屏蔽线,SWDCK SWDIO最好带屏蔽,不要太长。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

162

主题

3098

帖子

8

粉丝