SWD其实和JTAG类似,是一种调试串口。

JTAG大致了解了一下。JTAG(Joint Test Action Group)主要4 lines:TMS(模式选择),TCK(时钟),TDI(数据输入),TDO(数据输出)。都是串行总线。JTAG model中通过状态机的方式,对cmd进行解析后控制TMS和TDI的输出。

SWD(Serial Wire Debug)主要2 lines: SWDIO(双向串行数据线),SWDCLK(串行时钟线,Master drive)。协议:ARM CPU standard bi-directional wire protocol

ADI:ARM Debug Interface。

DAP(Debug Access Port)分为 DP (debug port)and AP(Access port)。通过物理连接访问DAP register实现debug控制。

因为DAP分为DP和AP,所以访问方式分为两种: 1. DPACC(debug port access访问DP REG) 2.APACC(debug port access访问AP REG)

DP分为 SW-DP(Seiral Wire Debug Port),JTAG-DP和SWJ-DP(SW-DP和JTAG-DP的结合)。我要用到的是SWJ-DP

DP可以访问多个AP.其中AP分为MEM-AP和JTAG-AP。MEM-AP的作用是用来作为连接AHB/APB的桥梁,可以访问内存,比如AHB-AP,APB-AP,JTAG-AP,Cortex-M3

DP就是调试接口的硬件,AP 就是一个访问周边外设和内存的硬件接口。

外部设备通过SWDIO/SCLK pins来通信。

Trn-Trn:即Line turn-round,当总线上的数据传输方向发送改变时(比如由Host->Target变为Target->Host),需要插入Trn,Trn为一个CLK时序,

Idle  cycles:在一个总线完成后,可以立即进入下一个总线操作或者是勒令总线进入Idle 状态,此时可以插入Idle cycle。

初始化

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

具体实现为:

STM32:

首先保证Host连续送出至少50个“1”,使得Target进行Line Reset,至少插入2个Idle,然后可以读取目标板的IDR,判断Target的类型。(注意:STM32可能需要进行linereset后切换JTAG/SWD mode后才能读到IDR)

get IDR后,cfg DP<SELECT>。

ARM上:

linereset方法一致。切换JTAGdao SWD mode的方法为:SWDIOTMSpins:16'h79E7(MSB first) or 16'hE79E(LSB first)

反之也可以切换啦:0x3CE7(MSB),0xE73C(LSB)

linereset后写TARGETSEL(include DPIDR+TARGETID)。然后read  IDCODE register(DPIDR)看看和写的TARGETSEL的ID对的上不.这个ID有讲究的,见intf_spec P54

啰嗦一句,不同AP的IDCODE是固定的,这里可以先读一下DPIDR,然后决定TARGETSEL怎么填。填写TARGETSEL的目的是让DP可以片选到正确的AP。

TARGETSEL包括APSEL/APBANKSEL/DPBANKSEL。分别用于 AP片选 ; 要访问的AP REG的BANK地址(adddr[7:4]);DP的4个寄存器选择(见314H文档中P63)

ARM IDCODE如下:

协议:

Host send 8-bit request to target -> Target response 3-bit OK acknowledge to host -> 33-bit data phase (write by host / read by target)

request phase:共8bit

-Start     起始位,始终为1,这也是Target判断总线从空闲状态退出的条件

-APnDP  选择要访问的是DP寄存器还是AP寄存器。0:DP   1:AP

- Rnw    选择是读还是写。0:Write   1:Read

-A[2:3]   DP或者AP寄存器的地址,注意它是低位在前。

-Praity   奇偶校验位,它是APnDP、RnW和A[2:3]共4个bit的校验位

-Stop    停止位。始终为0。

-Park     该位确切来说应该始终为1

acknowledge phase:

-OK : means successful —— 3‘b001

-WAIT:means host must retry the operation later —— 3'b010

-FAULT: means an error has occurred and one of the sticky bits in CTRL/STAT is set. The host can check the sticky error bits to see what kind of error has occurred.It must clear the sticky bits in ABORT register before using any AP commands, because the target will always respond with FAULT as long as one of the sticky error bits are set. ——3‘b100

data phase:

32*data_bits + 1*parity_bit

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

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

寄存器

SW-DP (serial write debug port)registers:

占位,待续

依据官方spec的补充笔记

MEM-AP 访问方式见下图。从上往下看依次寻址,最后访问到目的寄存器

PS:注意auto addr++ 4K边界的问题

参考:

1.blog :https://blog.csdn.net/baiyibin0530/article/details/51682179 这个blog的内容是以对STM32开发板做SWD调试写的。对于我来说比较有参考意义的为初始化部分。

2.github: https://github.com/MarkDing/swd_programing_sram  基于cortex M3的debug port,programming internal SRAM。对于我来说,只有协议部分比较有用。

3.自用。ARM 官方出品的Debug interface spec。

SWD学习笔记的更多相关文章

  1. Spring实战第八章学习笔记————使用Spring Web Flow

    Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...

  2. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  3. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  4. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  5. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  6. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  7. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  8. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  9. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

随机推荐

  1. 控制反转(IOC)和依赖注入(DI)

    控制反转(IOC)和依赖注入(DI)IoC(Inversion of Control,控制反转) 是Spring 中一个非常非常重要的概念,它不是什么技术,而是一种解耦的设计思想.它的主要目的是借助于 ...

  2. Jmeter_接口串联自动化测试_登录后充值获取cookie

    1.登陆->充值->运行会报错 2,那如何解决这个问题呢,添加HTTP COokie管理器 另外一种方法,登录->提取正则表达式,充值->添加HTTP cookie管理器

  3. Android 调起系统相机拍照

    概述 最近在看 nanChen 写的图片选择器 ImagePicker,感觉写得很不错,也打算把从中学到的东西写下来.很多时候,遇到一个好的框架能够降低开发成本这是好事.但是也要去了解其内部具体实现逻 ...

  4. 【Go语言系列】1.2、GO语言简介:哪些大公司正在使用Go语言

    Go语言的强项在于它适合用来开发网络并发方面的服务,比如消息推送.监控.容器等,所以在高并发的项目上大多数公司会优先选择 Golang 作为开发语言. 1.Google 这个不用多做介绍,作为开发Go ...

  5. Python引用某一文件的方法出现红色波浪线

    from parse import parse_url#引用parse里面的方法 结果出现波浪线并提示 This inspection detects names that should resolv ...

  6. 【代码学习】PYTHON字典(Dictionary)

    一.什么是字典 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key->value)对用(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如下 d ...

  7. 【知识学习】PHP实现批量替换字典后缀

    <?php //要打开字典的物理路径 $filename = 'E:\Local Test\WWW\password.txt'; $handle = fopen($filename,'r') o ...

  8. ETCD的常用命令

    Note that any key that was created using the v2 API will not be able to be queried via the v3 API. A ...

  9. 吴裕雄--天生自然Numpy库学习笔记:NumPy 数学函数

    NumPy 包含大量的各种数学运算的函数,包括三角函数,算术运算的函数,复数处理函数等. NumPy 提供了标准的三角函数:sin().cos().tan(). import numpy as np ...

  10. 获取天气预报java代码

    import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; imp ...