DAP-Link DIY复刻指南

1. 概述

DAP-LinkARM 开源的一个项目,主要用于代码下载以及调试,支持 SWDJTAG 调试接口,对于开发嵌入式的同学相信都或多或少有所耳闻。

除了 DAP-Link 之外还有很多同类型的调试器,如 ST-LinkJ-Link,但是这些都是不开源的,无法复刻或进行二次开发。但 DAP-Link 不同,完全开源,不用担心侵权问题,且随着开源社区大家的共同努力,DAP-Link 经过了不断的迭代,先如今已取代 ARM 之前推出的 CMSIS-DAP 开源项目。

DAP-Link 实现了一个复合设备,插入电脑上之后会存在四个设备,分别是:

  1. HID
  2. MSC
  3. 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 工具安装

  1. 安装 Git 工具,拉取代码
  2. 安装 python3,生成工程需要依赖 python
  3. 安装 Keil5 MDK,代码编译及下载验证等此博文采用 keil 方案

以上工具安装,大家可自行网上搜索查阅,此处不作另外说明。

2.2 源码拉取

  1. 首先使用 git 工具拉取 DAP-Link 的源码,之后切换到 release 发布 tag,注意不要直接在main/master分支开发,main/master分支是正在开发的分支,说不定还有bug。

    • 拉取代码: git clone https://github.com/ARMmbed/DAPLink
    • 切换至V0257版本:git checkout v0257
      在这里插入图片描述
  2. 进入DAPLink工程目录, 使用python工具pip安装 virtualenv 虚拟环境并创建虚拟环境

    • 进入DAPLink工程目录:cd DAPLink,实际大家此步可能不一样,反正你的命令窗口当前路径在工程目录即可
    • 安装虚拟环境:pip install virtualenv
    • 创建虚拟环境:virtualenv venv

我已经安装过了,所以输入命令后不会重新安装
在这里插入图片描述

  1. 之后需要激活虚拟环境并更新虚拟环境参数:(注意此步骤,在每次重新打开一个命令窗口后都需要重新运行)

    • 执行脚本激活:venv/Scripts/activate.bat
    • 更新参数:pip install -r requirements.txt
      在这里插入图片描述
  2. 使用 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 的工程
  3. 生成的工程列表中存在很多个工程,都是 DAP-Link 开源已支持的不同IC厂商的工程,我们采用stm32F103的硬件板卡,因此我们只用关心 STM32 相关命名的工程。其中 stm32f103xb_blbootload 工程,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

  1. 打开 bootload 工程 stm32f103xb_bl ,注意生成的工程为 keil4 版本,因此使用keil5 mdk打开会报错提示安装兼容包 MDK v4 Legacy Support,点击安装即可,网速慢的话可以自行网上搜索离线安装。
    在这里插入图片描述

  2. 直接编译,理论上应该是 0 error !
    在这里插入图片描述

  3. 修改工程IC选择,此工程默认支持的是 STM32F103RBT6,故我们选择对应的IC为 STM32F103RBT6,点击魔术棒,默认是Cotrx-M3,修改为 STM32F103RBT6

    • 点击魔术棒之后如果找不到 STM32F103RBT6,说明你没有安装STM32F10x的芯片资源包,自行网上搜索离线资源包之后安装即可。
    • 我们此处硬件上实际是STM32F103VET6,完全兼容STM32F103RBT6,所以不用担心
      在这里插入图片描述
  4. 继续点击魔术棒,之后选择Debug,设置你所用的下载器,下载 bootload 需要先用一个已经烧录好程序的下载器下载程序,此处我所使用的是 ST-Link ,所以我选择 ST-Link ,并点击Setting ,勾选Reset and Running 复位后运行,下载后即可自动运行,不用重新上电。此外还需要点击Add 添加对应的烧录算法!
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  1. 修改代码,添加 IO 控制,此处是由于板子特性,指南者开发板的USB上拉被一个三极管控制,需要打开此上拉,否则等下USB无法识别。

    • 当USB接口插入电脑后,电脑检测到 D+ 被上拉,则识别到有USB设备插入,之后再主动发起通讯,故 USBD+ 一定需要上拉!大家自己的硬件上需要注意,有的是用的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);
      
      在这里插入图片描述
      在这里插入图片描述
  2. 重新编译,没有报错,之后点击下载烧录程序

    在这里插入图片描述

    在这里插入图片描述

  3. 烧录成功之后,将板子的USB连接上电脑,电脑会显示多了一个名叫 MAINTENANCE 的U盘设备,这是 DAP-Linkbootload 虚拟出来的。
    在这里插入图片描述

  4. 此时 Bootload 已烧录成功,之后我们开始编译 APP,编译好的 APPhex 或者 bin 文件,直接拖拽到此u盘内即可完成 APP 的下载,如果下载出错的话,U盘内会生成一个 Fault.txt 文件,里面描述了错误信息。

3.2 下载 APP

  1. 打开 APP 的工程文件 stm32f103xb_stm32f103rb_if
  2. 同样的,修改工程的IC选择,步骤:魔术棒 -> Device -> stm32f103rbt6
    在这里插入图片描述
  3. 配置 hex 文件生成,步骤:魔术棒 -> output -> Create HEX file
    在这里插入图片描述
  4. 编译工程,编译成功之后,打开工程目录下的 build 目录,找到里面的 .hex 文件,将其拖拽或拷贝至 MAINTENANCE U 盘内,完成升级
    在这里插入图片描述
  5. 升级成功之后,U盘名字自动修改为 DAP-Link
    在这里插入图片描述
  6. APP 烧录完成之后,DAPLink 会采用USB 构建一个复合设备,我们通过 usblyzer 软件可以看到 DAPLink通过一个usb端口虚拟了四个不同的设备。
    在这里插入图片描述
  7. 如果没有成功,可能是某些原因,继续往下看

3.3 修改IO配置

如果我们的实际硬件资源和 DAPLink 中所使用的硬件资源冲突,如何修改呢?对应代码在什么位置呢?

  1. 查看IO配置,打开 IO_Config.h 文件,这里面就是 DAP-Link 核心的IO资源情况了,设备其他硬件关键修改的一处就是此文件。

    • SWCLK 引脚配置为 PB13
    • SWDIO_INSWDIO_OUT 分别配置为 PB12PB14 ,在硬件上我们也可以看到此两个IO是相连接的。注意 SWDIO_IN 通过一个 100R 的电阻连过去的。
    • nRESET 引脚为 PB0 ,这个复位不是指芯片复位IO,而是表示如果程序运行在 APP ,如果需要切换到bootload怎么做?只需要将此 IO 短接到 GND,之后重启电源,程序将卡在 bootload 不会进入 APP,之后断开此IOGND的连接,重新拖拽下载新的APP即可!
    • 剩下的就是LED引脚了,此处我们将 PA9 修改为开发板上的LED管脚 PB5
  2. DAPLink 实现的USB中还附带有一个 CDC虚拟串口 可用于调试,打开 uart.c 文件,可以看到此虚拟串口映射的实际串口为 USART2PA2(TX)PA3 (RX),如果我们需要替换串口,可以修改此 uart.c 文件

  3. 修改完之后,按照 3.1 和 3.2 的步骤重新烧录一遍即可

  4. 注意,你会发现 bootloadapp 工程所加载的 IO_Config.huart.c 实际为同一个文件,只是创建了不同的工程而已,故你在一个工程内修改后,在另外一个工程也会同步修改!

4. 验证

4.1 虚拟串口验证

  1. 根据 uart.c 文件可知,DAPLink 构建的虚拟串口所映射到的实际串口为 UASRT2PA2(TX)PA3 (RX)
  2. 我们将板子上的 PA2 和 PA3 短接,之后使用串口工具打开对应的COM口,发送任意数据查看是否接收到有效数据。
    在这里插入图片描述

4.2 Keil 无法识别 DAPLink?

接下来我们验证 Keil 采用 DAPLink 进行下载:

  1. 首先我们准备另外一款板卡,以及对应的工程
  2. 连接物理接线,此时我们的开发板是DAPLink,对应接线如下:
DAPLink(开发板)待烧录板卡备注
PB13SWCLK
PB12SWDIODAPLinkPB12PB14 短接
GNDGND
  1. 待烧录板卡供电

  2. 打开待烧录板卡对应的软件MDK工程,魔术棒->Debug->"选择CMSIS-DAP" -> Setting,发现并没有识别DAPLink
    在这里插入图片描述
    在这里插入图片描述

  3. 这是由于 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)

  4. 重新打开待烧录板卡工程的的 CMSIS-DAP 设置,发现此时 Keil 可正常识别 IC
    在这里插入图片描述

  5. 检查 Flash Download 配置(此处我待烧录的板卡IC为 stm32f103rbt6
    在这里插入图片描述

  6. 编译工程,烧录下载,然而有时候并不顺利
    在这里插入图片描述

在这里插入图片描述

4.3 keil 可以识别DAPLink但是烧录失败提示

4.3.1 修改配置方案记录

修改 CMSIS-DAP 的配置选项。

  1. 修改 Reset 选项为 SYSRESETREQ
    在这里插入图片描述
  2. 烧录算法需要多添加一种 STM32F103 Flash Options (此处不用修改也没问题,后面我测试不需要增加此项)
    在这里插入图片描述

在这里插入图片描述

4.3.2 检查硬件方案

根据官方开源的硬件方案,SWDIO_OUTSWDIO_IN 引脚是需要通过一个100R的电阻进行连接的,但是之前我在开发板上是采用杜邦线直接短路此两个IO。故接下来我需要验证此问题!

我重新购买一块 STM32F103C8T6 的最小系统板,并进行以下硬件改造:

  1. PA12 引脚飞线一颗 4.7k 电阻至 3V3,实现USB D+的上拉,让电脑可以识别USB接入
  2. PB12PB14之间飞一颗 120R 的电阻(我这只有120R 的电阻了~)

之后 PB14 作为 SWDIO引脚,PB13 作为 SWCLK 引脚,按照前面所述方式,修改代码后下载程序,至 DAPLINK 可以在电脑端正常识别。
在这里插入图片描述

之后此最小系统板作为下载器,连接待烧录板卡,配置 Keil 工程的烧录器,F8 下载,丝滑般流畅 ~
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.4 重新上电,无法直接进入 APP 的 DAPLink 程序

此外,有一点还需注意,当我们重新拔插此 DAPLINK 之后,重新上电,弹出来的 U 盘提示为 MAINTENANCE ,也即卡在了Bootload,不能直接进入 APPDAPLINK 程序,这是由于最小系统板上的 PB0 引脚处于浮空状态导致,我们采用杜邦线将PB0连接至 3V3 后重新上电验证,程序可正常进入 APP 程序,加载 DAPLink

当然,还有一种办法,就是修改程序里面 nRESET_PIN 的配置啦~,此处不多说,懂的已经开始上手修改了!

5. 总结

以上便是采用复刻DAP-Link的全部记录了,当前方案采用的是 STM32F103,只是简单的将开源方案 DIY 了一遍,由于STM32F103 系列现在已经停产,我的目标是做一个顺手的全功能调试器,因此接下来需要做的就是将此 DAP-LINK 程序移植到其他控制器上面去应用了!感兴趣的话,关注我的博客,期待下一次更新吧~

😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃


创作不易,转载请注明出处!

关注、点赞+收藏,可快速查收博主有关分享!


😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃 😃

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐