GPIO 访问 SWD 接口的心得体会

2019-12-10 18:20发布

本帖最后由 helislayer 于 2016-6-23 22:30 编辑

最近写了些用 GPIO 访问 swd 的程序来玩。记录一下体会:

1)ARM Debug Interface Architecture Specification 这个是 ARM
给的规范,初学不要去读。用这个上手极其困难。这个规范讲了
太多细节,很多常识性的东西没有讲。例如我一直疑惑 turn around
的时候是谁驱动 swclk,应该是 host 但是没有说。这个规范比较
适合已经把底层跑通了,看细节某个寄存器如何用的。适合做 ARM
的厂家不适合作为程序员来写个 swd 访问的程序。

2)上手收建议这个:EFM32: Programming Internal Flash
Over the Serial Wire Debug Interface。
这个手册是从如何写 SWD 接口程序的,虽然不是 STM32 的,
但是比较清楚,例如我前面的疑惑就讲很明白。这个手册也不长。
我上传上来了。

3)那个 SWD 接口其实就是和 SPI 非常像,基本上可以理解为
MOSI 和 MISO 合并成一根线SWD-IO。中间有软件协议上下文来
协商谁来驱动这根线。这个转换需要一个 clock, 就是 turn around。

4) 那个 SWD 的 CLK 就是 SPI CLK, 永远由 host 来驱动。

5)target 永远再上升沿采集和放新的数据。这个意味着 host 从
target 读数的时候是在下降沿读比较方便。

6)思路和攻略大概是这样,要先写个底层的接口可以 reset。
就是发一堆 1 (50 以上) 和 中间发一个 0xE79E 再发 50 多个 1.
0xE79E 就是说老子要用 SWD 而不是 JTAG。

7)接下来就要写 读写 AP 和 DP 的寄存器。每种一共 4 个地址很简单。
这个 DP 就是调试接口的硬件。这个 AP 就是一个访问周边外设和内存
的硬件接口。因为 ARM 的外设都是影射到内存地址的,所以可以访问
任意内存地址就可以刷程序和调试了。

8)访问内存需要通过 AP。就是先写访问内存的地址到一个地址寄存器,
然后通过另外一个数据寄存器读写内存。

大概就是这样,我先在也就只是做到这一步。



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
98条回答
helislayer
1楼-- · 2019-12-15 04:26
helislayer 发表于 2016-6-26 13:26
哦是这样。因为我没有 JLink 所以没有办法帮你。

我觉得我自己写的 swd adapter 马上就可以用了。

是某个IC专用还是所有IC通用?
boboo
2楼-- · 2019-12-15 06:41
boboo 发表于 2016-6-26 13:52
是某个IC专用还是所有IC通用?

加个 IC 改动不大。一般就是某个 flash 地址要改一下这些。
helislayer
3楼-- · 2019-12-15 07:07
 精彩回答 2  元偷偷看……
helislayer
4楼-- · 2019-12-15 09:52
很好的帖子,找了很久了,多谢啊
xhcyfc
5楼-- · 2019-12-15 11:38
终于把外部刷 flash 的策略调通了。还是费了点周折。

外部刷就是没有在 ARM 里面跑程序来刷,跑程序来刷
那个会快一些。

碰到的问题主要有几个方面:
1)错误恢复。当传比较大量的数据的时候,arm swd 会偶尔出现
不能正确 ACK。而且这个不是传输错误引起的,我感觉是似乎 swd
那个 debug core 内部乱了。发一堆零清除以后再重发也频繁出错。
连试图发指令给 debug core reset 都完成不了。
试了不同的恢复方式,最有效的恢复方式就是重新链接 swd,发一堆
1 那个然后选择 swd 那个。我发现在我的 stm32f0 上比较有效的恢复
了到正常状态。观察 stlink-v2 也有同样的 reset 问题, stlink 也会做
reset 动作。

2)16 位的 DRW 读写。这个是比较坑的。我发现我写的 flash 都是头一个
16位正确,后面一个16位全是0。然后又一个正确,非常有规律。
这个问题最后找到就是如果不满 32 位的读写,DRW 是那个部分位被写出去。
我以为是最低的 16 位,但是其实不是。其实 DRW 是跳过了 TAR 不对齐 32
位的部分来写。

例如 CSW = 16 位访问 ,TAR = 0x8000002, 那 DRW 就要写 0xABCD0000,
有效的位数在高16位。
如果是 TAR = 0x8000004, 那 DRW有效的数据就在低 16 位。
也就是说, DRW 内部电路是跳过了不对齐 32 的位数去拿有效的数。

helislayer
6楼-- · 2019-12-15 14:50
恭喜了,我还在分析通用性配置,手里目前没有工具不好动手

一周热门 更多>