1. 程式人生 > >STM32高階開發(16)-CMSIS DAP除錯工程

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設定為系統軟中斷。

這裡寫圖片描述

這裡寫圖片描述

至於串列埠的功能,直接使用串列埠助手開啟偵錯程式對應的COM口就可以了。

在Ubuntu中使用OpenOCD + CMSIS DAP

使用過程中的問題

作為這個系列中一篇自然在 Ubuntu 中的內容才是我們要講述的重點。開始的時候我在接上硬體使用新的 OpenOCD 配置時,我得到的是無法連線 CMSIS DAP 的問題。

openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg

仔細研究了一晚上,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 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 <transport>'.
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,就完成串列埠的設定了。

這裡寫圖片描述