一、 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