最近公司的项目在等供应商的设备有点空闲的时间了,就折腾了下ARM官方开源的CMSIS DAP调试器的方案,用的是X893大神的方案,下面附上他的个人主页和在GitHub上的项目链接(我是用的是其中stlinkv2.1的软硬件方案):
[http://akb77.com/g/stm32/cmsis-dap-adapter/](http://akb77.com/g/stm32/cmsis-dap-adapter/)
[https://github.com/x893/CMSIS-DAP](https://github.com/x893/CMSIS-DAP)
这个调试器方案可以说极具性价比,SWD接口速度可以达到10M的全速,还附带一个最高支持到115200bps的串口,而且连接一根线就可以识别为两个设备,既可以单独的作为一个调试器使用,也可以集成到其他项目的PCB板上作为板载调试器和USART转串口功能电路。
在我测试的过程中,貌似只有Keil5能够成功识别CMSIS DAP,其设置方法基本和其他调试器使用方法无异,因为CMSIS DAP 是把自身标记为一个 USB HID 和 CDC ACM 设备使用的,前者是调试功能的接口,后者是串口接口,在 Windows 都可以自动识别,不需要安装驱动。不过记得如果没有在硬件调试口上设置硬件复位口的话,要在 Keil 的调试器设置中 Connect & Reset Option 中将Reset设置为系统软中断。
至于串口的功能,直接使用串口助手打开调试器对应的COM口就可以了。
作为这个系列中一篇自然在 Ubuntu 中的内容才是我们要讲述的重点。开始的时候我在接上硬件使用新的 OpenOCD 配置时,我得到的是无法连接 CMSIS DAP 的问题。
openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg
仔细研究了一晚上,Google了几个问题的关键词,最后还是在抱着尝试的态度安装一个新的 OpenOCD 的过程中我发现了之前的问题。原来在当时安装 OpenOCD 的时候有两个问题:
OpenOCD 编译安装时的参数
在我们下载下来 OpenOCD 的源代码编译之前会使用 ./configure 的指令配置编译参数,而它默认的编译配置只使能了 stlink jlink 等常见的几个调试器,并没有添加对 CMSIS DAP 的支持。
usb rule.d 的问题
在 ubuntu 或是 Linux 中我们使用 /etc/udev/rules.d/ 目录下的规则文件来识别USB设备提供其接口给 libusb 使用,然后 libusb 在提供接口给 openocd 连接使用。所以在我们必须在这个文件内添加新的 DAP CMSIS 的库才能正常使用。
说完问题我们接下来就要介绍说解决方法了。
首先显然的我们需要重新配置编译并安装 OpenOCD 启动其中对 CMSIS DAP 的支持代码,但在此之前我们先需要安装一个的 hid 库,因为Linux上默认是没有HID设备驱动的。
$ sudo apt-get install libhidapi-dev
在安装完成后,进入OpenOCD 的源代码路径,使用指令配置其编译参数
$ ./configure --enable-cmsis-dap
在等待配置脚本完成后会显示如下内容:
OpenOCD configuration summary
--------------------------------------------------
MPSSE mode of FTDI based devices yes (auto)
ST-Link JTAG Programmer yes (auto)
TI ICDI JTAG Programmer yes (auto)
Keil ULINK JTAG Programmer yes (auto)
Altera USB-Blaster II Compatible yes (auto)
Versaloon-Link JTAG Programmer yes (auto)
OSBDM (JTAG only) Programmer yes (auto)
eStick/opendous JTAG Programmer yes (auto)
Andes JTAG Programmer yes (auto)
USBProg JTAG Programmer yes (auto)
Raisonance RLink JTAG Programmer yes (auto)
Olimex ARM-JTAG-EW Programmer yes (auto)
CMSIS-DAP Compliant Debugger yes
Cypress KitProg Programmer yes (auto)
Altera USB-Blaster Compatible no
ASIX Presto Adapter no
OpenJTAG Adapter no
SEGGER J-Link Programmer yes (auto)
可以看到其中 CMSIS-DAP 已经被启用,之后我们使用指令编译并安装新的 OpenOCD (不需要删除旧版)
$ sudo make
$ sudo make install
在安装完成后我们进入 contrib 目录使用指令将 60-openocd.rules 文件复制入 /etc/udev/rules.d/ 目录下
$ sudo cp 60-openocd.rules /etc/udev/rules.d/
因为这个文件中包含了所有支持调试器的 USB 接口描述,所以我们还需要删除以前复制进入这个文件内的规则文件,比如 49-stlinkv1.rules 49-stlinkv2.rules 49-stlinkv2-1.rules 99-jlink.rules 等
$ rm 49-stlinkv1.rules 49-stlinkv2.rules 49-stlinkv2-1.rules 99-jlink.rules
重启系统来重新加载规则。再使用 OpenOCD 指令连接,大功告成~。
重启系统后我们再次使用指令连接目标板
$ openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg
Open On-Chip Debugger 0.10.0+dev-00197-g2168c47 (2017-10-14-08:41)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "swd". To override use 'transport select ' .
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
none separate
cortex_m reset_config sysresetreq
Info : CMSIS-DAP: SWD Supported
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : CMSIS-DAP: FW Version = 1.0
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 1000 kHz
Info : SWD DPIDR 0x1ba01477
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
连接成功~
PS:如果显示连接失败的话试试重新插拔下 CMSIS DAP 的USB接口,我之前就遇到这样的问题了。
由于使用的是 CDC ACM 的驱动,所以我们的串口名称不是 ttyUSB0 而是 ttyACM0 ,使用指令来更改 Minicom 的配置
$ sudo minicom -s
Ctrl+a,o。设置串口参数。在serial port setup中我们设置,串口设备号和波特率及奇欧校验位等参数,然后选中save setup as dfl后重启minicom,就完成串口的设置了。