DAP-Link DIY复刻指南

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-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 源码拉取

  • DAP-Link 开源地址:《DAPLink Github》
  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但是烧录失败提示

我们需要继续修改 CMSIS-DAP 的配置选项。

  1. 修改 Reset 选项为 SYSRESETREQ
    在这里插入图片描述
  2. 烧录算法需要多添加一种 STM32F103 Flash Options
    在这里插入图片描述

在这里插入图片描述
Over

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/508497.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue2+ElementUI列表、表格组件的封装

Vue2ElementUI列表组件的封装:引言 在日常开发中,我们经常会遇到需要展示列表数据的场景。ElementUI 提供的 el-table 组件是一个功能强大的表格组件,可以满足大部分的需求。但是,在实际应用中,我们往往需要根据业务需…

Java基础 - 7 - 常用API(三)

API(全称 Application Programming Interface:应用程序编程接口) API就是Java帮我们已经写好的一些程序,如类、方法等,可以直接拿过来用 JDK8 API文档:Java Platform SE 8 一. JDK8之前传统的日期、时间 …

并行和并发的区别

并行和并发的区别是并行指的是多个任务在同一时间点上同时执行,而并发指的是多个任务在同一时间段内交替执行。并行需要多个处理器或者多核处理器,每个任务都有独立的资源,不会互相干扰。并发可以在单核或者多核处理器上实现,多个…

【c++】继承深度解剖

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么事继承,基类和派生类的使用和…

百度诉闪速推公司涉“万词霸屏”不正当竞争纠纷案审理结果

交叉口讯 5月13日,江苏省高级人民法院知识产权庭公布百度诉闪推公司涉及“万磁霸屏”不正当竞争纠纷一案审理结果:判决闪推公司应立即停止涉案的不正当竞争行为。 ,公司在其公司官网发布声明,消除影响,并赔偿百度经济损…

码界深潜:全面解读软件工程的艺术与科学

🏡 基石构筑篇——软件工程基础理论及技能 🔢 编程语言选型与精修 于软件工程之浩瀚宇宙中,编程语言犹如各色画笔,每种语言的特性对应不同的创作领域。譬如Java倚仗跨平台兼容性和强大的面向对象机制,在企业级应用程序…

数字革命的浪潮:Web3如何改变一切

随着数字技术的不断发展,人类社会正迎来一场前所未有的数字革命浪潮。在这个浪潮中,Web3技术以其去中心化、安全、透明的特性,正在逐渐改变着我们的生活方式、商业模式以及社会结构。本文将深入探讨Web3技术如何改变一切,以及其所…

群体风暴之锤(War3地图编辑器)

文章目录 0、大致原理1、创建隐形单位2、新事件开端3、环境→新条件4、动作4.1、单位组4.1.1、圆范围内单位4.1.2、指定条件 4.2、对单位组内的所有单位释放风暴之锤 0、大致原理 真MK向目标点释放风暴之锤时选定(以技能释放点为圆心,设定半径&#xff0…

Myqsort:基于冒泡排序算法的C语言实现

我们将详细介绍一个基于冒泡排序算法的自定义排序函数——Mysqrt。该函数通过使用用户提供的比较函数进行元素间的比较&#xff0c;并结合swap交换函数对任意类型的数据进行排序。下面是对代码的逐行解析。 逻辑导图 代码实现 // 头文件 #include<stdio.h>// 定义比较函…

谨用ArrayList中的subList方法

谨用ArrayList中的subList方法 规范一&#xff1a; ArrayList 的 subList 结果不可强转成 ArrayList&#xff0c;否则会抛出 ClassCastException 异常&#xff1a; public static void test7() {List<Integer> list new ArrayList<>();list.add(1);list.add(2);…

【数据分享】1979~2020年MSWEP降水数据集

各位同学们好&#xff0c;今天和大伙儿分享的是1979~2020年MSWEP降水数据集。如果大家有下载处理数据等方面的问题&#xff0c;您可以私信或者评论。 Beck, H. E., E. F. Wood, M. Pan, C. K. Fisher, D. G. Miralles, A. I. J. M. van Dijk, T. R. McVicar, and R. F. Adler, …

三、低代码平台-单据配置(单表增删改查)

一、业务效果图 主界面 二、配置过程简介 配置流程&#xff1a;业务表设计 -》业务对象建立-》业务单据配置-》菜单配置。 a、业务表设计 b、业务对象建立 c、业务单据配置 功能路径&#xff1a;低代码开发平台/业务开发配置/单据配置维护 d、菜单配置