SWD读取AP寄存器完整流程

1. 协议层架构

SWD协议通过两层结构访问目标系统:

  • DP (Debug Port): 调试端口,管理调试接口

  • AP (Access Port): 访问端口,执行实际的内存/寄存器访问

每次内存访问流程:DP SELECT选择AP → AP CSW配置 → AP TAR地址 → AP DRW数据

2. AP数量和地址

2.1 AP数量

  • 一个CoreSight系统通常有多个AP

  • 常见的AP类型:

    • MEM-AP​ (Memory Access Port): 内存访问端口 (最常用)

    • JTAG-AP​ (JTAG Access Port): JTAG调试端口

    • AHB-AP​ (AHB Access Port): AHB总线访问

    • APB-AP​ (APB Access Port): APB总线访问

  • 典型ARM Cortex-M芯片有1-4个AP

  • 每个AP有唯一的AP编号​ (0-255)

2.2 AP地址空间

每个AP有256字节的寄存器空间,包含:

地址偏移 寄存器 功能 访问
0x00 CSW 控制/状态字 读写
0x04 TAR 传输地址寄存器 读写
0x08 DRW/BD0 数据寄存器0 读写
0x0C DRW/BD1 数据寄存器1 读写
0x10 BD2 Banked Data 2 读写
0x14 BD3 Banked Data 3 读写
... ... ... ...
0xF4 CFG 配置寄存器 只读
0xF8 BASE ROM表基地址 只读
0xFC IDR ID寄存器 只读

3. 读取流程详述

3.1 阶段1: DP初始化

复制代码
操作: 读取DP IDCODE确认连接
SWD请求包: 0x81 (二进制: 1000 0001)
响应: ACK=0x01 (OKAY)
数据: 0x0BA01477 (Cortex-M3/M4 IDCODE)

3.2 阶段2: 选择AP

复制代码
操作: 写DP SELECT寄存器选择AP编号
SWD请求包: 0xA1 (1010 0001)
响应: ACK=0x01
数据: 0x000000F0
  - APSEL[7:0] = 0x0 (选择AP#0)
  - APBANKSEL[3:0] = 0x0 (选择bank 0)

3.3 阶段3: 配置AP CSW

复制代码
操作: 写AP CSW寄存器配置访问模式
SWD请求包: 0x83 (1000 0011)
响应: ACK=0x01
数据: 0x23000052
配置含义:
  - 0x23: 协议控制 (自动递增打包+单次)
  - 0x5: 数据大小=32位
  - 0x2: 地址增量=自动递增

3.4 阶段4: 设置目标地址

复制代码
操作: 写AP TAR寄存器设置内存地址
SWD请求包: 0x8B (1000 1011)
响应: ACK=0x01
数据: 0x20001000 (目标地址)

3.5 阶段5: 读取数据

复制代码
操作: 读AP DRW寄存器获取数据
SWD请求包: 0x8F (1000 1111)
响应: ACK=0x01
数据: 0x12345678 (读取值)

4. AP选择机制

4.1 DP SELECT寄存器

复制代码
位31-24: APSEL[7:0] - 选择AP编号 (0-255)
位23-8: 保留
位7-4: APBANKSEL[3:0] - 选择AP内的bank
位3-0: 保留

4.2 AP编号示例

  • AP#0: 通常为MEM-AP (内存访问)

  • AP#1: JTAG-AP或其他外设AP

  • AP#2: 系统控制AP

  • AP#3: 跟踪AP (ETM/ITM)

4.3 多AP切换示例

复制代码
// 切换到AP#0 (内存访问)
SELECT = 0x000000F0  // APSEL=0, APBANKSEL=0

// 切换到AP#1 (JTAG访问)
SELECT = 0x000001F0  // APSEL=1, APBANKSEL=0

// 切换到AP#2 (系统控制)
SELECT = 0x000002F0  // APSEL=2, APBANKSEL=0

5. AP寄存器详解

5.1 CSW寄存器 (偏移0x00)

复制代码
位31-24: 协议控制
  bit31: 保留
  bit30: 自动递增打包
  bit29: 自动递增单次
  bit28-24: 模式控制

位23-8: 保留

位7-4: 数据大小
  bit7: 保留
  bit6-4: Size[2:0]
    000: 8位
    010: 16位
    100: 32位
    110: 64位
    111: 256位

位3-0: 地址增量
  bit3: 保留
  bit2-0: AddrInc[2:0]
    000: 无递增
    001: 自增1
    010: 自增2
    100: 自增4
    110: 自增8
    111: 自增16

5.2 TAR寄存器 (偏移0x04)

  • 存储下一次内存访问的地址

  • 必须与数据大小对齐

  • 启用自动递增时,每次DRW访问后自动增加

5.3 DRW寄存器 (偏移0x08/0x0C)

  • 实际的数据读写寄存器

  • BD0(0x08)和BD1(0x0C)功能相同

  • 通常使用BD1(0x0C)

6. 批量读取优化

复制代码
1. 写CSW: 启用自动递增 (0x23000052)
2. 写TAR: 设置起始地址0x20001000
3. 读DRW#1: 获取0x20001000数据
4. 读DRW#2: 自动递增到0x20001004
5. 读DRW#3: 自动递增到0x20001008
6. 读DRW#4: 自动递增到0x2000100C

7. 错误处理

ACK响应 含义 处理
0x01 (OKAY) 成功 继续
0x02 (WAIT) 目标忙 重试操作
0x04 (FAULT) 访问错误 清除ABORT寄存器
无响应 连接问题 检查物理连接

8. 性能参数

复制代码
单次32位读取: 44位传输
理论时间: 11μs @4MHz
实际时间: ~33μs (含空闲周期)
带宽: 121KB/s @4MHz

9. 完整序列示例

复制代码
1. 0x81 → 0x01 0x0BA01477     (读DP IDCODE)
2. 0xA1 → 0x01 0x000000F0     (写DP SELECT, 选择AP#0)
3. 0x83 → 0x01 0x23000052     (写AP CSW)
4. 0x8B → 0x01 0x20001000     (写AP TAR)
5. 0x8F → 0x01 0x12345678     (读AP DRW)

10. 关键点

  1. AP通过DP SELECT寄存器选择,每个AP有唯一编号

  2. 每个AP有独立的256字节寄存器空间

  3. CSW控制访问模式(数据大小、地址递增)

  4. TAR存储目标地址,支持自动递增

  5. DRW进行实际数据读写

  6. 批量访问可利用自动递增优化性能

  7. 奇偶校验确保数据传输正确性

相关推荐
youshi666828 分钟前
平衡车——PID算法优化
stm32·单片机·嵌入式硬件·算法·pid·平衡车
comyccccc1 小时前
高效降压电路布局与铺铜优化技巧学习笔记
单片机·嵌入式硬件
白搞电子1 小时前
ESP32-S31 WASM 应用开发实录:重力弹球从电脑预览到 ESP-Mosaico 实机测试
单片机·嵌入式硬件·物联网·电脑·wasm
ye150127774551 小时前
220V降压24V700mA交转直芯片WT5110
stm32·单片机·嵌入式硬件·其他·硬件工程
BSD_HY2 小时前
薄膜开关矩阵扫描在低功耗 MCU 上的 GPIO 扩展
单片机·嵌入式硬件·矩阵
沐欣工作室_lvyiyi4 小时前
基于物联网的汽车智能座舱控制系统的设计和实现(论文+源码)
单片机·物联网·汽车·智能座舱·哈尔滨信息工程学院·黄河科技学院
创界工坊工作室4 小时前
21-基于单片机的智能窗帘与光照联动控制系统设计
stm32·单片机·嵌入式硬件·proteus
石马马户5 小时前
传感器的中断 Latch、中断状态寄存器、中断读取与保持时间
stm32·单片机·嵌入式硬件
fly_sunnn15 小时前
STM32-GPIO
stm32·单片机·嵌入式硬件
宵时待雨19 小时前
STM32基础1:嵌入式历史与生态
stm32·单片机·嵌入式硬件