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条回答
shangdawei
1楼-- · 2019-12-18 03:56
zhangyh89 发表于 2016-11-3 20:54
请教下,在吧csw.size设置成16bit后,写flash操作有什么需要注意的么,为什么我写一个数据后flash_SR寄存 ...

我遇到的问题有两个。

一个是,那个访问地址的 16 在 32 位内部对齐的问题。
这个问题在前面有提到。表现是写了错误的数据进去,
往往是每隔一个 16 bit 的word 有一个word 是 0.

还有一个是写那个 flash 保护位会奇妙的出错,
完全没有错误信息,看上去是写上去了,但是再读
回来那个 flash PG bit 没有写上去,后面真的写 flash
就一踏糊涂了。解决是多写很多次后面就有成功的了了。
不知道是什么原因,还没有找到。这个是写那个 PG 的
位。

多写些验证代码,例如读当前 flash programming 那
几个寄存器看看是不是希望的状态。

helislayer
2楼-- · 2019-12-18 04:02
helislayer 发表于 2016-11-5 13:54
我遇到的问题有两个。

一个是,那个访问地址的 16 在 32 位内部对齐的问题。

找到原因了,其实就是我擦除flash后上锁了,结果写的flash的时候没开锁。

不过现在在尝试使用spi通讯,发现读写DP的寄存器写AP寄存器都正常,但是只要是读AP寄存器的话,读第一次能读出来,读第二次就移植返回0xFFFFFFFF,之后读任何DP AP寄存器都是返回0xFFFFFFFF,这个时候只能给目标板重新上电
zhangyh89
3楼-- · 2019-12-18 04:57
 精彩回答 2  元偷偷看……
helislayer
4楼-- · 2019-12-18 09:08
helislayer 发表于 2016-11-5 23:06
上锁这个通过打印 flash 寄存器是可以看出问题的。

你访问的是 DRW 还是 RDBUFF?

又试了下,读DRW RDBUFF都会这样,读AP-IDR也只能都成功一次,但是如果只是读IDCODE  CTRLSTAT的话一直斗士正常的
zhangyh89
5楼-- · 2019-12-18 13:49
helislayer 发表于 2016-11-5 23:06
上锁这个通过打印 flash 寄存器是可以看出问题的。

你访问的是 DRW 还是 RDBUFF?

用IO口直接模拟的写flash都正常了,不过每次都是半个字的写而且写前写后都要重新设置CSW.SIZE读FLASH_CR判断忙标志,巨费时间
zhangyh89
6楼-- · 2019-12-18 17:48
zhangyh89 发表于 2016-11-5 23:32
用IO口直接模拟的写flash都正常了,不过每次都是半个字的写而且写前写后都要重新设置CSW.SIZE读FLASH_CR ...

哦,对,因为访问其他寄存器CSW.SIZE 要设置回来。恭喜。
我对比过,用程序从内部写快一倍左右,也不是特别多。
关键是那个 flash 的 wait 时间挺多的。这个没办法。

那个 多次读异常的,你的寄存器访问序列是怎么样的?
你需要有个调试打印出所有的底层访问数据,地址和内容。

一周热门 更多>