德国世界杯_2012年世界杯 - fyycdq.com

德国世界杯_2012年世界杯 - fyycdq.com

调试备忘录-SWD协议解析

目录--点击可快速直达

目录

写在前面

1 SWD协议简介

2 SWD物理层协议解析

2.1 SWD通信时序分析

2.2 SWD 寄存器简介

2.2.1 DP寄存器

2.2.2 AP寄存器

2.3 SWD通信流程

2.3.1 SWD复位

2.3.2 SWD读IDCODE

2.3.3 SWD清除错误标志位,并且使能AP调试

2.3.4 SWD读取AP IDR(也就是AP寄存器的ID CODE)

2.3.5 SWD读写MCU任意寄存器

写在前面

最近由于公司需要,所以就做了个基于SWD协议的离线烧写器。由于过程中参考了很多大神的文章,因此就想写个随笔记录下。整个烧写器由三个部分组成分别为:

SWD协议读写芯片内部寄存器、RAM、Flash.

STM32 + SPI + Flash + USB + FAFTS,通过USB虚拟出一个U盘,将要烧写的BIN文件放到这个U盘中,就可以烧写了.

OLED + 按键,实现简单的操作页面.

本章先对SWD协议进行解析,整个文章主要分了三个部分,第一部分是对SWD协议进行简介;第二部分是对SWD协议进行物理层上的解析;

1 SWD协议简介

SWD的全称应该是The Serial Wire Debug Port(SW-DP),也就是串行调试端口,是ARM目前支持的两种调试端口之一,另一个调试端口叫做JTAG Debug Port,也就是我们常用的J-link上面的调试端口(JTAG模式下)。

基于ARM CoreSight调试构架,SWD可以通过传输数据包来读写芯片的寄存器。

2 SWD物理层协议解析

SWD需要三根线与目标的MCU连接,分别为SWDIO、SWDCLK和GND.后面的内容中,HOST为主机,就是我们提供的SCK的一方;TARGET为目标MCU。

SWDIO为双向Data线,主机读写目标芯片数据。

SWDCLK为时钟线,类似于SPI需要由主机提供时钟。同时,数据都是在时钟下降沿读取,上升沿进行数据翻转。

GND为双向Data口,主机读写目标芯片数据。

2.1 SWD通信时序分析

首先放个写操作成功的时序图。

从图中可知,整个流程大致分为三部分:

第一部分:HOST -> TARGET 主机发送读写命令,这部分指定了读写操作,指定了要访问AP还是DP,还指定了ADDR。

第二部分:TARGET -> HOST 目标MCU回复Ack,通知主机是否可以继续操作。

第三部分:HOST -> TARGET 主机写数据

下面,我们针对图中的一些名词做出解释:

Start: 一位起始位,值为1。

APnDP: 一位,表示访问的是DP寄存器还是AP寄存器,0:DP,1: AP。

RnW: 一位,表明是读操作还是写操作,0:写,1:读。

ADDR[2:3]:两位,给出DP或者AP寄存器地址ADDR[3:2]地址区域,发送时低位在前(后面有具体说明)。

Parity: 一位 为前面的数据包提供奇偶校验。在包头中的校验位校验了APnDP, RnW and A[2:3],在数据中的校验位校验了32位的数据。

Stop: 一位,停止位,值为0。

Park: 一位,在传输该位时,主机不对SWDIO进行驱动,该线由硬件拉高(上拉),所以这位读作一。

Trn: 调转周期,在该周期中,不对线进行前驱动,实际应用时,这个时候要将SWDIO引脚的输入输出状态翻转。这个周期的时间由TURNROUND控制(位于WCR寄存器中)。

Ack[0:2]: 三位,目标MCU到主机的响应,低位在前。100:成功,010:等待,001:失败。

WDATA[0:31]: 32位的写数据包,由主机发送给目标MCU。

RDATA[0:31]: 32位的读数据包,由MCU发送给主机。

值的注意的是,Trn,调转周期,因为我们是单总线通信,一根线上既有写又有读,而这个Trn就是发生在写读切换的时候的一个延时。

2.2 SWD 寄存器简介

SWD通信的时候主要涉及的寄存器就两个,一个DP,一个AP。

如图所示,DP就是Debug port,AP 就是 Access port。如果要访问内核寄存器,就得先配置DP->AP->MEM-AP。

2.2.1 DP寄存器

DP寄存器如下图,地址就是我们在包头中的ADDR[2:3],这两位指示的地址。具体的寄存器实在是太多了,具体的请参考《ARM Debug Interface v5 Architecture Specification》。

值的说明的是,总线复位之后,然后进行JTAG和SWD的切换操作(发0X79,0XE7或者0X6D,0XB7),然后必须先读下IDDCODE,判断下MCU的类型,然后才能继续别的操作。

2.2.2 AP寄存器

AP寄存器如下路,AP寄存器相比较于DP则是复杂了很多。具体的寄存器实在是太多了,具体的请参考《ARM Debug Interface v5 Architecture Specification》。

2.3 SWD通信流程

2.3.1 SWD复位

如下图,ARM对SWD的复位有明确的说明,要求连续50个时钟周期的高电平,认为是SWD复位,同时复位之后必须读一次IDCODE(位于DP寄存器中)。

下图是我的复位时序,多写了5个周期的电平

2.3.2 SWD读IDCODE

IDCODE位于SWD DP寄存器中,将地址设置为00b,读DP操作,就可以读到IDCODE了,根据内核型号不同,一般第一数字不一样,我的是0x0BB11477.

下图是我的读IDCODE时序

2.3.3 SWD清除错误标志位,并且使能AP调试

通过写DP中的APBORT[4:1],来清除错误标志位。

通过写DP中的CTRL/STAT[30]和CTRL/STAT[28]使能AP调试

2.3.4 SWD读取AP IDR(也就是AP寄存器的ID CODE)

读取AP寄存器的步骤:

第一步通过写DP 中的SELECT寄存器,确定APBANK.

第二步通过AP命令包头的地址,确定APBANK内部的位置,发送读AP命令。

如图DP SELECT寄存器。

如图,AP寄存器,APBANK决定的是BANK 0x0 -> BANK 0xF.ADDR[3:2]决定的是BANK内部的地址(ADDR[1:0]都是0),0x00,0x04,0x08,0x0C,

所以,如果我要读取AP IDR的话,就先设置DP SELECT寄存器中的APBANKSEL为0xF,然后直接发读AP命令,ADDR[3:2]为11b.

2.3.5 SWD读写MCU任意寄存器

读取MCU任意寄存器的步骤:

第一步通过写DP 中的SELECT寄存器,确定APBANK为BANK0.

第二步通过AP命令包头的ADDR[3:2]地址,确定APBANK内部的地址为0x00(CSW),发送写AP命令。数据为0x23000002(该值可能有问题,此处请自行查看CSW寄存器描述,如果这个值写完之后依然读不出DRW,请联系我).

第三步通过AP命令包头的ADDR[3:2]地址,确定APBANK内部的地址为0x04(TAR),发送写AP命令。数据为要读取的寄存器地址。

第四步通过AP命令包头的ADDR[3:2]地址,确定APBANK内部的地址为0x0C(DRW),发送读AP命令。一次读回来的数据无效。

第五步通过AP命令包头的ADDR[3:2]地址,确定APBANK内部的地址为0x0C(DRW),发送读AP命令。此时读回来的数据为正确数据。(这里读DP的RDBUFF也可以,详细请自行查阅寄存器文档)

步骤一波形:

步骤二波形:

步骤三波形:

步骤四波形:

步骤五波形:

写入MCU任意寄存器的步骤:

第一步通过写DP 中的SELECT寄存器,确定APBANK为BANK0.

第二步通过AP命令包头的ADDR[3:2]地址,确定APBANK内部的地址为0x00(CSW),发送写AP命令。数据为0x23000012(该值可能有问题,此处请自行查看CSW寄存器描述,如果这个值写完之后依然不能写入DRW,请联系我).

第三步通过AP命令包头的ADDR[3:2]地址,确定APBANK内部的地址为0x04(TAR),发送写AP命令。数据为要读取的寄存器地址。

第四步通过AP命令包头的ADDR[3:2]地址,确定APBANK内部的地址为0x0C(DRW),发送写AP命令。写入成功。

步骤一波形:

步骤二波形:

步骤三波形:

步骤四波形:

特殊说下,设置好CSW[5:4]之后,每次读写DRW之后,DRW的地址会自动+1,省去了需要每次重新设置地址的麻烦。

以上,本章的内容就结束了,通过本章的内容,可以实现SWD任意读取MCU寄存器,如果问题,请联系我~~~

调试备忘录-SWD协议解析的更多相关文章

ts 协议解析

pes : http://wenku.baidu.com/link?url=KjcA0qXqZ1bWVQTa8i1YOmygofldSQL7Pjj-zGRw1e_6_LFmVLo5DIWF0SNwVn ...

[转]netty对http协议解析原理

本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...

twemproxyRedis协议解析探索——剖析twemproxy代码正编

这篇文章会对twemproxyRedis协议解析代码部分进行一番简单的分析,同时给出twemproxy目前支持的所有Redis命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是 ...

B/S 架构中,网络模型的分解与协议解析

前言 如果是C/S专业毕业的或者是学过计算机网络课程的童鞋们,相信大家都知道网络模型的划分,本文首先来聊一聊目前对于B/S结构中,网络模型分解的两种方式. 没错,相信大家看到这个图片的时候就已经明白了 ...

详解BLE 空中包格式—兼BLE Link layer协议解析

BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题. 虽然BLE空中包(pa ...

netty对http协议解析原理解析

本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...

MODBUS协议解析中常用的转换帮助类(C#)

p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

AOSP中的HLS协议解析

[时间:2018-04] [状态:Open] [关键词:流媒体,stream,HLS, AOSP, 源码分析,HttpLiveSource, LiveSession,PlaylistFetcher] ...

WebSocket协议解析

WebSocket协议解析 转载请注明出处:WebSocket解析 现在,很多网站为了实现推送技术,所用的技术都是轮询.轮询是指在特定的时间间隔(如每一秒),由浏览器对服务器发起HTTP请求,然后由服 ...

随机推荐

前端DDD总结与思考

软件开发架构演化与DDD起源 单体服务架构:大概10年前,我在武汉工作的时候,甲方客户购买我们的产品,一般都是连着设备一起购买,一套软件系统,一台惠普或者戴尔的企业级服务器,再加一个黑色的铁盒,销售部 ...

hdu3594 强连通 tarjan

题意: 判断是不是强连通图 ,同时每一条边必须只能在一个环里 思路:之前我的强连通用的全是双深搜,结果题目的第二个要求很难判断,一开始写了三个深搜加上并查集,结果越写越乱,其实就是在判断一个边是否只在 ...

hdu2276 矩阵构造

题意: 给了n个灯泡的状态,他们绕成一个环,0是灭,1是亮,每一秒灯泡的状态都会改变,规则是如果当前这个灯泡的左边的灯泡当前是状态1,那么下一秒当前的这个灯泡状态就改变0变1,1变0,最后问 ...

Win64 驱动内核编程-8.内核里的其他常用

内核里的其他常用 1.遍历链表.内核里有很多数据结构,但它们并不是孤立的,内核使用双向链表把它们像糖 葫芦一样给串了起来.所以遍历双向链表能获得很多重要的内核数据.举个简单的例子,驱 动对象 Driv ...

Linux中的.bash_ 文件详解

目录 .bash_history .bash_logout .bash_profile .bashrc 每个用户的根目录下都有四个这样的 bash文件,他们是隐藏文件,需要使用-a参数才会显示出来 . ...

CTF常见的加密和编码方法

目录 哈希摘要算法 对称加密算法 其他加密算法 编码 哈希摘要算法 以 root 加密为例. MD4:32位的摘要算法.2add09183d0b1dc0428701df9838fba MD5:32位 ...

Service Started!!!-end In Service while

将原先的win7换成了xp,用体验换来更好的兼容 问题如下: 在虚拟机器中运行了DebugView后,就一直重复出现Service Started!!!-end In Service while, 虽 ...

【vue-05】vue-cli

Vue-router官网 安装 vue-router是一个插件包,所以我们还是需要用npm 来进行安装.打开命令行工具,进入你的项目目录,输入下面命令. npm install vue-router ...

PHP + JQuery 实现多图上传并预览

简述 PHP + JQuery实现 前台:将图片进行base64编码,使用ajax实现上传 后台:将base64进行解码,存储至文件夹,将文件名称入库 效果图 功能实现 html

去了字节跳动,才知道年薪40W的测试有这么多?

最近脉脉职言区有一条讨论火了: 哪家互联网公司薪资最'厉害'? 下面的评论多为字节跳动,还炸出了很多年薪40W的测试工程师 我只想问一句,现在的测试都这么有钱了吗? 前几天还有朋友说,从腾讯跳槽去 ...