本帖最后由 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。就是先写访问内存的地址到一个地址寄存器,
然后通过另外一个数据寄存器读写内存。
大概就是这样,我先在也就只是做到这一步。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
stlink 也是,我看到的所有的商业应用的都是。
stlink 连 erase 都是用下载程序的方式做的。
这个下固件的速度最多也就 几十K 的样子,
因为 stm32 flash 写一次要几十个 us 的等待。
这个最快也快不到那里去。
那个真的没有很多意思,你会看到一大堆往内存写数字,
然后就是 unhalt 运行一下程序就搞定了。
变成你要反汇编内存那个 flashloader 才明白人家是如何
玩的。
哦是这样。因为我没有 JLink 所以没有办法帮你。
我觉得我自己写的 swd adapter 马上就可以用了。
应该也不太需要 JLink 了。linux 里面就是用 gdb,
我大不了自己搞个 gdb remote server 就大功告成
了。
一周热门 更多>