SWD学习笔记
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学习笔记的更多相关文章
- Spring实战第八章学习笔记————使用Spring Web Flow
Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
随机推荐
- vue实现数据遍历、多个倒计时列表
移动端效果图: 1.HTML显示代码: <template> <div class="activeList"> <div class="li ...
- 吴裕雄 python 神经网络——TensorFlow实现AlexNet模型处理手写数字识别MNIST数据集
import tensorflow as tf # 输入数据 from tensorflow.examples.tutorials.mnist import input_data mnist = in ...
- PL2303HXA自2012已停产
解决"PL2303HXA自2012已停产,请联系供货商" USB不识别的问题: 问题是WIN10自带的驱动不兼容引起的,只能安装早期驱动,再驱动程序中选择旧版本驱动即可
- 【PAT甲级】1077 Kuchiguse (20 分)(cin.ignore()吃掉输入n以后的回车接着用getine(cin,s[i])输入N行字符串)
题意: 输入一个正整数N(<=100),接着输入N行字符串.输出N行字符串的最长公共后缀,否则输出nai. AAAAAccepted code: #include<bits/stdc++. ...
- 深入浅出Oracle:DBA入门、进阶与诊断案例 PDF 下载
网盘地址: 链接:https://pan.baidu.com/s/1tMFoNSUW7ICKOtmSQ5ZazA 提取码:dbnc
- VS中消除ANSI API警告
最近在VS上写网络程序遇到许多问题,因为VS中将许多ANSI中的API都重写了,那些API大多有漏洞或不能支持现在的一些编程需求了,所以在VS中使用会因为警告而不能用. 但一些老API用着比较方便,了 ...
- 健壮的I/O(RIO)
在上篇Unix系统级I/O中,我们介绍了有关在Unix环境下读取和写入文件的函数read和write,也提到了标准I/O在进行网络I/O时的局限性.但是在某些地方,直接使用read和write往往会出 ...
- A Kill Cord for your Laptop
前言 昨晚在朋友圈看到国外一篇文章利用U盘锁笔记本电脑,刚好有一个坏的金士顿U盘,所以就折腾了一下. 准备 USB设备*1 Arch系统*1 走过的坑 因为systemd-udevd带起来的进程是ro ...
- ArrayList、Vector和LinkedList
List接口特点 1.有序的 collection. 2.可以对列表中每个元素的插入位置进行精确地控制. 3.可以根据元素的索引访问元素,并搜索列表中的元素. 4.列表通常允许重复的元素. 5.允许存 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 网格系统实例:堆叠的水平
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...