一、ADI(arm debug interface)
1.1、版本变更
|---------------|---------------------|--------|----------------|--------------|-----------------|---------------------|---|
| 特性 | ADIv1~v3 | ADIv4 | ADIv5.0 | ADIv5.1 | ADIv5.2 | ADIv6 | |
| 发布年份 | ~1994-2000 | ~2003 | 2006 | 2012 | 2017 | 2017+ | |
| 典型内核 | ARM7TDMI/ARM9/ARM10 | ARM11 | Cortex-M3 | Cortex-M4 | Cortex-M7/A15 | Cortex-M33/M55 | |
| 对应架构 | ARMv4T/v5 | ARMv6 | ARMv7-M | ARMv7-M/E | ARMv7全系 | ARMv8-M/A/R | |
| DP版本 | 无(直连JTAG) | 无 | DPv0 | DPv0/1 | DPv0/1/2 | DPv3 | |
| AP版本 | 无 | 无 | APv1 | APv1 | APv1 | APv2 | |
| 物理接口 | 仅JTAG(4~5线) | 仅JTAG | JTAG + SWD(2线) | JTAG + SWD | JTAG + SWD | JTAG + SWD | |
| SWD多Drop | ✗ | ✗ | ✗ | ✓(TARGETSEL) | ✓ | ✓ | |
| Dormant状态 | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | |
| DAP两层架构 | ✗ | ✗ | ✓(DP+AP) | ✓ | ✓ | ✓(重构分离) | |
| 地址空间 | 32位 | 32位 | 32位 | 32位 | 32位 | 64位(SELECT+SELECT1) | |
| AP数量上限 | 1 | 1 | 256(8位APSEL) | 256 | 256 | 理论无限(64位地址) | |
| AP发现方式 | 固定 | 固定 | 遍历0~255读IDR | 同v5.0 | 同v5.0 | ROM表树状导航 | |
| 64位数据传输 | ✗ | ✗ | ✗ | ✗ | ✗ | ✓(ADDR64模式) | |
| 芯片内软件访问AP | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | |
| TrustZone安全调试 | ✗ | ✗ | ✗ | ✗ | ✗ | ✓(SPU认证) | |
| 安全/非安全属性 | ✗ | ✗ | ✗ | ✗ | ✗ | ✓(HNONSEC/PROT) | |
| 电源域 | 1(调试) | 1 | 2(DBG+Sys) | 2(DBG+Sys) | 2(DBG+Sys) | 多个(独立控制) | |
| ROM表发现 | ✗ | ✗ | ✓(AP BASE指向) | 同v5.0 | 同v5.0 | ✓(BASEPTR指向分层) | |
| 向后兼容性 | - | - | - | 兼容v5.0 | 兼容v5.0/5.1 | DPv3不兼容v5 | |
| 当前状态 | 已废弃 | 已废弃 | 已替代 | 已替代 | 现行有效(IHI 0031E) | 现行有效(IHI 0074C) | |
1.2、各版本驱动点与变动点
|--------|-------------------------------|-----------------------------------------------------|
| 版本 | 核心驱动 | 变动点 |
| v1~v3 | ARM7/9时代,只有一颗CPU核,JTAG够用 | 无DAP概念,JTAG直连CPU,每款CPU一套调试逻辑,不可复用 |
| v4 | ARM11开始有MPU/Cache,需要统一调试入口 | 首次将调试接口与ARM架构版本关联,但仍绑JTAG |
| v5.0 | Cortex-M3引脚极其紧缺,4~5线JTAG不可接受 | 引入SWD(2线);DP/AP分层,调试接口不再绑死CPU型号 |
| v5.1 | 一根SWD线上挂多颗芯片(如SoC+蓝牙协处理器) | Multi-drop,通过TARGETSEL选择目标;DPIDR增加版本字段 |
| v5.2 | 芯片功耗要求越来越严,调试器需要在线切换协议 | Dormant状态;标准化JTAG<->SWD切换序列;DPv2 |
| v6 | ARMv8引入TrustZone;64位地址空间出现 | 64位寻址(SELECT1/TAR2);APv2扩展寄存器空间;安全调试认证;ROM表发现取代暴力遍历 |
1.3、三次质变总结
1. v4 -> v5:从"绑CPU"到"通用总线"
v4: JTAG -> 特定CPU核(每颗CPU一套调试逻辑)
v5: SWD/JTAG -> DP -> AP -> 系统总线 -> 任何组件
驱动:Cortex-M3引脚少(SWD只要2根线),且SoC上调试组件越来越多,不能每加一个组件就改一版调试协议
2. v5.0 -> v5.2:从"单目标"到"多目标+低功耗"
v5.0: 一根SWD线只能调一个目标
v5.1: 一根SWD线调多个目标(Multi-drop)
v5.2: 协议可在线切换,芯片可进入极低功耗Dormant
驱动:物联网/可穿戴设备要求极低功耗,且SoC上常有多颗核需要调试
3. v5 -> v6:从"开放总线"到"安全可控"
v5: AP空间扁平(0~255),32位地址,无安全概念 -> 任何人连上SWD就能读全片内存
v6: AP通过ROM表分层发现,64位地址,TrustZone认证 -> 安全世界有独立AP,需认证才能调试
驱动:ARMv8-M TrustZone安全/非安全世界隔离;64位地址空间;AP暴增需要高效发现;芯片内软件需访问调试资源
ref:
https://developer.arm.com/documentation/ihi0031/latest/
https://developer.arm.com/documentation/ihi0074/f/?lang=en
二、DAP (Debug Access Port)
2.1、总体架构
DAP 是ARM CoreSight调试架构的核心组件,位于调试器和目标芯片之间,充当协议转换和总线桥接的角色。
DAP = DP (Debug Port) + AP (Access Port),它们各司其职
类比理解:
-
DP = 前台接待:负责和外部客户(调试器)沟通,验证身份,记录需求
-
AP = 业务专员:根据前台转交的需求,去实际访问不同部门(内存、外设、调试组件)
在一个DAP中,只有一个DP,但可以有多个AP连接到单个DP。
2.2、DP
DP负责将用于与调试逻辑通信的物理协议转换为ARM特定的内部调试逻辑。DP有几种类型:
- JTAG-DP:使用JTAG与调试逻辑交换信息。
- SW-DP:使用2线串行线调试(SWD)与调试逻辑交换信息。
- SWJ-DP:可以在运行时使用ARM指定的特定切换序列在JTAG和SWD之间切换协议。
2.3、AP
AP主要是一个内存总线接口,用于访问实际的调试逻辑/资源。与DP执行协议转换不同,AP通常执行实际的内存访问以读写调试寄存器。AP有几种类型:
|--------------------------------|------------|------------------|------------------------------------------------|-------------------------------------------------------------------------------------|
| AP类型 | TYPE字段 | 全称 | 功能 | 典型用途 |
| MEM-AP (AHB) | 0x1 | AHB Access Port | 通过AHB总线访问内存映射地址 | 读写SRAM、外设寄存器、调试组件(最常用) |
| MEM-AP (APB) | 0x1 | APB Access Port | 通过APB总线访问 | 访问APB上的调试组件(如CTI、ROM表) |
| MEM-AP (AXI) | 0x1 | AXI Access Port | 通过AXI总线访问 | Cortex-A/R类高性能总线访问 |
| JTAG-AP | 0x0 | JTAG Access Port | 桥接传统JTAG TAP | 它不通过总线访问内存,而是内部包含一个JTAG TAP控制器,将DAP的AP事务转换为JTAG扫描链操作,用于连接SoC上其他JTAG调试目标(如Cortex-A核) |
| CUSTOM-AP(ADIv6新增) | 自定义 | 厂商自定义 | ADIv6新增了厂商自定义AP的框架,通过DEVTYPE和DEVARCH寄存器识别具体类型。 | 安全调试认证、厂商私有调试通道等 |
**note:**AHB-AP、APB-AP、AXI-AP本质都是MEM-AP(TYPE=0x1),共享相同的寄存器布局(CSW/TAR/DRW/BASE/IDR),只是CSW中某些总线属性字段含义不同。IDR的VARIANT字段区分具体总线类型:
|------------------|-------|----------|
| IDR字段 | 值 | 对应AP |
| [11:8] VARIANT | 0 | AHB-AP |
| [11:8] VARIANT | 1 | APB-AP |
| [11:8] VARIANT | 2 | AXI-AP |
常见芯片的AP配置
|----------------------|-------------|-------------|----------|--------------------------|
| 芯片 | AP#0 | AP#1 | AP#2 | 备注 |
| STM32F103 | AHB-AP | - | - | 只有1个AP |
| STM32F407 | AHB-AP | APB-AP | - | 2个AP |
| STM32H743 | AHB-AP | APB-AP | - | 2个AP,AHB-AP支持多总线域 |
| STM32L5 (Cortex-M33) | MEM-AP | MEM-AP | - | 2个AP,区分Secure/Non-secure |
| i.MX RT1180 | MEM-AP(AHB) | MEM-AP(APB) | JTAG-AP | 3个AP |
| nRF52832 | AHB-AP | - | - | 1个AP |
三、ARM总线初探
3.1、总线类型
|--------|-------------------------------|---------|----------------------|
| 缩写 | 全称 | 中文 | 特点 |
| AHB | Advanced High-performance Bus | 高级高性能总线 | 高速,多主多从,流水线传输 |
| APB | Advanced Peripheral Bus | 高级外设总线 | 低速,简单,单主,用于外设 |
| AXI | Advanced eXtensible Interface | 高级扩展接口 | 最高性能,乱序传输,用于Cortex-A |
Cortex-M的外设挂在AHB上,不是APB上
注意区分两种APB:
|----------|-----------------------------------|-----------------|------------------------------|
| 总线类型 | 上面挂的设备 | 谁来访问 | 地址区域 |
| AHB | SRAM、Flash、所有外设寄存器、大部分CoreSight组件 | CPU、AHB-AP、DMA | 0x00000000~0xE00FFFFF系统地址映射 |
| 系统APB | 少数低速外设(看门狗、RTC) | CPU(通过AHB→APB桥) | 0x40000000区域(CPU看得到) |
| 调试APB | CTI、部分ROM表、某些CoreSight组件 | APB-AP | 独立地址空间(CPU看不到) |
关键理解:
-
"系统APB":CPU通过AHB→APB桥访问的低速外设,地址仍在0x40000000区域。CPU能看到,AHB-AP也能访问(因为走同一个桥)。
-
"调试APB":专门给调试器用的独立总线,只挂CoreSight组件,必须通过APB-AP访问,CPU看不到这条总线。
3.2、实际使用场景对比
|----------------|------------|------------|--------------------------|
| 操作 | AHB-AP | APB-AP | 说明 |
| 读写SRAM变量 | 是 | 否 | SRAM在AHB总线上 |
| 读写GPIO/UART寄存器 | 是 | 否 | 外设挂在AHB总线上 |
| 读写Flash | 是 | 否 | Flash控制器在AHB总线上 |
| 下载代码到芯片 | 是 | 否 | 通过AHB写Flash控制器 |
| 访问DWT/FPB/ITM | 是 | 是 | 大部分芯片这些组件在AHB上,AHB-AP也能到 |
| 访问独立调试APB上的CTI | 否 | 是 | 只有在独立调试APB上的组件才需要APB-AP |
3.3、 为什么大部分芯片只有AHB-AP
大多数Cortex-M芯片(如STM32F1/F4)只暴露了1个AP:
J-Link ──→ DP ──→ AHB-AP ──→ AHB总线 ──→ 所有东西(SRAM+外设+调试组件)
因为ARM把CoreSight组件(DWT、FPB、ITM等)也挂在了AHB总线上(地址在0xE0000000~0xE00FFFFF区域),
AHB-AP一个人就能访问全部,不需要APB-AP。
只有复杂SoC(如Cortex-A+M多核、高端调试场景)才会把部分调试组件放在独立的调试APB上,这时才需要APB-AP。
3.4、 总结对比
|----------------|--------------|-------------|
| | AHB-AP | APB-AP |
| 连接总线 | AHB(系统总线) | APB(调试总线) |
| 能看到什么 | CPU视角的全部地址空间 | 只有调试APB上的组件 |
| 访问SRAM | 是 | 否 |
| 访问外设寄存器 | 是 | 否 |
| 访问DWT/FPB/ITM | 是(在AHB上) | 是(如果也在APB上) |
| 访问独立调试APB上的CTI | 否 | 是 |
| 是否最常用 | 是(90%+场景) | 否(仅特定SoC需要) |
| 大多数芯片 | 唯一的AP | 不存在 |
ref:
https://linmingjie.cn/index.php/archives/390/
https://www.cnsee.net/articles/swd.html
ref: