如需源码,请移步SWD协议 源码 入门示例_smartpower的博客-CSDN博客_swd tar
1. SWD协议文档
Cortex M0芯片的SWD协议白皮书请参考如下文档:
这个文档的目录如下所示。
2. 通过SWD连接到目标芯片的流程
发起LineReset -> 读写DP区域寄存器->写DP寄存器以使能AP区域寄存器->读写AP区域寄存器。
通过对AP区域寄存器作为桥即可读写目标芯片的寄存器。
3. 底层波形
3.1 LIneReset
3.2 写DP/AP寄存器
其中Trn周期,Host和Slave均不驱动SWDIO,用于总线转换方向。
3.3 读DP/AP寄存器
其中Trn周期,Host和Slave均不驱动SWDIO,用于总线转换方向。
4.读写DP/AP区寄存器示例
4.1DP区寄存器列表
4.2AP区寄存器列表
4.3 读取IDCODE(DP区寄存器DPIDR),其地址为0x00。
STAT固定为1;
读DP故APnDP为0;
本次为读操作故RnW为1;
寄存器地址为0x00故A2,A3均为0;
Parity为由前面几位计算出为奇校验值;
Stop及Park分别为固定值0和1。
ACK后,返回的IDCODE为0x0BC11477。这就是我们在Keil里看到的芯片的序号。
4.4 写DP区寄存器以开启AP区寄存器使能
向CTRL/STAT寄存器写入0x50000000
4.5 写DP区寄存器SELECT以选中BANKF
向SELECT寄存器写入0x000000F0,AP区的BankF中具有4个寄存器。为下一步读取AP区的ID寄存器做准备。
4.6 读取AP区寄存器IDR
读取AP区寄存器,不能直接读出。需要首先对AP区目标寄存器发起一次读操作;再读取DP区寄存器RDBUFF才能真的读到AP区目标寄存器的值。
下图中对AP区的IDR读出的实际值为0x04770031。
4.7 设置CPU地址的读写位宽
需要对AP区CSW寄存器进行行配置,以确写读写的位宽。CSW寄存器位于Bank0,需要配置SELECT寄存器内的BANK寄存器。
4.8 读取CPU可访问的地址
操作分成三步完成:将待读取的地址写入AP区的TAR寄存器;对AP区DRW寄存器发起读操作;对DP区的RDBUFF发起读操作即可读出目标地址的值。
下方示例为读取0xE000ED00寄存器的值。
4.8 向CPU可访问的地址写入数据
操作分成两步完成:将待写入的地址写入AP区的TAR寄存器;对AP区DRW寄存器发起写操作。
下方示例为向0xE000EDF0写入0xA05F0001