自制DAPLink -- ARM官方源码以及STM32F103C8T6

【本文发布于https://blog.youkuaiyun.com/Stack_/article/details/128771308,未经许可禁止转载,转载须注明出处】


一、安装工具并配置环境变量


ARM的GitHub有如下说明


在这里插入图片描述

1、python3

【官网】
【网盘】提取码:fp68

安装时会自动添加环境变量。如果电脑已有py2环境变量,安装完后在系统变量中将py3提到py2前面,下面的操作完成后卸载或者恢复到py2后面即可。

2、Git

【官网】
【网盘】提取码:v5t6

3、Keil MDK,需要有V5编译器。MDK5 v5.28即可

【网盘】提取码:keil

二、获取官方开源代码

右键Git Bash Here,输入

git clone https://github.com/ARMmbed/DAPLink

将拉取一个名为DAPLink的文件夹,内有如下文件。

在这里插入图片描述

选中的文件夹为后续步骤生成的

三、生成Keil工程

DAPLink\docs目录下找到DEVELOPERS-GUIDE.md文件(即第一张图的开发指引)

在这里插入图片描述
1、输入pip install virtualenv,等待下载完成(此处以及后续命令行操作均在DAPLink路径下,DAPLink目录中右键Git Bash Here)。

在这里插入图片描述

2、输入virtualenv venv,等待执行完成。将生成venv文件夹

在这里插入图片描述
3、输入venv/Scripts/activate.bat

4、输入pip install -r requirements.txt。如果显示timed out字样,改用pip install --default-timeout=1000 --no-cache-dir -r requirements.txt。需要等较长的时间。当出现Successfully installed即为成功

5、输入progen generate -t uvision,将生成projectfiles,并在projectfiles目录下生成一系列工程


四、打开工程

确保Keil已激活以及已安装stm32f103的pack。

找到stm32f103xb_bl文件夹,打开工程文件,将提示如下信息,点击第一项,将弹出pack安装管理器(Pack Installer),关闭它。

【工程名是stm32f103xb,但是我这里为什么用stm32f103c8t6?原因请看评论区。】


在这里插入图片描述

关闭后看到此界面,点击是,随后选择单片机型号为STM32F103C8T6。

在这里插入图片描述





五、编译下载

1、根据自己DIY的硬件修改IO_Config.h引脚定义文件

2、编译工程并用其它烧录器下载到STM32F103C8T6后,重新插拔USB线,电脑将出现一个虚拟硬盘。表示DAPLink的boot程序已成功运行。

在这里插入图片描述

3、随后找到stm32f103xb_stm32f103rb_if工程,进行和上面一致的操作。编译后在工程build目录下找到hex文件拖入到此虚拟U盘中,U盘名称将变为下图所示。DAPLINK运行成功

在这里插入图片描述



六、注意


1、发现我自己画的板子烧入程序,有几率上电时停留在boot中无法进入app,排查后发现官方源码中RST引脚配置为开漏输出,boot中要读取到RST的电平为高才会跳转app,而我这板子没有上拉RST脚。配置为推挽输出便正常了。

2、keil工程芯片型号不一样,但它们的源文件是共用的,boot和app也是有公共的源文件的,例如IO_Config.h。


七、附


1、【硬件原理图】
链接:https://pan.baidu.com/s/1o40RZSf3Fbb1uKpI4PE4SQ
提取码:qlw5


2、引脚定义修改

/**
 * @file    IO_Config.h
 * @brief
 *
 * DAPLink Interface Firmware
 * Copyright (c) 2009-2016, ARM Limited, All Rights Reserved
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __IO_CONFIG_H__
#define __IO_CONFIG_H__

#include "stm32f1xx.h"
#include "compiler.h"
#include "daplink.h"

COMPILER_ASSERT(DAPLINK_HIC_ID == DAPLINK_HIC_ID_STM32F103XB);

//USB control pin
#define USB_CONNECT_PORT_ENABLE()    __HAL_RCC_GPIOA_CLK_ENABLE()
#define USB_CONNECT_PORT_DISABLE()   __HAL_RCC_GPIOA_CLK_DISABLE()
#define USB_CONNECT_PORT             GPIOA
#define USB_CONNECT_PIN              GPIO_PIN_15
#define USB_CONNECT_ON()             (USB_CONNECT_PORT->BSRR = USB_CONNECT_PIN)
#define USB_CONNECT_OFF()            (USB_CONNECT_PORT->BRR  = USB_CONNECT_PIN)

//Connected LED
#if (0)
#define CONNECTED_LED_PORT           GPIOB
#define CONNECTED_LED_PIN            GPIO_PIN_6
#define CONNECTED_LED_PIN_Bit        6
#else	//PWH修改为PA8
#define CONNECTED_LED_PORT           GPIOA
#define CONNECTED_LED_PIN            GPIO_PIN_8
#define CONNECTED_LED_PIN_Bit        8
#endif

//When bootloader, disable the target port(not used)
#define POWER_EN_PIN_PORT            GPIOB
#define POWER_EN_PIN                 GPIO_PIN_15
#define POWER_EN_Bit                 15

// nRESET OUT Pin
#if (0)
#define nRESET_PIN_PORT              GPIOB
#define nRESET_PIN                   GPIO_PIN_0
#define nRESET_PIN_Bit               0
#else	//PWH修改为
#define nRESET_PIN_PORT              GPIOA
#define nRESET_PIN                   GPIO_PIN_6
#define nRESET_PIN_Bit               6
#endif

//SWD
#if (0)
#define SWCLK_TCK_PIN_PORT           GPIOB
#define SWCLK_TCK_PIN                GPIO_PIN_13
#define SWCLK_TCK_PIN_Bit            13
#else	//PWH修改为
#define SWCLK_TCK_PIN_PORT           GPIOA
#define SWCLK_TCK_PIN                GPIO_PIN_4
#define SWCLK_TCK_PIN_Bit            4
#endif

#if (0)
#define SWDIO_OUT_PIN_PORT           GPIOB
#define SWDIO_OUT_PIN                GPIO_PIN_14
#define SWDIO_OUT_PIN_Bit            14
#else	//PWH修改为
#define SWDIO_OUT_PIN_PORT           GPIOA
#define SWDIO_OUT_PIN                GPIO_PIN_7
#define SWDIO_OUT_PIN_Bit            7
#endif

#if (0)
#define SWDIO_IN_PIN_PORT            GPIOB
#define SWDIO_IN_PIN                 GPIO_PIN_12
#define SWDIO_IN_PIN_Bit             12
#else	//PWH修改为
#define SWDIO_IN_PIN_PORT            GPIOB
#define SWDIO_IN_PIN                 GPIO_PIN_0
#define SWDIO_IN_PIN_Bit             0
#endif

//LEDs
//USB status LED
#define RUNNING_LED_PORT             GPIOA
#define RUNNING_LED_PIN              GPIO_PIN_9
#define RUNNING_LED_Bit              9

#define PIN_HID_LED_PORT             GPIOA
#define PIN_HID_LED                  GPIO_PIN_9
#define PIN_HID_LED_Bit              9

#define PIN_CDC_LED_PORT             GPIOA
#define PIN_CDC_LED                  GPIO_PIN_9
#define PIN_CDC_LED_Bit              9

#define PIN_MSC_LED_PORT             GPIOA
#define PIN_MSC_LED                  GPIO_PIN_9
#define PIN_MSC_LED_Bit              9


#endif


3、如果Keil无法识别到DAPLink,需要根据下文对源码做些修改

【新版daplink keil5识别不了】











本来想着加块屏幕可以个性化一下,但读懂源码就不容易了,目前只能显示USB连接状态,其余得慢慢研究了


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

DAPLink是一种基于CMSIS-DAP的固件,它可以让开发人员使用DAPLink设备作为USB接口来进行程序下载和调试。在这里,我将简要介绍一下DAPLink的源代码结构。 DAPLink源码位于daplink目录下,包含以下子目录: - bootloader:DAPLink固件的引导加载程序,用于更新固件。 - cmsis_core:CMSIS-CORE标准库,提供了与处理器相关的基本功能。 - cmsis_dap:CMSIS-DAP标准库,提供了与DAPLink设备相关的功能。 - interface:DAPLink的接口代码,提供了与目标设备之间的通信功能。 - target:DAPLink的目标设备代码,提供了针对不同处理器的调试功能。 其中,bootloader和cmsis_core、cmsis_dap是DAPLink的基础组件,interface和target则是根据具体目标设备实现的。 在interface目录下,可以看到以下文件: - board.c:定义了DAPLink设备的GPIO口、LED、按键等硬件资源的初始化函数。 - communication.c:定义了DAPLink与目标设备之间通信的函数,如读写寄存器、读写内存、执行指令等。 - flash_intf.c:定义了DAPLink与目标设备之间进行程序烧录的函数,如擦除扇区、编程扇区等。 - target_config.h:定义了目标设备的相关配置信息,如芯片类型、JTAG/SWD接口类型、Flash大小等。 在target目录下,可以看到以下文件: - cmsis_os2.c:定义了操作系统相关的函数,如线程创建、互斥锁等。 - target_family.c:定义了针对不同处理器系列的调试功能,如ARM Cortex-M系列、NXP LPC系列、ST STM32系列等。 - target_config.h:定义了目标设备的相关配置信息,如芯片类型、JTAG/SWD接口类型、Flash大小等。 总的来说,DAPLink源码主要包含了基础组件、接口代码和目标设备代码三个部分,其中接口代码和目标设备代码是根据具体目标设备实现的。如果需要使用DAPLink对某个芯片进行调试,需要先确定该芯片的目标设备代码是否已经被实现,并进行相应的配置。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值