如有侵权,请联系博主删帖
1.使用注意事项
2 收集的资料
- SWD烧录协议翻译参考:SWD协议研究_guoliuly的博客-CSDN博客_swd协议
- SWD读写数据有一个协议,擦除flash有相应的操作寄存器SWD命令,烧录(写flash)也有相应的操作寄存器SWD命令;
- 方案参考开贴记录SWD 脱机烧录器开发过程,请各路大神指教 (amobbs.com 阿莫电子论坛),吧主做成了烧录器,但细节没有详细说明,源码也没有开源。
- SWD读写单片机flash参考文档中的MEM-AP
- 详细方案,源码开源:分享离线SWD编程器代码 (amobbs.com 阿莫电子论坛)
- 根据上面方案更改,在家里开发板验证,可以烧写成功:GitHub - jiaosanjue/swd_offlie_downloader: STM32-based SWD protocol offline downloader
3 SWD协议主要有7大点:
参考官方文档:ARM®Debug Interface Architecture Specification ADIv5.0 to ADIv5.2
- Basic operation 通信总流程简介:通信通常分2阶段或3阶段;分别是: 一、Packet request: 外部主机向DP发送一个请求;外部主机通常是电脑,DP是jlink烧录器; 二、Ack:目标DP返回一个响应给主机; 三、Data transfer phase 数据传输过程,这个阶段只有两种情况会产生:a.读写数据的时候,b.寄存器CTRL/STAT.ORUNDETECT 位被置1的时候;
- SWD protocol versions swd协议的简介:有两个版本,version1只是点对点的通信,version2可以1对多通信;
- Line turnaround 即Trn信号 对应B4.1.3 line turnaround; 当数据线的数据要改变方向时的信号; 这个信号的电平是没有定义的(高低都行); 这个信号的周期由DLCR.TURAROUND决定,默认1个时钟周期
总结:所以要产生数据线方向反转时(读写反转),要根据DLCR.TURROUND(2位)的数值,空几个周期不写或不读数据。 - Idle cycles 空闲状态
在完成一个传输后,主机需要插入一个空闲状态以令总线进入空闲状态;或继续发送一个开始信号,开始一个新的传输时序; - Bit order 所有数据通过SWD都是LSB first,即低位先传送;
- parity 校验位,只是对传送的32位数据校验,当32位数据的位置1数量是偶数时,校验位就是1;否则是0;
- limitations of multi-drop 介绍多点SWD系统配置和自动检测限制;
4.CMSIS_DAP版本说明
5.线序简介
- - SWDIO 双向DATA口,主机到目标的数据传送
- - SWDCLK 时钟口,主机控制
- - GND
- - RESET 非必需,通常该引脚用来复位启动单片机;但SWO协议中也有复位单片机命令,所以该引脚不用也可以。 两种复位效果暂时不清楚,但根据目前的经验SWO协议的复位较好用。
6. SWD协议流程
- 读命令为数据头+Trn+ACK+RDATA+Parity构成,但实际操作发现Trn这位是忽略掉的(所以不知道对此Trn的理解是否有误),及发送完数据头后立即读入ACK,判断Target是否正确响应。
- 写命令为数据头+Trn+ACK+Trn+WDATA+Parity,在这不同的是,在写命令时必须要考虑2个Trn的位置。
- 根据协议,在连接Target时先要进行LineReset。即主机连续送出至少50个“1”,使得Target进行Line Reset,至少插入2个Idle,然后可以读取目标板的IDR,判断Target的类型。
- 以上内容参考:ARM调试原理【调试接口框图】【SWD时序】【SWD主机】_城东的博客-CSDN博客_arm debug interface