调试工具链:(1)全流程概述
简单做个资料整理,还有很多东西没搞明白。
简单做个资料整理,还有很多东西没搞明白
一、调试工具链全流程图
1、流程图

核心架构与数据流
2、各个组件的作用和部署位置
2.1 各组件作用
| 组件 | 是否必须 | 典型实现 | 通信方式 |
|---|---|---|---|
| IDE | ✔️ | Keil/IAR/VSCode | GUI交互调试操作 |
| GDB前端 | ✔️ | arm-none-eabi-gdb | 识别和解析用户调试操作,转成对应的RSP协议下的调试命令 |
| GDB Server | ✔️ | pyOCD/OpenOCD/CMSIS-DAP-GDBServer | 通过TCP/IP端口接收GDB传过来的RSP协议数据并将其转成SWD/JTAG协议的数据命令,然后调用电脑的USB驱动使用USB-HID接口传输 |
| DAP调试器 | ✔️ | DAPLink/J-Link EDU | 调试器带有USB-HID,接收电脑发来的USB数据,数据内容是SWD/JTAG的调试命令 |
| 芯片DAP模块 | ✔️ | DAP硬件电路模块 | 芯片内部设计的DAP硬件调试模块,提供调试总线、调试寄存器等,能够通过调试指令访问内核和存储器等内部资源 |
2.1 组件部署位置
| 组件 | 安装位置 | 是否集成在IDE | 作用说明 |
|---|---|---|---|
| IDE | 调试电脑 | 主平台 | 提供用户界面 (如CCS/Keil) |
| GDB前端 | 调试电脑 | ✔️ 通常集成 | 解析调试命令 (如break, step) |
| GDB Server | 调试电脑 | ❌ 独立进程 | 协议转换核心 (RSP↔SWD/JTAG) |
| USB驱动 | 调试电脑 | ❌ 系统级 | 管理调试器硬件通信 |
| 物理调试器 | USB硬件设备 | 外置设备 | SWD/JTAG↔USB信号转换 (如J-Link) |
| 目标芯片 | 开发板 | 待调试设备 | 执行程序 |
3、应用实例
3.1 示例1:读取寄存器R0
IDE->>GDB: 发送"read r0"
GDB->>Server: RSP包: $p0#00
Server->>USB: CMSIS-DAP命令: DAP_RegRead(0)
USB->>Probe: USB Bulk传输
Probe->>DP: SWD序列: AP ACC → MEM-AP
DP->>AP: 选择APBANK=0
AP->>Core: 设置DCRSR=0x00 (R0)
Core->>AP: 返回R0值
AP->>DP: 数据响应包
DP->>Probe: SWD ACK+数据
Probe->>USB: USB IN包
USB->>Server: 0x12345678
Server->>GDB: RSP包: $12345678#00
GDB->>IDE: 显示R0=0x12345678

3.2 示例2:设置断点
二、重要的基本概念
1、IDE的调试GUI
用于产生调试操作,比如keil的调试界面,断点、单步运行、读取或写入某个变量或者地址的值等等操作,都是用户通过GUI界面产生的。
- 作用:用户交互界面(断点设置/寄存器查看等)
- 示例操作:用户点击"单步执行"按钮
- 输出:生成GDB命令
stepi
2、IDE的调试GDB
GDB(GNU Debugger)是 GNU项目开发的标准命令行调试工具,用于分析程序运行状态、定位代码缺陷。用户产生的调试操作命令需要经过GDB识别和翻译成通用的调试命令,比如stepi、break等。也就是说GUI调试界面本质是调用了GDB产生通用的调试指令!但是产生的调试指令是按照RSP协议格式并通过TCP/IP协议发送给GDB Server。这是为了通用和兼容。
- 角色:调试命令解析引擎
- 协议:使用RSP(Remote Serial Protocol)协议
- 关键文件:
arm-none-eabi-gdb.exe
2.1 GDB的替代调试器
| 调试器名称 | 开发者 | 适用场景 | 开源协议 |
|---|---|---|---|
| LLDB | LLVM项目 | macOS/iOS原生支持 | Apache 2.0 |
| SEGGER Ozone | SEGGER | J-Link专用独立调试环境 | 商业许可 |
| IAR C-SPY | IAR Systems | IAR嵌入式工作台专用 | 商业许可 |
| Lauterbach TRACE32 | Lauterbach | 军工/汽车级调试 | 商业许可 |
3、电脑的调试GDB Server
3.1 GDB Server作用
GDB Server(GDB 服务器)是一个调试代理程序,在调试过程中扮演桥梁角色:
- 功能定位:将本地调试器(如 GDB)的调试指令翻译成硬件接口协议(如 JTAG/SWD),支持15000+种类的芯片指令集的翻译。
- 运行位置:在开发主机(PC)上运行,通过 USB 连接调试器硬件(如 J-Link)
- 类型:
- J-Link GDB Server:针对SEGGER硬件优化
- pyOCD:ARM官方CMSIS-DAP实现
- 调试指令转换示例:
# 收到GDB的stepi命令 def handle_step(): jtag.write_ir(DBG_IR) # 选择调试寄存器 jtag.write_dr(0x00000001) # 设置单步标志位
核心作用
| 功能 | 说明 |
|---|---|
| 协议转换 | 将 GDB 的 RSP 协议转换为 J-Link 的 JTAG 协议以及SWD协议 |
| 硬件抽象 | 屏蔽不同芯片的调试差异(如 28335 的 C28x 内核) |
| 实时监控 | 管理断点、寄存器访问、内存读写等底层操作 |
| 多平台支持 | 使任意兼容 GDB 的调试器(如 CCS、Eclipse)能调试专用硬件 |
3.2 ARM调试场景的GDB Server实现
主流GDB Server方案
| 方案名称 | 开发者 | 支持DAP调试器 | 特点 |
|---|---|---|---|
| pyOCD | Arm Mbed | ✔️ 原生支持 | Python编写,支持热重载 |
| OpenOCD | 开源社区 | ✔️ 需配置驱动 | 支持200+调试器,支持FTDI/J-Link/ST-Link等多品牌,扩展性强 |
| CMSIS-DAP GDBServer | Arm | ✔️ 官方方案 | 轻量级(<1MB) |
| J-Link GDB Server | SEGGER | ❌ 仅J-Link | 商业级性能,支持50MHz+ ,仅Jlink使用 |
4、电脑的调试USB驱动
4.1 功能解析
- 作用:操作系统与调试器的通信管道
- 驱动类型:
jlinkusb.sys:J-Link专用winusb.sys:通用CMSIS-DAP驱动
- 数据传输:USB批量传输(Bulk Transfer)
| 功能 | 作用原理 | 调试场景示例 |
|---|---|---|
| 设备枚举 | 检测设备VID/PID,加载对应驱动 | 识别J-Link(VID=1366, PID=0105) |
| 数据传输 | 管理4种传输类型: 1. 控制传输(Setup) 2. 批量传输(Bulk) 3. 中断传输(Interrupt) 4. 同步传输(Isochronous) |
GDB Server通过Bulk传输发送JTAG命令 |
| 电源管理 | 控制设备供电状态 | 休眠唤醒调试器 |
| 错误处理 | CRC校验/超时重传/协议错误恢复 | JTAG通信失败时自动重试 |
4.2 在ARM调试中的工作流程
场景:通过J-Link读取ARM芯片IDCODE
sequenceDiagram
GDB Server->>USB驱动: libusb_bulk_transfer(EP_OUT, 0xE0 0x00 0x00)
USB驱动->>USB控制器: 构造USB包(令牌+数据+握手)
USB控制器->>J-Link: 发送差分信号
J-Link->>USB控制器: 返回IDCODE(0x4BA00477)
USB控制器->>USB驱动: 原始数据帧
USB驱动->>GDB Server: 解析为0x4BA00477
5、调试器的USB模块
DAP固件中的USB模块是其核心组件,负责在调试器与主机(如PC)之间建立高效通信通道,实现调试数据传输、烧录控制及串口通信等功能。
一、架构与核心组件
-
协议栈集成
- 开源栈(TinyUSB):开源DAP实现(如UINIO-DAP-Link)多采用TinyUSB协议栈,支持跨平台移植(STM32、MM32等),实现HID、CDC、MSC等复合设备功能,避免厂商绑定。
- 专用栈(厂商优化):商业调试器(如ST-Link/J-Link)使用定制协议栈,针对硬件优化性能,但移植性受限(如SEGGER驱动较WinUSB吞吐量高300%)。
-
HID报告描述符
定义调试数据包格式,包大小固定为64字节(DAP_PACKET_SIZE=64),缓冲区深度为1(DAP_PACKET_COUNT=1),简化实时处理。示例如下:// HID报告描述符(CMSIS-DAPv1) 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined) 0x09, 0x01, // Usage (Debug Data) 0xA1, 0x01, // Collection (Application) 0x95, DAP_PACKET_SIZE, // Report Count = 64 -
命令路由机制
- 主机命令触发:通过
tud_hid_set_report_cb()回调接收主机数据,调用DAP_ExecuteCommand()执行操作。 - 核心命令集:包括:
ID_DAP_Transfer:寄存器/内存读写ID_DAP_SWJ_Pins:SWD/JTAG引脚控制ID_DAP_ResetTarget:目标芯片复位。
- 主机命令触发:通过
6、调试器的协议转换程序
6.1 DAP调试指令集
参考文档:
《ARM-Debug接口手册》
《IHI0029F_coresight_v3_0_architecture_specification》
https://www.cnsee.net/articles/swd.html
6.1.1 核心指令分类
| 类别 | 指令ID | 功能 | 数据格式 |
|---|---|---|---|
| 连接管理 | 0x00 |
DAP_Info (获取信息) | [ID] (e.g., 0x01=固件版本) |
0x02 |
Connect (选择接口) | [0]=SWD, [1]=JTAG |
|
| 传输控制 | 0x04 |
Transfer (发起读写) | [0]=请求, [1]=AP/DP 选择 |
0x05 |
TransferBlock (批量传输) | [0]=请求, [1]=传输次数 |
|
| SWD 专用 | 0x08 |
SWD_Sequence (发送序列) | [0]=序列长度, [1..N]=序列 |
0x1B |
SWD_Configure (配置时钟) | [0]=周期计数 |
|
| JTAG 专用 | 0x10 |
JTAG_Sequence (发送序列) | 类似 SWD |
0x14 |
JTAG_Configure (设置 IR 长度) | [0]=IR 长度数组 |
|
| Trace 控制 | 0x81 |
SWO_Transport (选择传输协议) | [0]=协议 (0=禁用, 1=UART) |
0x82 |
SWO_Mode (设置模式) | [0]=模式 (0=离线, 1=实时) |
6.1.2 关键指令解析示例
-
DAP_Info 请求固件版本:
- 发送包:
[0x00] [0x01]
(0x00=命令ID,0x01=请求固件版本) - 响应包:
[版本字符串长度] [...字符串]
(e.g.,0x07 'v', '2', '.', '0', '.', '0')
- 发送包:
-
SWD 单次读写传输(Transfer 命令):
- 写 AP 寄存器请求:
[0x04] [0x00] [0x03] [0xA3] [addr_low] [addr_high] [data0] [data1] ...0x04: Transfer 命令0x00: 请求头(写操作 + DP/AP 选择)0x03: AP 寄存器索引 (e.g., CSW=0, TAR=1, DRW=3)0xA3: 数据长度(4字节)
- 读响应:
[状态] [数据0] [数据1] ...
- 写 AP 寄存器请求:
-
SWD 序列初始化(用于目标识别):
# 发送复位序列:50个高电平 + SWD切换序列 cmd = [0x08, 0x34, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # 50个1 (TCK=1) 0x9E,0xE7] # 0b1001110111 (SWDIO切换序列)
6.1.3 DAP典型源码
6.1.3.1 规范和源码下载
【1】核心规范文档
- CMSIS-DAP Specification v2.1.0
ARM Keil 官网下载链接
【2】开源参考实现
-
DAPLink 项目(ARM 官方维护,CMSIS-DAP 的进化版)
GitHub: https://github.com/ARMmbed/DAPLink
包含:- 固件源码(支持 STM32F103/LPC11U35 等)
- 硬件设计(KiCad 原理图/PCB)
- 测试用例
-
CMSIS-DAP 示例代码
ARM CMSIS GitHub →CMSIS/DAP目录
提供基础固件框架(需适配硬件)。
6.1.3.2 源码框架
【1】CMSIS-DAP典型指令
// 内存读指令结构
struct DAP_MemRead {
uint8_t cmd = DAP_MEM_READ;
uint8_t ap; // AP编号
uint32_t addr; // 目标地址
};
// USB传输封装
void send_mem_read(uint32_t addr) {
uint8_t packet[1+4] = {DAP_MEM_READ, 0, addr};
usb_send_bulk(packet);
}
typedef struct {
uint8_t cmd; // 指令码(如DAP_INFO)
uint8_t data[64]; // 指令参数/返回缓冲区
} DAP_Command_t;
typedef struct {
uint32_t select; // AP/DP选择寄存器值
uint32_t csw; // AP访问控制字(位宽/特权模式)
} DAP_State_t; // 调试会话状态机
typedef enum {
SWD_DP_IDLE,
SWD_DP_WAIT_ACK, // 等待ACK响应
SWD_DP_DATA_PHASE, // 数据传输状态
SWD_DP_ERROR // 协议错误(需发送SWD_JTAGtoSWD复位序列)
} SWD_DP_State_t;
【2】CMSIS-DAP框架
【2.1】核心模块
| 文件名 | 功能描述 |
|---|---|
DAP.c |
协议入口层:解析上位机指令,调用下层功能 |
DAP.h |
定义所有DAP指令码、返回码及数据结构 |
DAP_Config.h |
硬件抽象层:定义SWD/JTAG引脚、时钟、缓冲区大小等硬件参数 |
SWD_DP.c |
SWD协议状态机实现(DP/AP寄存器读写) |
JTAG_DP.c |
JTAG协议扫描链操作(IR/DR移位) |
DAP_vendor.c |
厂商扩展指令实现(如固件升级) |
USBHID.c |
USB HID协议通信层(V1标准) |
WinUSB.c |
WinUSB协议通信层(V2高速模式,支持大包传输) |
【2.2】核心调试指令集
CMSIS-DAP定义36个标准指令(ARM文档编号:ARM IHI 0031E),分类如下:
(1) 连接控制指令
| 指令码 | 功能 | 参数示例 |
|---|---|---|
DAP_Connect |
选择调试接口(SWD/JTAG) | port=1 (1=SWD, 2=JTAG) |
DAP_Disconnect |
释放调试接口 | 无参数 |
DAP_SWJ_Clock |
设置SWD/JTAG时钟 | clock=4000 (单位kHz) |
(2) 寄存器访问指令
| 指令码 | 功能 | 数据结构 |
|---|---|---|
DAP_Transfer |
批量读写DP/AP寄存器 | reg_type[bit0]: 0=DP/1=AP, reg_addr[bit2:1] |
DAP_TransferBlock |
高速块传输(用于内存读写) | block_count=16 (一次传输16个寄存器) |
(3) 断点控制指令
| 指令码 | 功能 | 实现原理 |
|---|---|---|
DAP_SW_Breakpoint |
设置软件断点 | 替换内存指令为0xBEAB (ARM Thumb BKPT) |
DAP_HW_Breakpoint |
配置硬件断点(需DWT支持) | 写DWT_COMP寄存器组 |
(4) 跟踪指令
| 指令码 | 功能 | 硬件依赖 |
|---|---|---|
DAP_SWV_Config |
配置SWO跟踪速率 | 需连接目标板SWO引脚 |
DAP_SWV_Read |
读取SWO环形缓冲区数据 | 使用ITM协议解码 |
6.2 DAP调试寄存器
芯片调试寄存器详解
| 地址 | 寄存器 | 位域 | 功能 |
|---|---|---|---|
| 0xE000EDF0 | DHCSR | [0] C_STEP | 单步执行 |
| [1] C_MASKINTS | 屏蔽中断 | ||
| [16] S_REGRDY | 寄存器就绪 | ||
| 0xE000EDF4 | DCRSR | [7:0] REGSEL | 寄存器选择 |
| 0xE000EDF8 | DCRDR | [31:0] DATA | 数据寄存器 |
7、调试器的SWD/JTAG驱动
7.1 JTAG
JTAG(Joint Test Action Group)协议是一种广泛应用的边界扫描测试与调试标准接口,现已成为IEEE 1149.1标准。
7.1.1 核心标准文档
| 文档编号 | 名称 | 内容 |
|---|---|---|
| IEEE 1149.1-2013 | 《Standard Test Access Port and Boundary-Scan Architecture》 | 完整协议规范(最新版) |
| IEEE 1149.7-2009 | 压缩版JTAG(cJTAG)标准 | 减少信号线的扩展协议 |
7.1.1.1 物理层
7.1.1.2 协议层
7.1.2 核心寄存器
(1) TAP控制器 (Test Access Port Controller)
- 核心:16状态有限状态机(FSM),由TCK上升沿和TMS信号驱动。
- 关键状态:
Test-Logic-Reset:初始化状态Shift-DR/Shift-IR:移位数据/指令Update-DR/Update-IR:更新数据/指令寄存器Capture-DR/Capture-IR:捕获数据到寄存器
(2) 指令寄存器 (Instruction Register - IR)
- 存储当前操作的指令(如
BYPASS,EXTEST,SAMPLE等)。 - 长度由芯片设计决定(通常4-10位)。
(3) 数据寄存器 (Data Registers - DR)
| 寄存器类型 | 作用 |
|---|---|
| 边界扫描寄存器 (BSR) | 检测芯片引脚电平及PCB互联(核心测试功能) |
| 旁路寄存器 (BYPASS) | 1位寄存器,缩短扫描链路径 |
| 器件ID寄存器 | 读取芯片ID(32位标准格式) |
| 用户自定义寄存器 | 用于调试(如访问ARM CoreSight寄存器) |
7.1.3 核心指令集
| 指令 | 二进制码 | 功能 |
|---|---|---|
EXTEST |
全0 | 测试PCB互联(驱动引脚电平检测短路/开路) |
SAMPLE/PRELOAD |
可变 | 采样引脚状态 / 预加载BSR数据 |
BYPASS |
全1 | 启用旁路模式(缩短扫描链) |
IDCODE |
可变 | 读取芯片ID |
DEBUG (自定义) |
可变 | 访问调试寄存器(如ARM的DAP) |
7.2 SWD
SWD 是一种专门的两线式串行调试协议,由 ARM 公司开发并推广。用于调试和编程基于 ARM Cortex-M (以及部分 Cortex-A/R) 内核的微控制器/微处理器。仅需 2 根核心信号线 (SWDIO, SWCLK),有时可配合一根可选的 RESET 信号线(通常称为 nRST 或 TRST)。这比传统的 JTAG(至少需要 4-5 根线)节省了大量宝贵的 GPIO 引脚。
7.2.1 规范文档和电气
ARM IHI 0031E:《ARM Debug Interface Architecture Specification ADIv5.0 to ADIv5.2》 - 这是定义 SWD 协议细节的最核心文档。它涵盖了 ADIv5 调试架构,其中 SWD 是该架构支持的一种物理传输协议(另一种是传统的 JTAG)。
A. 物理层 (Physical Layer)
- 信号线:
- SWDIO (Serial Wire Debug I/O): 双向数据线。用于传输命令、地址和数据。采用开漏或推挽输出(具体由目标芯片决定)。
- SWCLK (Serial Wire Debug Clock): 输入时钟线。由调试器 (Debug Probe/Host) 提供,同步所有数据传输。信号是单向的,从调试器输出到目标设备。
- 可选信号:
- SWO (Serial Wire Output): 单向输出线(从目标到调试器),用于传输 ITM (Instrumentation Trace Macrocell) 或 ETM (Embedded Trace Macrocell) 的跟踪数据(如
printf输出、事件计数器、程序流跟踪点等)。注意:SWO 不属于 SWD 核心调试协议本身,但常与 SWD 配合使用。 - nRST / TRST: 复位信号线。用于在连接不稳定或目标锁死时强制复位目标设备。虽然不是协议强制要求,但强烈推荐使用以提高连接可靠性。
- SWO (Serial Wire Output): 单向输出线(从目标到调试器),用于传输 ITM (Instrumentation Trace Macrocell) 或 ETM (Embedded Trace Macrocell) 的跟踪数据(如
- 电气特性:
- 通常工作在 1.2V - 3.3V 范围内(调试器和目标需要电平兼容)。
- 目标设备内部通常在 SWDIO 和 SWCLK 线上有弱上拉电阻(约 50KΩ - 100KΩ)。
- 时钟速率由调试器驱动,目标设备根据其能力进行应答。常见速率范围从几百 KHz 到 50MHz 或更高(取决于具体芯片)。
- 连接器: 通常使用标准的 0.1" 间距引脚排针(如 10-pin Cortex Debug Connector, 20-pin ARM JTAG Connector)或更小的 Tag-Connect 连接器。
B. 协议层 (Protocol Layer)
- 包结构 (Packet Structure): SWD 通信基于严格时序定义的包进行。每个事务由调试器发起,目标设备响应。
- 起始 (Start): 1个时钟周期的高电平。
- APnDP (Access Port / Debug Port): 1 bit。指示访问的是 DP (Debug Port) 还是 AP (Access Port)。
- RnW (Read / Write): 1 bit。指示是读操作还是写操作。
- A[2:3] (Address): 2 bits。指定要访问的 DP/AP 寄存器的地址位。DP 寄存器地址空间只有 4 个位置(0x0, 0x4, 0x8, 0xC),AP 寄存器地址空间类似。
- Parity: 1 bit。对之前的 APnDP, RnW, A[2:3] 位进行奇偶校验(偶校验)。
- 停止 (Stop): 1个时钟周期的低电平。
- 挂起 (Park): 1个时钟周期的高电平 (SWDIO 被目标驱动为高阻,由上拉拉高)。
- 应答 (Ack): 3 bits。由目标设备发送,指示操作状态:
OK (001): 成功。WAIT (010): 目标忙,需重试。FAULT (100): 发生错误(如访问无效地址)。No Response: 通常表示物理连接问题或目标未正确初始化。
- 数据 (Data): 32 bits (读或写的数据) 或 8 bits (某些特定操作)。
- 奇偶校验 (Parity): 1 bit。对 32 位数据 (或 8 位) 进行奇偶校验(偶校验)。
- 停止 (Stop): 1 bit。写操作时为 LOW;读操作时调试器释放 SWDIO 线(高阻,由上拉拉高)。
- 挂起 (Park): 1 bit。SWDIO 保持高电平。
- 传输方向 (Turnaround): 因为 SWDIO 是双向的,协议在调试器发送请求和目标返回应答/数据之间,以及目标返回应答和调试器发送/接收数据之间,定义了特定的方向切换周期(通常是 1 个时钟周期,SWDIO 处于高阻态,由上拉拉高)。这确保了信号稳定切换。
- 调试访问端口 (Debug Access Port - DAP): 这是调试系统的核心逻辑模块,位于目标芯片内部。
- DP (Debug Port): DAP 顶层接口,通过 SWD (或 JTAG) 与外部调试器通信。主要功能包括:
- 管理调试器与目标设备的连接和初始化。
- 提供基本控制和状态信息。
- 选择并访问特定的 AP。
- AP (Access Port): 连接到目标系统内部的不同总线(如 AHB-AP, APB-AP)。调试器通过 DP 选择并访问 AP,进而读写内存、外设寄存器、访问内核调试寄存器(通过 AHB-AP 或专门的内存映射的 CoreSight Debug Registers)。
- DP (Debug Port): DAP 顶层接口,通过 SWD (或 JTAG) 与外部调试器通信。主要功能包括:
- 错误检测与恢复:
- 奇偶校验: 请求阶段和数据阶段均有奇偶校验位,用于检测传输错误。
- 应答码:
WAIT和FAULT提供操作状态反馈。 - 超时: 调试器需要在特定时间内收到有效的 ACK,否则视为超时错误。
- 线路复位 (Line Reset): 在协议初始化或检测到严重错误时,调试器通过发送 50 个以上 SWCLK 周期的高电平(SWDIO 保持高阻或为高)来强制目标 SWD 接口进入已知状态。
- 目标复位: 使用
nRST信号进行硬件复位是解决连接或目标状态问题的终极手段。
C. 初始化序列 (Initialization Sequence)
建立可靠连接的关键步骤(通常由调试器自动完成):
- 线路复位: 发送 >50 个时钟周期的高电平。
- 切换到 SWD 协议: 发送特定的 16-bit 序列 (
0xE79E) 用于将可能处于 JTAG 状态的目标切换到 SWD 模式(如果目标支持多协议接口)。 - 再次线路复位: 发送 >50 个时钟周期的高电平,确保切换到 SWD 模式后状态稳定。
- 读取 IDCODE (可选但推荐): 通过 SWD 读取 DP 的
IDCODE寄存器 (DP 地址偏移0x0)。这确认了物理连接正常且目标响应。 - 目标复位 & 初始化 (可选但推荐): 如果连接了
nRST,调试器可能会短暂拉低复位信号,然后进行必要的 DAP 配置(如设置 AP 选择、清除可能的错误状态等)。 - 访问 AP / 内存系统: 成功初始化 DAP 后,调试器即可通过读写 AP 来访问目标的内存和外设进行调试/编程。
7.2.2 核心寄存器
7.2.3 核心指令集
8、目标芯片的硬件DP和AP
ARM处理器内部的DAP(Debug Access Port)部分确实是纯硬件电路实现的,并且对外提供JTAG和/或SWD的电平接口。
-
纯硬件实现:
- DAP是ARM CoreSight调试和跟踪架构中的一个硬件模块。
- 它完全由晶体管、逻辑门等物理电路构成,集成在芯片的硅片中。
- 它的核心功能(协议解析、地址解码、寄存器访问、总线转换)不需要任何软件干预即可工作。这使得调试器即使在目标处理器内核完全停止(halted)、崩溃(crashed)或初始化之前(如复位后)也能访问芯片内部资源。
- 其设计确保了调试访问的可靠性和低延迟。
-
对外提供JTAG和SWD接口:
- DAP模块专门设计用于连接外部的调试探针(Debug Probe)。
- 它支持的两种主要物理调试协议就是JTAG和SWD:
- JTAG (IEEE 1149.1): 这是一个历史更悠久的、通用的测试和调试边界扫描标准。它使用4或5根信号线(TCK, TMS, TDI, TDO,可选的nTRST)。虽然功能强大且通用,但引脚数相对较多。
- SWD (Serial Wire Debug): 这是ARM开发的、专门针对CoreSight调试架构优化的2引脚协议(SWDIO, SWCLK)。它在保持绝大多数调试功能的同时,极大地简化了物理连接,成为现代ARM芯片(尤其是低引脚数设备)上最常用的调试接口。
- 具体实现方式:
- SWJ-DP (Serial Wire/JTAG Debug Port): 这是ARM提供的最常见的DAP实现。它同时包含两种协议的逻辑(JTAG和SWD)。芯片通常会暴露一组物理引脚(通常是SWDIO, SWCLK, [可选] TMS/RESET, [可选] TDO),具体连接哪个协议由调试探针通过一个特定的协议切换序列来选择。
- SW-DP (Serial Wire Debug Port): 只实现SWD协议。芯片只暴露SWDIO和SWCLK两个引脚。
- JTAG-DP (JTAG Debug Port): 只实现JTAG协议。芯片暴露标准的JTAG引脚(TCK, TMS, TDI, TDO, nTRST)。
- 因此,现代ARM芯片几乎都通过其DAP模块提供SWD接口(无论是单独的SW-DP还是SWJ-DP的一部分)。JTAG接口可能在SWJ-DP中可用,也可能被省略(尤其是在引脚资源极其紧张的芯片上),或者通过复用其他引脚(如SWJ-DP的TMS/RESET, TDO)来提供基本JTAG功能。
DAP的核心组件和工作简述:
一个完整的DAP通常包含两个主要部分:
-
DP (Debug Port):
- 这是调试器(通过调试探针)直接与之通信的接口。
- 它负责处理物理层的JTAG或SWD协议:接收命令、读取/写入数据、管理连接状态。
- DP内部包含一组寄存器(DP寄存器),调试器首先访问这些寄存器来识别DP类型、配置、选择要访问的AP(见下文)等。
- 类型:SW-DP, JTAG-DP, SWJ-DP。
-
AP (Access Port):
- DP是访问芯片内部资源的“网关”,而AP才是实际执行访问操作的“代理”。
- 一个DAP可以包含一个或多个AP。
- 每个AP连接到芯片内部的一条不同总线(如:AHB-AP连接到系统AHB总线,APB-AP连接到APB总线, CoreSight AP连接到CoreSight总线等)。
- AP内部也包含一组寄存器(AP寄存器)。
- 调试器通过DP选择目标AP,然后向该AP的寄存器写入命令(如要访问的地址、读写操作、数据宽度),该AP最终负责将访问请求转换成目标总线的协议(如AHB或APB),并执行实际的寄存器和内存读写操作。
- 典型AP:
- MEM-AP (Memory Access Port): 最常见。提供对芯片内存空间的访问(包括外设寄存器)。常用的有:
- AHB-AP: 连接到AHB总线。
- APB-AP: 连接到APB总线。
- AXI-AP: 连接到AXI总线。
- JTAG-AP: 提供对传统JTAG链的访问(用于兼容旧设计)。
- CoreSight AP: 访问CoreSight跟踪组件。
- MEM-AP (Memory Access Port): 最常见。提供对芯片内存空间的访问(包括外设寄存器)。常用的有:
总结:
- ARM处理器内部的DAP是一个纯硬件实现的模块,是CoreSight调试基础设施的核心。
- DAP通过其DP (Debug Port) 部分对外暴露物理调试接口,支持JTAG和/或SWD协议。
- 最常见的是SWJ-DP,它支持两种协议并通过序列切换。
- 现代设计中SWD是绝对主流,但JTAG支持也常常保留(尤其在SWJ-DP中)。
- DAP通过内部的AP (Access Port) 组件连接到芯片的不同总线,最终实现对核心寄存器、内存和外设的调试访问。
因此,当你使用JTAG或SWD调试器连接ARM芯片时,你就是在直接与芯片内部的DAP硬件模块进行通信。
9、目标芯片的资源访问
更多推荐



所有评论(0)