也谈SWD接口协议分析
这几日看到坛里有几个关于SWD协议相关的文章,自己也尝试了下,有点体会,也有些疑惑,写出来与大家分享和交流下。
以下我的模拟SWD接口的板子简称为Host,目标MCU(即我要连接的板子)简称为Target。
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的传输方式。
LineReset代码
static void SwdLineReset(void) { u8 i; SWD_OUT; SWD_DIO_H; ;i<;i++) { SWD_Delay(); SWD_CLK_H; SWD_Delay(); SWD_CLK_L; } }
写命令头函数
static void SwdSendByte(u8 dat) { u8 i; SWD_OUT; ;i<;i++) { if((dat&0x80)==0x80) { SWD_DIO_H; } else { SWD_DIO_L; } dat<<=; SWD_CLK_H; SWD_Delay(); SWD_CLK_L; SWD_Delay(); } }
读取一个data函数
static u32 SeqRead(u8 cmd) { u32 dat=; u8 i=; SwdSendByte(cmd); SWD_IN; ;i<;i++)//ack 此处需要处理判断 { SWD_CLK_H; SWD_Delay(); SWD_CLK_L; SWD_Delay(); } dat=; ;i<;i++) { dat=dat>>; SWD_CLK_H; SWD_Delay(); SWD_CLK_L; if(SWD_DII) { dat|=0x80000000; } SWD_Delay(); } //parity SWD_IN; //trn ;i<;i++) { SWD_CLK_H; SWD_Delay(); SWD_CLK_L; SWD_Delay(); } SWD_DIO_L; SWD_OUT; ;i<;i++) { SWD_CLK_H; SWD_Delay(); SWD_CLK_L; SWD_Delay(); SWD_CLK_H; SWD_Delay(); SWD_CLK_L; SWD_Delay(); } SWD_IN; //trn return dat; }
以上函数未加入ACK判断处理,实际使用时需要考虑并判断!
下面是用逻辑分析仪抓取的相关时序。
JTAG到SWD的切换
读取IDR寄存器
数据传输
识别STM32F103
飞思卡尔KL16识别
STM32F030 编程测试
先写到这,有空再继续分享。上传几份相关ARM的说明,欢迎拍砖。
也谈SWD接口协议分析的更多相关文章
- Redis 协议为例谈简单的协议分析
怎样去研究一个协议的过程,协议的格式,好处,怎么样模拟发包等,下面是一个简单的过程记录. 研究的步骤: 协议相关的资料,RFC,官方文档等.弄清楚协议工作在4层还是7层,是二进制还是文本协议等 抓包, ...
- SWD接口:探索&泄密&延伸
http://bbs.21ic.com/icview-871133-1-1.html 文买了个JLINKV9,以为神器,拿到手发现根本不是,完全没必要替换V8,想自己做个另类的调试器,当然想只是想而已 ...
- stm32的swd接口的烧写协议是否公开的呢?
stm32的swd接口的烧写协议是否公开的呢? 需要用一台好的示波器来抓才能有足够的存储深度,保证你能够过滤掉那个该死的50clock. 按照Arm的手册,每次转换发送方都需要一个TNR---但是我观 ...
- RTP协议分析(转自:http://blog.csdn.net/bripengandre/article/details/2238818)
RTP协议分析 第1章. RTP概述 1.1. RTP是什么 RTP全名是Real-time Transport Protocol(实时传输协议).它是IETF提出的一个标准,对应的RFC文 ...
- 蓝牙协议分析(3)_BLE协议栈介绍
1. 前言 通过“蓝牙协议分析(2)_协议架构”的介绍,大家对蓝牙协议栈应该有了简单的了解,但是,肯定还有“似懂非懂.欲说还休”的感觉.有这种感觉太正常了,毕竟蓝牙协议是一个历史悠久又比较庞大的协议, ...
- RTP协议分析和详解
一.RTP协议分析 第1章. RTP概述 1.1. RTP是什么 RTP全名是Real-time Transport Protocol(实时传输协议).它是IETF提出的一个标准,对应的RF ...
- Google的Protobuf协议分析
protobuf和thrift类似,也是一个序列化的协议实现,简称PB(下文出现的PB代表protobuf). Github:https://github.com/google/protobuf 上图 ...
- Memcache的使用和协议分析详解
Memcache的使用和协议分析详解 作者:heiyeluren博客:http://blog.csdn.NET/heiyeshuwu时间:2006-11-12关键字:PHP Memcache Linu ...
- [转载] TLS协议分析 与 现代加密通信协议设计
https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...
随机推荐
- Java实现UDP之Echo客户端和服务端
Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- 5个SQL核心
5个核心的SQL语句 1.SELECT -查询语句的逻辑处理顺序 5 SELECT <columnlist> 1 FROM <source objectlist> ...
- 团队开发——SCRUM报告(一)
一.成员介绍 队长:胡亚宝 PM:曹美娜 成员:焦燕.袁亚姣.黄亚萍 二.sprint会议 由于之前是一五一小长假,所以距离上次会议中间隔了很长时间,这里在对上次会议做一下简单的汇总 在上次会议上我们 ...
- 程序调试手段之gdb, vxworks shell
调试一个程序主要用到的功能: 启动程序 设置函数断点 设置数据断点 单步执行 查看内存值 修改内存值 linux下的gdb,和vxworks下的shell 虽然使用方式和调试命令略有不同,但是都能满足 ...
- asp.net webservice 返回json数据乱码解决方法
[WebMethod] public void QueryRiskNotice(string phone) { try { var data = _riskNoticeDal.QueryRiskNot ...
- 【Validate Binary Search Tree】cpp
题目: Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is define ...
- 网络服务器带宽Mbps、Mb/s、MB/s有什么区别?10M、100M到底是什么概念?
网络服务器带宽Mbps.Mb/s.MB/s有什么区别?我们经常听到IDC提供的服务器接入带宽是10M独享,或者100M独享,100M共享之类的数据.这的10M.100M到底是什么概念呢? 工具/原料 ...
- WWDC2014 debugging_in_xcode_6 总结
1.GCD的waiting queue 可以在Xcode左侧的面板中查看. 2.可以对View进行debug类似reveal. 3.查看运行时的对象,对于自定义对象可以实现- (id)debugQui ...
- hdu 2686 Matrix 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the n*n ...
- max_flow(Dinic) 分类: ACM TYPE 2014-09-02 15:42 94人阅读 评论(0) 收藏
#include <cstdio> #include <iostream> #include <cstring> #include<queue> #in ...