用STM32單片機替換J-LINK
一、 DAP-LINK簡介
Arm Mbed DAPLink 是一個開源軟件項目。把代碼編譯以后,會生成一個固件(和單片機開發是相同的),把固件寫到單片機里面,單片機就具備了J-LINK的功能。其成本很低,在淘寶上也有現成的產品。本文記錄的是使用一個STM32開發板制作DAP-LINK的過程。

圖 1 淘寶上的DAP-LINK
本次實驗的基本流程如下:
1.使用開源的代碼編譯生成DAP-LINK固件。
2.使用J-LINK燒寫DAP-LINK的固件到開發板中。
3.驗證DAP-LINK固件在開發板中的可用性。
下面先介紹基本的硬件、軟件環境,再介紹實驗步驟。
二、硬件信息
實驗主機:筆記本電腦
開發板:STM32F103C8T6開發板[1](用來承載DAP-LINK)
開發板:STM32F103VET6開發板[2](用來驗證DAP-LINK可用)
輔助調試器:J-LINK調試器[3]
開發板和輔助調試器依次如下圖所示:

圖 2 J-LINK調試器示意圖

圖 3 STM32F103C8T6開發板
三、軟件信息
源碼:x893 DAP-LINK源碼[4]
實驗主機:Win10
編譯環境:ARM MDK 5.14[5]
四、制作過程
制作過程部分主要描述編譯環境構建、編譯DAP-LINK源碼、燒寫DAP-LINK程序到小開發板、驗證DAP-LINK的可用性。其中,在驗證可用性的環節,DAP-LINK指示燈和SWD調試連接需要進行原理圖分析后,才能確定芯片的連接關系,進而使用杜邦線建立DAP-LINK和開發板的連接。USB接口的連接,x893和我們的小開發板的連接是一致的,所以這部分不用擔心燒寫DAP-LINK程序后會不兼容。
4.1 編譯環境構建
經多次測試,x893 的DAP-LINK源碼適用于本開發板。其代碼在github中開源,事實上,該代碼衍生自官方的github。

圖 4 x893 DAP-LINK源碼
該代碼使用ARM MDK[6]編譯,所以需要在筆記本上構建編譯環境,才能完成代碼編譯。
下載MDK。使用腳注提供的百度云連接安裝即可。安裝和破解過程參考網絡已有教程資源[7]。安裝完成后,需要下載最新的CMSIS包[8],選擇Legacy support for Arm Cortex-M devices下載,下載完成后默認安裝即可。
4.2 編譯DAP-LINK源碼
打開\Firmware\STM32目錄下的CMSIS_DAP.uvproj工程文件,即可打開MDK的工程。打開后如下圖所示。選擇CMSIS-DAP-V2-F103。點擊左側箭頭即可進行編譯。

圖 5 MDK打開工程項目后的界面
編譯完成后,build output窗口有以下輸出:

圖 6 編譯完成的日志
4.3 燒寫DAP-LINK固件到開發板
將開發板與J-LINK建立連接,并將J-LINK插入到筆記本中,點擊圖5所示的藍色深色箭頭,完成燒寫。期間,需要確保J-LINK連接到開發板后,MDK可以識別到J-LINK插入到開發板,而且在debug->settings中可見J-LINK已經識別到與J-LINK連接的MCU了。

圖 7 確保J-LINK與開發板連接后識別到開發板的MCU

圖 8 J-LINK下載固件到開發板中
4.4 驗證DAP-LINK固件在開發板中的可用性
重新將C8T6開發板(燒寫DAP-LINK固件的開發板)的USB插入到筆記本中,筆記本中識別了兩個設備,分別是串口設備和USB設備。這樣,我們的C8T6就變成了一個CMSIS DAP調試器,其功能類似J-LINK。

圖 9 將DAP-LINK重新插入電腦后出現兩個設備
將C8T6開發板與被測試的VET6開發板相連接。連接關系如下圖所示。需要注意的地方有兩個:SWD連接和DAP-LINK的指示燈。

圖 10 DAP-LINK和開發板的連接方式
打開被測試開發板資料中的例程,設置開發板燒寫方式為DAP-LINK。然后以燒寫DAP-LINK的方式進行編譯、燒寫。

圖 11 設置工程源碼燒寫選項為DAP-LINK

圖 12燒寫完成后的日志
4.4.1 恢復指示燈
指示燈可恢復可不恢復。x893的主板上存在兩個自定義的LED,而我們的C8T6開發板上只有一個,所以只恢復了一個LED,另一個不恢復也不影響整體功能。兩份開發板原理圖位置如下:
l x893的電路原理圖:HW_STM32/CMSIS-DAP-X893/CMSIS-DAP.V2.pdf。
l C8T6開發板的原理圖:STM32F103C8T6-48腳-最小系統資料/STM32F103C8T6-48腳-最小系統資料/STM32F103C8T6--原理圖.pdf。
在C8T6開發板中,PC13與自定義LED相連接,默認不發光。而在x893中,存在兩個LED,分別與PB12和PB13相連。本次實驗恢復了PB13的LED連接,即把C8T6開發板的PB13連接到PC13上,使用杜邦線進行短接即可。

圖 13 C8T6開發板的自定義LED

圖 14 x893開發板的自定義LED

圖 15 C8T6開發板的PB13位置在TFT屏幕接口上
4.4.2 SWD調試連接
如果想建立SWD調試連接,需要我們在C8T6開發板和VET6開發板之間連接4根杜邦線。根據SWD接口的規范[9],可以了解到只需要連接VCC、GND、SWDIO、SWCLK這四條杜邦線即可。
從X893的電路圖中可知,SWDIO和SWCLK由PA13、PA14這兩個IO口模擬產生,所以將這兩個IO口用杜邦線和VET6開發板的SWD接口的SWDIO和SWCLK進行連接即可。使用兩根杜邦線將兩個開發板的VCC和GND對應連接起來,這樣,就實現了SWD接口的連接。

圖 16 x893開發板上調試目標開發板的SWD接口
五、DAP-LINK調試方法
5.1 Linux下調試方法
pyOCD[10]和J-LINK驅動自帶的工具有些類似。使用pip也可以直接安裝成功。安裝命令如下:
python3 -m pip install -U pyocd
使udev下的CMSIS-DAP設備可用:sudo cp udev/50-cmsis-dap.rules /etc/udev/rules.d/
運行以下命令,即可識別到CMSIS DAP。一般情況下,需要運行sudo才能使用USB設備,具體需要根據自己的Linux環境而定,有的應該不需要,跟系統配置相關,這里不再贅述。Linux下調試STM32,如果需要自動化的測試程序,則需要自己完成腳本編寫。

圖 17 Linux下識別到CMSIS-DAP設備
5.2 Windows下調試方法
Windows下同樣支持pyocd,如果不需要自動化測試,使用J-link驅動來完成gdbserver端口映射是最方便的。

圖 18 Window下使用J-LINK+DAPLINK調試單片機
六、總結
DAP-LINK的開源代碼在STM32F103C8T6的實現比較簡單,需要注意的是,在使用自己的開發板加載適合其他開發板程序的時候,需要自己跳線解決兼容性的問題。解決跳線的方法是,通過分析原理圖,找到開源開發板上所示必要引腳,再找到自己的開發板與必要引腳的對應關系,在自己的開發板上實現開源開發板相同的電氣連接即可。
本文內容,需要有MDK使用經驗。MDK是編譯單片機代碼的IDE,早期是keil,后被ARM買了。如果文章中有不懂的地方,可以網上搜索使用MDK進行STM32開發的環境搭建過程,做一遍環境搭建,就能完整復現本文的實驗步驟了。
撰文時間較短,有不足之處,歡迎各位道友指出。歡迎交流。
七、參考鏈接
[1] STM32F103C8T6 開發板 STM32最小系統核心板 STM32單片機學習評估-淘寶網 (taobao.com)(https://item.taobao.com/item.htm?spm=a230r.1.14.47.43bf1f92MKZWHC&id=527982658127&ns=1&abbucket=10#detail)
[2] STM32F103VET6核心板最小系統板STM32 ARM開發板Cortex-m3-淘寶網 (taobao.com)(https://item.taobao.com/item.htm?spm=a230r.1.14.56.25704beeYXlvyZ&id=575401251589&ns=1&abbucket=3#detail)
[3] 仿真器J-LINK下載器ARM單片機STM開發板燒錄器V10JLINKV9-tmall.com天貓(https://detail.tmall.com/item.htm?spm=a230r.1.14.33.1d9a4269wgn6tN&id=637526274397&ns=1&abbucket=10)
[4] GitHub - x893/CMSIS-DAP: STM32 port for CMSIS-DAP with additional serial (CDC) support(https://github.com/x893/CMSIS-DAP)
[5] 鏈接:https://pan.baidu.com/s/1TlvK57Wf4jhK6ixKnAEqug 提取碼:35c1
[6] MDK Version 5 (keil.com)(https://www2.keil.com/mdk5)
[7] Keil MDK μVision 5 下載安裝及破解教程 - 吳川斌的博客 (mr-wu.cn)(https://www.mr-wu.cn/keil-mdk-uvision-5-crack/)
[8] MDK v4 Legacy Support (keil.com)(https://www2.keil.com/mdk5/legacy)
[9] https://blog.csdn.net/LEON1741/article/details/72846434
[10] https://github.com/pyocd/pyOCD