简单做个资料整理,还有很多东西没搞明白

一、调试工具链全流程图

1、流程图

在这里插入图片描述

核心架构与数据流

调试操作
RSP协议调试命令
SWD/JTAG调试指令
USB数据
CMSIS-DAP协议
SWD/JTAG
IDE
GDB前端
GDB Server
USB驱动
物理调试器
目标芯片内部DAP硬件
目标芯片内核和存储

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:设置断点
IDE点击断点
GDB发送Z0,4000,4
GDB Server解析
USB发送DAP_SWJ_Sequence
调试器生成JTAG时序
芯片JTAG-AP
写FP_COMP0=0x4000
设置断点标志
内核执行到0x4000暂停

二、重要的基本概念

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) # 设置单步标志位
    
调试命令
JTAG指令
信号交互
GDB
GDB Server
J-Link硬件
目标芯片

核心作用

功能 说明
协议转换 将 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)之间建立高效通信通道,实现调试数据传输、烧录控制及串口通信等功能。
一、架构与核心组件

  1. 协议栈集成

    • 开源栈(TinyUSB):开源DAP实现(如UINIO-DAP-Link)多采用TinyUSB协议栈,支持跨平台移植(STM32、MM32等),实现HID、CDC、MSC等复合设备功能,避免厂商绑定。
    • 专用栈(厂商优化):商业调试器(如ST-Link/J-Link)使用定制协议栈,针对硬件优化性能,但移植性受限(如SEGGER驱动较WinUSB吞吐量高300%)。
  2. 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
    
  3. 命令路由机制

    • 主机命令触发:通过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 关键指令解析示例
  1. DAP_Info 请求固件版本

    • 发送包:[0x00] [0x01]
      (0x00=命令ID, 0x01=请求固件版本)
    • 响应包:[版本字符串长度] [...字符串]
      (e.g., 0x07 'v', '2', '.', '0', '.', '0')
  2. 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] ...
  3. 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】核心规范文档

【2】开源参考实现

  • DAPLink 项目(ARM 官方维护,CMSIS-DAP 的进化版)
    GitHub: https://github.com/ARMmbed/DAPLink
    包含:

    • 固件源码(支持 STM32F103/LPC11U35 等)
    • 硬件设计(KiCad 原理图/PCB)
    • 测试用例
  • CMSIS-DAP 示例代码
    ARM CMSIS GitHubCMSIS/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 信号线(通常称为 nRSTTRST)。这比传统的 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: 复位信号线。用于在连接不稳定或目标锁死时强制复位目标设备。虽然不是协议强制要求,但强烈推荐使用以提高连接可靠性。
  • 电气特性:
    • 通常工作在 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 通信基于严格时序定义的包进行。每个事务由调试器发起,目标设备响应。
    1. 起始 (Start): 1个时钟周期的高电平。
    2. APnDP (Access Port / Debug Port): 1 bit。指示访问的是 DP (Debug Port) 还是 AP (Access Port)。
    3. RnW (Read / Write): 1 bit。指示是读操作还是写操作。
    4. A[2:3] (Address): 2 bits。指定要访问的 DP/AP 寄存器的地址位。DP 寄存器地址空间只有 4 个位置(0x0, 0x4, 0x8, 0xC),AP 寄存器地址空间类似。
    5. Parity: 1 bit。对之前的 APnDP, RnW, A[2:3] 位进行奇偶校验(偶校验)。
    6. 停止 (Stop): 1个时钟周期的低电平。
    7. 挂起 (Park): 1个时钟周期的高电平 (SWDIO 被目标驱动为高阻,由上拉拉高)。
    8. 应答 (Ack): 3 bits。由目标设备发送,指示操作状态:
      • OK (001): 成功。
      • WAIT (010): 目标忙,需重试。
      • FAULT (100): 发生错误(如访问无效地址)。
      • No Response: 通常表示物理连接问题或目标未正确初始化。
    9. 数据 (Data): 32 bits (读或写的数据) 或 8 bits (某些特定操作)。
    10. 奇偶校验 (Parity): 1 bit。对 32 位数据 (或 8 位) 进行奇偶校验(偶校验)。
    11. 停止 (Stop): 1 bit。写操作时为 LOW;读操作时调试器释放 SWDIO 线(高阻,由上拉拉高)。
    12. 挂起 (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)。
  • 错误检测与恢复:
    • 奇偶校验: 请求阶段和数据阶段均有奇偶校验位,用于检测传输错误。
    • 应答码: WAITFAULT 提供操作状态反馈。
    • 超时: 调试器需要在特定时间内收到有效的 ACK,否则视为超时错误。
    • 线路复位 (Line Reset): 在协议初始化或检测到严重错误时,调试器通过发送 50 个以上 SWCLK 周期的高电平(SWDIO 保持高阻或为高)来强制目标 SWD 接口进入已知状态。
    • 目标复位: 使用 nRST 信号进行硬件复位是解决连接或目标状态问题的终极手段。
C. 初始化序列 (Initialization Sequence)

建立可靠连接的关键步骤(通常由调试器自动完成):

  1. 线路复位: 发送 >50 个时钟周期的高电平。
  2. 切换到 SWD 协议: 发送特定的 16-bit 序列 (0xE79E) 用于将可能处于 JTAG 状态的目标切换到 SWD 模式(如果目标支持多协议接口)。
  3. 再次线路复位: 发送 >50 个时钟周期的高电平,确保切换到 SWD 模式后状态稳定。
  4. 读取 IDCODE (可选但推荐): 通过 SWD 读取 DP 的 IDCODE 寄存器 (DP 地址偏移 0x0)。这确认了物理连接正常且目标响应。
  5. 目标复位 & 初始化 (可选但推荐): 如果连接了 nRST,调试器可能会短暂拉低复位信号,然后进行必要的 DAP 配置(如设置 AP 选择、清除可能的错误状态等)。
  6. 访问 AP / 内存系统: 成功初始化 DAP 后,调试器即可通过读写 AP 来访问目标的内存和外设进行调试/编程。
7.2.2 核心寄存器
7.2.3 核心指令集

8、目标芯片的硬件DP和AP

ARM处理器内部的DAP(Debug Access Port)部分确实是纯硬件电路实现的,并且对外提供JTAG和/或SWD的电平接口

  1. 纯硬件实现:

    • DAP是ARM CoreSight调试和跟踪架构中的一个硬件模块
    • 它完全由晶体管、逻辑门等物理电路构成,集成在芯片的硅片中。
    • 它的核心功能(协议解析、地址解码、寄存器访问、总线转换)不需要任何软件干预即可工作。这使得调试器即使在目标处理器内核完全停止(halted)、崩溃(crashed)或初始化之前(如复位后)也能访问芯片内部资源。
    • 其设计确保了调试访问的可靠性和低延迟。
  2. 对外提供JTAG和SWD接口:

    • DAP模块专门设计用于连接外部的调试探针(Debug Probe)
    • 它支持的两种主要物理调试协议就是JTAGSWD
      • 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通常包含两个主要部分:

  1. DP (Debug Port):

    • 这是调试器(通过调试探针)直接与之通信的接口。
    • 它负责处理物理层的JTAG或SWD协议:接收命令、读取/写入数据、管理连接状态。
    • DP内部包含一组寄存器(DP寄存器),调试器首先访问这些寄存器来识别DP类型、配置、选择要访问的AP(见下文)等。
    • 类型:SW-DP, JTAG-DP, SWJ-DP。
  2. 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跟踪组件。

总结:

  • ARM处理器内部的DAP是一个纯硬件实现的模块,是CoreSight调试基础设施的核心。
  • DAP通过其DP (Debug Port) 部分对外暴露物理调试接口,支持JTAG和/或SWD协议。
    • 最常见的是SWJ-DP,它支持两种协议并通过序列切换。
    • 现代设计中SWD是绝对主流,但JTAG支持也常常保留(尤其在SWJ-DP中)。
  • DAP通过内部的AP (Access Port) 组件连接到芯片的不同总线,最终实现对核心寄存器、内存和外设的调试访问。

因此,当你使用JTAG或SWD调试器连接ARM芯片时,你就是在直接与芯片内部的DAP硬件模块进行通信。

9、目标芯片的资源访问

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐