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. NET com组件注册

    1.签名 右击项目->属性->[签名]标签, 选中[为程序集签名]–>[选择强名称密钥文件]–>[新建],输入你的密钥名称,去掉[使用密码保护密钥文件] 最重要的签名,并且注册 ...

  2. 猴博士4小时讲完C语言视频教程

    猴博士4小时讲完C语言视频教程,一共有9节课. 目录结构如下: 目录:/2020030-猴博士4小时讲完C语言 [1G] ┣━━1.C语言基本语句(上)(更多资源访问:www.jimeng365.cn ...

  3. PAT 1014 Waiting in Line (30分) 一个简单的思路

    这题写了有一点时间,最开始想着优化一下时间,用优先队列去做,但是发现有锅,因为忽略了队的长度. 然后思考过后,觉得用时间线来模拟最好做,先把窗口前的队列填满,这样保证了队列的长度是统一的,这样的话如果 ...

  4. python的爬虫小入门

    爬虫的相关操作 1.爬文本内容 # coding=gbk import requests ##声明相关库 import re response=requests.get('http://duanziw ...

  5. 基于Ubuntu和基于Debian的Linux Mint 20新特性一览

    导读 Linux Mint 20 将基于 Ubuntu 20.04 LTS,同时,其 LMDE(Linux Mint Debian Edition,Debian 版本)4 也将到来,LMDE 版本基于 ...

  6. zookeeper 源码(一) 选举和同步数据

    前言 在开始阅读代码前我们先来了解一下zk 的大致结构,具体大概要实现的核心功能有那些,心中有个大概的框架阅读代码时再深入其中的细节,就会非常好懂,本人觉得这是一个阅读源码的好方法,可以最快地切入到源 ...

  7. Jekyll本地搭建开发环境以及Github部署流程

    转载自: http://www.jianshu.com/p/f37a96f83d51 前言 博客从wordpres迁移到Jekyll上来了,整个过程还是很顺利的.Jekyll是什么?它是一个简单静态博 ...

  8. 惠普笔记本,如何选择U盘启动

    开机先连续点击键盘F9按键进入选择启动盘界面,找到自己的U盘(KingstonDataTraveler G3)

  9. 【转】jenkins_pipeline语法详解

    pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化. pipeline 是jenkins2.X 最核 ...

  10. 动态规划-国王的金矿问题java

    紧接着上一篇动态规划问题,现在我们开始探讨一个新的问题,问:有一个发现了5个金矿,每一个金矿的储量不同,需要参与挖掘的工人数也不通,参与挖矿工人的总数量是10人,每一座金矿要么全挖,要么不挖,不能派一 ...