DAP-Link DIY复刻指南
文章目录
- DAP-Link DIY复刻指南
- 1. 概述
- 2. 获取工程资源
- 2.1 工具安装
- 2.2 源码拉取
- 2.3 硬件资源获取
- 3. 工程下载验证
- 3.1 下载bootload
- 3.2 下载 APP
- 3.3 修改IO配置
- 4. 验证
- 4.1 虚拟串口验证
- 4.2 Keil 无法识别 DAPLink?
- 4.3 keil 可以识别DAPLink但是烧录失败提示
1. 概述
DAP-Link
是 ARM
开源的一个项目,主要用于代码下载以及调试,支持 SWD
和 JTAG
调试接口,对于开发嵌入式的同学相信都或多或少有所耳闻。
除了 DAP-Link
之外还有很多同类型的调试器,如 ST-Link
, J-Link
,但是这些都是不开源的,无法复刻或进行二次开发。但 DAP-Link
不同,完全开源,不用担心侵权问题,且随着开源社区大家的共同努力,DAP-Link
经过了不断的迭代,先如今已取代 ARM
之前推出的 CMSIS-DAP
开源项目。
DAP-Link
实现了一个复合设备,插入电脑上之后会存在四个设备,分别是:
- HID
- MSC
- CDC
此篇博客将展示从0到1,全面验证 DAP-Link
开源项目的方案,并对其中遇到的问题进行一个全面记录。
DAP-Link 官方已支持多款硬件平台,如下:
- Maxim Integrated MAX32625PICO based on MAX32625
- Nuvoton Nu-Link2-Me based on M48SSIDAE
- NXP LPC-Link2 based on LPC11U35 or LPC4322
- NXP MCU-LINK on LPC55xx
- NXP OpenSDA based on K20, K22, KL26Z and KL27Z
- Segger J-Link OB based on Atmel SAM3U
- STMicroelectronics ST-LINK/V2 (on NUCLEO boards) based on STM32F103CB
本人手上刚好有一块野火的指南者开发板,IC为 stm32F103VET6
, 本博文将基于此硬件进行验证。
2. 获取工程资源
2.1 工具安装
- 安装
Git
工具,拉取代码 - 安装
python3
,生成工程需要依赖 python - 安装
Keil5 MDK
,代码编译及下载验证等此博文采用 keil 方案
以上工具安装,大家可自行网上搜索查阅,此处不作另外说明。
2.2 源码拉取
DAP-Link
开源地址:《DAPLink Github》
-
首先使用 git 工具拉取 DAP-Link 的源码,之后切换到 release 发布 tag,注意不要直接在main/master分支开发,main/master分支是正在开发的分支,说不定还有bug。
- 拉取代码:
git clone https://github.com/ARMmbed/DAPLink
- 切换至V0257版本:
git checkout v0257
- 拉取代码:
-
进入DAPLink工程目录, 使用python工具pip安装 virtualenv 虚拟环境并创建虚拟环境
- 进入DAPLink工程目录:
cd DAPLink
,实际大家此步可能不一样,反正你的命令窗口当前路径在工程目录即可 - 安装虚拟环境:
pip install virtualenv
- 创建虚拟环境:
virtualenv venv
- 进入DAPLink工程目录:
我已经安装过了,所以输入命令后不会重新安装
-
之后需要激活虚拟环境并更新虚拟环境参数:(注意此步骤,在每次重新打开一个命令窗口后都需要重新运行)
- 执行脚本激活:
venv/Scripts/activate.bat
- 更新参数:
pip install -r requirements.txt
- 执行脚本激活:
-
使用
python
脚本progen
构建MDK
工程- 命令如下:
progen generate -t uvision
,此命令执行完之后将会在projectfiles/uvision
目录下创建对应的keil
工程 - 命令执行完之后最后会报错
RuntimeError: Target cortex-m33 is not supported. Please add them to https://github.com/project-generator/project_generator_definitions
,这是由于脚本存在bug,没有指定特定工程导致,可以不用理会,我们可以发现projectfiles/uvision
目录下已经生成了对应的很多个工程。 - 当然也可以使用命令
progen generate -f projects.yaml -p stm32f103xb_stm32f746zg_if -t uvision
生成指定的工程,这样就不会报错了,以上命令生成了stm32f103xb_stm32f746zg_if
的工程
- 命令如下:
-
生成的工程列表中存在很多个工程,都是 DAP-Link 开源已支持的不同IC厂商的工程,我们采用stm32F103的硬件板卡,因此我们只用关心 STM32 相关命名的工程。其中
stm32f103xb_bl
为bootload
工程,stm32f103xb_stm32f103rb_if
为针对stm103rbt6
的应用APP工程。
2.3 硬件资源获取
DAP-Link
对应的硬件方案也是开源的,但是是在另外的一个工程里,工程链接:《mbed-HDK Github》
同样使用 Git
拉取下来,之后找到 stm32f103
的方案的原理图,对应路径为:mbed-HDK\Production Design Projects\ARM-mbed\DAPLink\STDAP
3. 工程下载验证
3.1 下载bootload
-
打开
bootload
工程stm32f103xb_bl
,注意生成的工程为 keil4 版本,因此使用keil5 mdk打开会报错提示安装兼容包MDK v4 Legacy Support
,点击安装即可,网速慢的话可以自行网上搜索离线安装。
-
直接编译,理论上应该是
0 error !
-
修改工程IC选择,此工程默认支持的是
STM32F103RBT6
,故我们选择对应的IC为STM32F103RBT6
,点击魔术棒,默认是Cotrx-M3,修改为STM32F103RBT6
- 点击魔术棒之后如果找不到
STM32F103RBT6
,说明你没有安装STM32F10x的芯片资源包,自行网上搜索离线资源包之后安装即可。 - 我们此处硬件上实际是
STM32F103VET6
,完全兼容STM32F103RBT6
,所以不用担心
- 点击魔术棒之后如果找不到
-
继续点击魔术棒,之后选择
Debug
,设置你所用的下载器,下载bootload
需要先用一个已经烧录好程序的下载器下载程序,此处我所使用的是ST-Link
,所以我选择ST-Link
,并点击Setting
,勾选Reset and Running
复位后运行,下载后即可自动运行,不用重新上电。此外还需要点击Add
添加对应的烧录算法!
-
修改代码,添加 IO 控制,此处是由于板子特性,指南者开发板的USB上拉被一个三极管控制,需要打开此上拉,否则等下USB无法识别。
- 当USB接口插入电脑后,电脑检测到
D+
被上拉,则识别到有USB设备插入,之后再主动发起通讯,故USB
的D+
一定需要上拉!大家自己的硬件上需要注意,有的是用的IO口内部上拉,也是可以。 - 找到
GPIO.c
文件,在void gpio_init(void)
函数下添加 PD6 的GPIO初始化,并设置其输出为低电平,也即默认一直打开USB D+
的上拉电阻 - 初始化代码如下:
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_RESET); GPIO_InitStructure.Pin = GPIO_PIN_6; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
- 当USB接口插入电脑后,电脑检测到
-
重新编译,没有报错,之后点击下载烧录程序
-
烧录成功之后,将板子的USB连接上电脑,电脑会显示多了一个名叫
MAINTENANCE
的U盘设备,这是DAP-Link
的bootload
虚拟出来的。
-
此时
Bootload
已烧录成功,之后我们开始编译APP
,编译好的APP
的hex
或者bin
文件,直接拖拽到此u盘内即可完成 APP 的下载,如果下载出错的话,U盘内会生成一个Fault.txt
文件,里面描述了错误信息。
3.2 下载 APP
- 打开 APP 的工程文件
stm32f103xb_stm32f103rb_if
- 同样的,修改工程的IC选择,步骤:
魔术棒 -> Device -> stm32f103rbt6
- 配置 hex 文件生成,步骤:
魔术棒 -> output -> Create HEX file
- 编译工程,编译成功之后,打开工程目录下的
build
目录,找到里面的.hex
文件,将其拖拽或拷贝至MAINTENANCE
U 盘内,完成升级
- 升级成功之后,U盘名字自动修改为
DAP-Link
- APP 烧录完成之后,DAPLink 会采用USB 构建一个复合设备,我们通过
usblyzer
软件可以看到 DAPLink通过一个usb端口虚拟了四个不同的设备。
- 如果没有成功,可能是某些原因,继续往下看
3.3 修改IO配置
如果我们的实际硬件资源和 DAPLink 中所使用的硬件资源冲突,如何修改呢?对应代码在什么位置呢?
-
查看IO配置,打开
IO_Config.h
文件,这里面就是 DAP-Link 核心的IO资源情况了,设备其他硬件关键修改的一处就是此文件。SWCLK
引脚配置为PB13
SWDIO_IN
和SWDIO_OUT
分别配置为PB12
和PB14
,在硬件上我们也可以看到此两个IO是相连接的。注意SWDIO_IN
通过一个100R
的电阻连过去的。nRESET
引脚为PB0
,这个复位不是指芯片复位IO,而是表示如果程序运行在APP
,如果需要切换到bootload怎么做?只需要将此IO
短接到GND
,之后重启电源,程序将卡在bootload
不会进入APP
,之后断开此IO
与GND
的连接,重新拖拽下载新的APP即可!- 剩下的就是LED引脚了,此处我们将
PA9
修改为开发板上的LED管脚PB5
-
DAPLink 实现的USB中还附带有一个 CDC虚拟串口 可用于调试,打开
uart.c
文件,可以看到此虚拟串口映射的实际串口为USART2
的PA2(TX)
和PA3 (RX)
,如果我们需要替换串口,可以修改此uart.c
文件 -
修改完之后,按照 3.1 和 3.2 的步骤重新烧录一遍即可
-
注意,你会发现
bootload
和app
工程所加载的IO_Config.h
和uart.c
实际为同一个文件,只是创建了不同的工程而已,故你在一个工程内修改后,在另外一个工程也会同步修改!
4. 验证
4.1 虚拟串口验证
- 根据
uart.c
文件可知,DAPLink 构建的虚拟串口所映射到的实际串口为UASRT2
的PA2(TX)
和PA3 (RX)
- 我们将板子上的 PA2 和 PA3 短接,之后使用串口工具打开对应的COM口,发送任意数据查看是否接收到有效数据。
4.2 Keil 无法识别 DAPLink?
接下来我们验证 Keil 采用 DAPLink 进行下载:
- 首先我们准备另外一款板卡,以及对应的工程
- 连接物理接线,此时我们的开发板是DAPLink,对应接线如下:
DAPLink(开发板) | 待烧录板卡 | 备注 |
---|---|---|
PB13 | SWCLK | |
PB12 | SWDIO | DAPLink 的 PB12 与 PB14 短接 |
GND | GND |
-
待烧录板卡供电
-
打开待烧录板卡对应的软件MDK工程,
魔术棒->Debug->"选择CMSIS-DAP" -> Setting
,发现并没有识别DAPLink
-
这是由于
DAP-Link
APP存在一处bug,也可能不是bug
,此处感谢 @NULL_1969 分享,要屏蔽一行代码解决,位于DAP.c
的 80行,static uint8_t DAP_Info(uint8_t id, uint8_t *info)
函数内的DAP_ID_PRODUCT
条件下length = DAP_GetProductString((char *)info);
此行屏蔽,如下图所示。
之后重新编译,拖拽APP更新(注意先拉低nRESET,复位电源回到bootload) -
重新打开待烧录板卡工程的的
CMSIS-DAP
设置,发现此时Keil
可正常识别 IC
-
检查
Flash Download
配置(此处我待烧录的板卡IC为stm32f103rbt6
)
-
编译工程,烧录下载,然而有时候并不顺利
4.3 keil 可以识别DAPLink但是烧录失败提示
我们需要继续修改 CMSIS-DAP 的配置选项。
- 修改 Reset 选项为
SYSRESETREQ
- 烧录算法需要多添加一种
STM32F103 Flash Options
Over