DAP-Link DIY复刻指南
文章目录
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但是烧录失败提示
4.3.1 修改配置方案记录
修改 CMSIS-DAP 的配置选项。
- 修改 Reset 选项为
SYSRESETREQ
- 烧录算法需要多添加一种
STM32F103 Flash Options
(此处不用修改也没问题,后面我测试不需要增加此项)
4.3.2 检查硬件方案
根据官方开源的硬件方案,SWDIO_OUT
和 SWDIO_IN
引脚是需要通过一个100R的电阻进行连接的,但是之前我在开发板上是采用杜邦线直接短路此两个IO。故接下来我需要验证此问题!
我重新购买一块 STM32F103C8T6
的最小系统板,并进行以下硬件改造:
PA12
引脚飞线一颗4.7k
电阻至3V3
,实现USB D+
的上拉,让电脑可以识别USB接入PB12
与PB14
之间飞一颗120R
的电阻(我这只有120R
的电阻了~)
之后 PB14
作为 SWDIO
引脚,PB13
作为 SWCLK
引脚,按照前面所述方式,修改代码后下载程序,至 DAPLINK
可以在电脑端正常识别。
之后此最小系统板作为下载器,连接待烧录板卡,配置 Keil 工程的烧录器,F8 下载,丝滑般流畅 ~
4.4 重新上电,无法直接进入 APP 的 DAPLink 程序
此外,有一点还需注意,当我们重新拔插此 DAPLINK
之后,重新上电,弹出来的 U 盘提示为 MAINTENANCE
,也即卡在了Bootload
,不能直接进入 APP
的 DAPLINK
程序,这是由于最小系统板上的 PB0
引脚处于浮空状态导致,我们采用杜邦线将PB0连接至 3V3
后重新上电验证,程序可正常进入 APP
程序,加载 DAPLink
!
当然,还有一种办法,就是修改程序里面 nRESET_PIN
的配置啦~,此处不多说,懂的已经开始上手修改了!
5. 总结
以上便是采用复刻DAP-Link的全部记录了,当前方案采用的是 STM32F103,只是简单的将开源方案 DIY 了一遍,由于STM32F103 系列现在已经停产,我的目标是做一个顺手的全功能调试器,因此接下来需要做的就是将此 DAP-LINK 程序移植到其他控制器上面去应用了!感兴趣的话,关注我的博客,期待下一次更新吧~
- 博客主页:
爱出名的狗腿子(点击跳转)
😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃
创作不易,转载请注明出处!
关注、点赞+收藏,可快速查收博主有关分享!
😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃