年初我买了一片Atmel的ATSAMD21,研究datasheet发现此MCU不带bootloader,不能用串口等方式进行ISP下载。Atmel官方的调试器和带调试器的开发板又太贵了,这方面远不如ST亲民。同属于Cortex-m0系列,都有SWD调试接口,那么能否用ST开发板上的ST-link来为Atmel ATSAMD21调试和下载程序呢?那会儿我发了一个帖子在论坛询问,大伙回答认为是不行的。
后来又听说出了把ST-link刷成J-link的固件,但是这样的J-link也只能调试ST的MCU。那仿制做一个盗版的J-Link来用总该是可以的,然而我对盗版、破解软件的已经兴趣不大,能用不破解受限制的免费版我就有用免费版;再说玩玩这个MCU又不是紧急的事情,就先搁一边了。
再后来,我注意到OpenOCD这个开源的调试器,它支持ST-Link,也支持Atmel D21系列,那么可否实现我的目标呢?
下载了一份OpenOCD 0.9.0 (编译好的版本, win32平台), 按照简单提示用法,用 -f 参数指定配置文件,一个是调试器硬件的,一个是MCU的。我先用 Nucleo-F091RC 测试一下ST MCU能否连上,命令是 openocd -f interfacestlink-v2-1.cfg -f targetstm32f0x.cfg
OK, 看来OpenOCD能够找到STM32F091,下面就把SWD的线连到我DIY的ATSAMD21精简板上,
给OpenOCD的参数改 -f targetstm32f0x.cfg 为 -f targetat91samdxx.cfg 应该就是对应Atmel SAMD21的配置了
竟然出错了,哪里的问题呢?
分析这个提示 “UNEXPETED idcode: 0x0bc11477” 也就是 ID code 不对。打开 at91samdxx.cfg 这个文件,
其中设置了一个 _CPUTAPID 为 0x4ba00477,但是没有读到这个ID:和调试的目标不匹配了。我猜想是这样的原因,那就把此处改一下,改成 0x0bc11477 试咯。果然,改了这个文件就连上了。
OK, 说明 ST-link 和 ATSAMD21 可以通信,这是个好的开始。现在OpenOCD程序就停在那里了,接下来该怎么玩?查资料,原来这货是通过TCP端口进行交互的,于是telnet localhost 4444就可以连上它的terminal,输入help回车可以列出很多命令. 至于端口 为什么是 4444…
我需要的是 flash write_image 这个命令,无奈的是,它不能成功。而对于STM32F091,用同样的办法是可以成功烧写程序的。换其它招吧,load_image 命令可以把数据装入MCU的RAM,这样好歹能把程序装进来运行呀。
写一个测试程序,点LED
由于要装到RAM运行,linker的脚本需要改动,把全部的段都定位到RAM的地址(0x20000000开始),像这样
在OpenOCD交互终端里面可以载入这样编译的RAM中运行的程序
halt 是停掉当前的程序执行;mdw 用来查看内存,这里是看一下程序入口地址(PC的初值);然后用reg 命令修改PC (SP也应该改一下);最后resume恢复执行,就执行内存中的程序了.
若要调试,还是用GDB来得方便。在gdb里面执行 target remote localhost:3333 连接到OpenOCD. 起初我用4444端口,GDB就 错,我想不明白,后来知道用的是另外的端口啊
最后,我读了ATSAMD21手册关于Flash写入的部分,通过编程实现了Flash ROM的写入,还好,操作不算复杂。也就是把要写到Flash的程序作为数据,用一段内存中执行的程序来负责烧写。虽然这样麻烦了一点,但对于我总算是一个办法。谁叫我用ST-link呢,ST是不管ATmel的MCU怎么写flash的。至于OpenOCD的flash烧写功能不成功,我估计是它带的程序对这个器件支持有问题,不得而知了。
欢迎微博@EEWORLD
与更多行业内 友进行交流请登陆EEWORLD论坛。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!