STM32高级开发(16)-CMSIS DAP调试工程

最近公司的项目在等供应商的设备有点空闲的时间了,就折腾了下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转串口功能电路。
在 Keil 中使用 CMSIS DAP 在我测试的过程中,貌似只有Keil5能够成功识别CMSIS DAP,其设置方法基本和其他调试器使用方法无异,因为CMSIS DAP 是把自身标记为一个 USB HID 和 CDC ACM 设备使用的,前者是调试功能的接口,后者是串口接口,在 Windows 都可以自动识别,不需要安装驱动。不过记得如果没有在硬件调试口上设置硬件复位口的话,要在 Keil 的调试器设置中 Connect & Reset Option 中将Reset设置为系统软中断。
STM32高级开发(16)-CMSIS DAP调试工程
文章图片

STM32高级开发(16)-CMSIS DAP调试工程
文章图片

至于串口的功能,直接使用串口助手打开调试器对应的COM口就可以了。
在Ubuntu中使用OpenOCD + CMSIS DAP 使用过程中的问题 作为这个系列中一篇自然在 Ubuntu 中的内容才是我们要讲述的重点。开始的时候我在接上硬件使用新的 OpenOCD 配置时,我得到的是无法连接 CMSIS DAP 的问题。
openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg

【STM32高级开发(16)-CMSIS DAP调试工程】仔细研究了一晚上,Google了几个问题的关键词,最后还是在抱着尝试的态度安装一个新的 OpenOCD 的过程中我发现了之前的问题。原来在当时安装 OpenOCD 的时候有两个问题:
  1. OpenOCD 编译安装时的参数
    在我们下载下来 OpenOCD 的源代码编译之前会使用 ./configure 的指令配置编译参数,而它默认的编译配置只使能了 stlink jlink 等常见的几个调试器,并没有添加对 CMSIS DAP 的支持。
  2. usb rule.d 的问题
    在 ubuntu 或是 Linux 中我们使用 /etc/udev/rules.d/ 目录下的规则文件来识别USB设备提供其接口给 libusb 使用,然后 libusb 在提供接口给 openocd 连接使用。所以在我们必须在这个文件内添加新的 DAP CMSIS 的库才能正常使用。
重新安装 OpenOCD 说完问题我们接下来就要介绍说解决方法了。
首先显然的我们需要重新配置编译并安装 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 devicesyes (auto) ST-Link JTAG Programmeryes (auto) TI ICDI JTAG Programmeryes (auto) Keil ULINK JTAG Programmeryes (auto) Altera USB-Blaster II Compatibleyes (auto) Versaloon-Link JTAG Programmeryes (auto) OSBDM (JTAG only) Programmeryes (auto) eStick/opendous JTAG Programmeryes (auto) Andes JTAG Programmeryes (auto) USBProg JTAG Programmeryes (auto) Raisonance RLink JTAG Programmeryes (auto) Olimex ARM-JTAG-EW Programmeryes (auto) CMSIS-DAP Compliant Debuggeryes Cypress KitProg Programmeryes (auto) Altera USB-Blaster Compatibleno ASIX Presto Adapterno OpenJTAG Adapterno SEGGER J-Link Programmeryes (auto)

可以看到其中 CMSIS-DAP 已经被启用,之后我们使用指令编译并安装新的 OpenOCD (不需要删除旧版)
$ sudo make $ sudo make install

在安装完成后我们进入 contrib 目录使用指令将 60-openocd.rules 文件复制入 /etc/udev/rules.d/ 目录下
$ sudo cp60-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: SWDSupported 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,就完成串口的设置了。
STM32高级开发(16)-CMSIS DAP调试工程
文章图片

    推荐阅读