本帖最后由 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。就是先写访问内存的地址到一个地址寄存器,
然后通过另外一个数据寄存器读写内存。
大概就是这样,我先在也就只是做到这一步。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
看了下Cortex-M3权威指南解决了,异常原因是操作两个寄存器的顺序有问题
1. 确定处理器已停机
2. 往DCRSR写数据,其中位16要为0,表示这是要读数据
3. 查询,直到DHCSR.S_REGRDY=1
4. 读取DCRDR以获取寄存器的内容
寄存器写操作的顺序与上面的类似:
1. 确定处理器已停机
2. 往DCRDR中写数据
3. 往DCRSR写数据,其中位16要为1,表示这是要写数据
4. 查询,直到DHCSR.S_REGRDY=1
现在又出现个异常,我把写的一个在RAM中运行的小程序复制到了RAM中0x20000000起始处(小程序在工程设置里也设置好了起始地址,看了下反汇编,地址也都没问题),
但我设置MSP=0x20000000 PC=0x20000004后启动运行,这时候貌似是跳过startup启动文件里的SystemInit函数,直接进入main函数了,我写的延时100ms的
闪灯程序,发现实际延时有差不多1S,如果我把SystemInit放在main函数开头再执行一次的话,延时就会正常。
跳转的时候我的MSP PC设置应该是没问题的吧
恭喜你都跑起来了。
你跳过了初始化的代码,那个代码有设置时钟到比较高的主频。
如果你没有初始化就是停留在 8M 的系统时钟。我猜那个是你的
问题。
程序注入能跑起来的话就很爽了。
就是不明白为什么会跳过那段代码,又试了下把那个小程序改到正常的ROM段编译,然后直接把代码刷到flash运行,结果更改MSP PC启动后,还是这种现象,这时候我把目标重新上电,单片机就正常运行了。
难道改完MSP PC后还需要设置什么东西么
这几天看你这帖子受到不少启发,感谢感谢
一周热门 更多>