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. php 接口获取公网ip并获取天气接口信息

    <?php function get_ip(){ //判断服务器是否允许$_SERVER if(isset($_SERVER)){ if(isset($_SERVER['HTTP_X_FORWA ...

  2. 记录STM32调试

    问题:加入红外初始化后,程序卡在红外初始化处 解决思路: 1.确认时钟是不是好的 2.把定时器分解调试(输入捕获.溢出分开一步一步弄) 已解决:定时器的溢出中断 注意:STM32Cube配置好后,需要 ...

  3. hybird怎么实现的(核心webview)

    链接:https://blog.csdn.net/gongch0604/article/details/80510005

  4. JavaScript 事件 继承链 元素和结点

    继承链: HTMLElement->Element->Node->EventTarget->Object document和body:document代表整个文档,body是指 ...

  5. github提交代码

    下载git for windows,安装 第一步: 第二步: 第三步:不存在repository,点击 create a repository 第四步:切换至History菜单下,并点击publish ...

  6. Python socket day3

    UDP聊天室 本地回环(127.0.0.1) 本地回环是每台电脑都有的,只能用于自身电脑的通讯,无论你的IP地址是多少,只要发送方输入的目的IP为127.0.0.1 ,自身便能接受得到数据 测试本地回 ...

  7. 【PAT甲级】1093 Count PAT's (25 分)

    题意: 输入一行由大写字母'P','A','T',组成的字符串,输出一共有多少个三元组"PAT"(相对顺序为PAT即可),答案对1e9+7取模. AAAAAccepted code ...

  8. 【C语言】无参函数调用实例

    #include<stdio.h> void hello() { printf("年轻人,加油!"); } int main() { hello(); ; }

  9. Hadoop之伪分布式安装

    一.Hadoop的安装模式有3种 ①单机模式:不能使用HDFS,只能使用MapReduce,所以单击模式主要用于测试MR程序. ②伪分布式模式:用多个线程模拟真实多台服务器,即模拟真实的完全分布式环境 ...

  10. C语言:将字符串中的字符逆序输出,但不改变字符串中的内容。-在main函数中将多次调用fun函数,每调用一次,输出链表尾部结点中的数据,并释放该结点,使链表缩短。

    //将字符串中的字符逆序输出,但不改变字符串中的内容. #include <stdio.h> /************found************/ void fun (char ...