ARM 调试工具 UINIO-DAPLink 应用详解

ARM Mbed OS 是一款开源免费的物联网操作系统,包含有基于 ARM Cortex-M 系列微控制器开发智能连接产品所需的全部基础架构。其社区推出的 DAP-Link 同样是一个开源项目,它支持编程和调试运行在 ARM Cortex 微控制器上面的代码,主要运行于拥有 SWD 或者 JTAG 接口的微控制器当中,并且通过 USB 接口在计算机与 ARM Cortex 微控制器之间创建一个用于调试仿真的通道与桥梁,为开发人员提供了下载调试串口通信拖拽烧录等一系列实用功能。

DAPLink 主要由 Mbed 硬件开发工具包 以及 DAPLink 固件 两个开源项目构成,而 UINIO-DAPLink 则是由我自己设计的一款完全开源的 DAPLink 实现,相比于官方原版的硬件电路设计,在引出有 SWD 调试接口(由 ARM 公司制订)的同时,还引出了 JTAG 接口(属于 IEEE1149 国际标准)以及5V3.3V 电源,并且附带有 SWDJTAG 转接板的 PCB 设计,而固件部分则是基于 ARM 官方的最新的原版固件移植而来,全部的原理图与固件程序都已经开源在 GitHub

DAPLink 调试器可以为开发人员提供如下一系列方便实用的功能:

  • CMSIS-DAPv1 HID - 兼容 CMSIS 的调试通道;
  • CMSIS-DAPv2 WinUSB - 兼容 CMSIS 的调试通道;
  • WebUSB CMSIS-DAP HID - 兼容 CMSIS 的调试通道;
  • CDC - 用于日志、跟踪和终端仿真的虚拟通信端口;
  • MSC - 通过拖拽编程 Flash 存储器(根据固件不同,仅⽀持烧录特定型号芯片);

注意:目前 DAPLink 已经取代了过去 ARM Mbed 推出的 CMSIS-DAP 开源调试器项目。

如下品牌的 ARM 硬件接口电路(HIC,Hardware Interface Circuits,即调试器硬件)与 DAPLink 的固件完全兼容:

DAPLink 主要提供了拖放编程串口通信调试三种主要功能:

  • 拖拽烧录:通过将 .bin 或者 .hex 格式的文件复制或者保存到 DAPLink 驱动器,从而实现对目标微控制器的编程。完成以后,驱动器将会重新进行挂载。如果下载出现问题,则驱动器上将会自动生成一个包含有故障信息的 FAIL.TXT 文件;
  • 串口通信:可以直接与目标 MCU 微控制器进行双向串行通信,支持 9600144001920028800384005600057600115200 等常用波特率;
  • 下载调试:可以使用任意支持 CMSIS-DAP 协议的 IDE 集成开发环境进行调试,例如 pyOCDuVisionIAR

更新设备固件时,只需要连接上 USB 并且按住重置键,让设备进入 Bootloader 引导模式,从而开始下载固件。如果下载成功,那么设备将会离开引导模式,并且开始运行新的固件。如果下载失败,则设备将会自动生成显示有错误信息的 FAIL.TXT 文件。

DAPLink 的固件源代码,使用开源项目构建工具 project-generator 提供的 progen 命令进行构建。除此之外,在编译过程当中还需要使用到如下一系列工具软件:

  1. 安装 Git 并将其加入环境变量;
  2. 安装 Python 3 并将其加入环境变量;
  3. 安装相关的编译器,可以选择标识为 gcc_armGNU ARM Embedded Toolchain 、标识为 armclangARM Compiler 6,以及标识为 armccKeil MDK 或者 ARM Compiler 5 编译器,它们当中的大部分都只支持 Linux 和 Windows 操作系统环境;
  4. 安装 GNU Make 构建工具,可以组合使用 CMake 以及 ninja
  5. 通过 pip Install virtualenv 命令全局安装 Python 虚拟环境 virtualenv

准备虚拟环境

首先,需要去克隆 DAPLink 托管在 Github 上面的开源工程,并且创建出一个 Python 虚拟环境:

1
2
3
4
5
6
7
$ git clone https://github.com/mbedmicro/DAPLink

$ cd DAPLink

$ pip install virtualenv

$ virtualenv venv

如果当前使用的是 DAPLink 的指定 Release 版本,当把这些版本下载至本地以后,为了避免后续编译过程当中报错,需要将其初始化为一个 Git 工程项目:

1
2
3
4
5
$ git init
$ git add .
$ git config --global user.name "Hank"
$ git config --global user.email "uinika@outlook.com"
$ git commit -m "update"

接下来,就可以激活 Python 虚拟环境,并且更新 DAPLink 开源工程相关的第三方依赖库:

1
2
3
4
5
$ venv/Scripts/activate       (For Linux)

$ venv\Scripts\activate.bat (For Windows)

(venv) $ pip install -r requirements.txt

除此之外,还需要再额外全局安装 intelhexpyelftools 两个 Python 第三方库,避免后续使用 Keil µVision 进行编译的时候出现依赖缺失的错误:

1
$ pip install intelhex pyelftools

构建 Keil µVision 工程

接下来开始构建 DAPLink 的项目工程结构,可以使用 project-generator 提供的 progen 命令或者直接执行 tools/progen_compile.py 脚本:

1
(venv) $ python tools/progen_compile.py [-t <tool>] [--clean] [-v] [--parallel] [<project> [<project> ...]]
  • -t <tool>:选择当前构建所使用的工具链,默认为 make_gcc_arm,其它的可选项分别为 make_gcc_armmake_armclangmake_armcccmake_gcc_armcmake_armclangcmake_armcc
  • --clean: 清除现有的编译结果,并且强制重新编译所有文件;
  • -v: 列出详细信息,该选项会延长编译运行时间;
  • --parallel: 启用并行编译,加快编译速度;
  • <project>: 等待编译的目标工程,如果缺省将会编译全部工程;

通过执行下面的命令,可以在 projectfiles/uvision 目录下面生成一系列的 Keil µVision 工程:

1
(venv) $ progen generate -t uvision

当然也可以使用下面这条命令,只生成 stm32f103xb_blstm32f103xb_stm32f103rb_if 两个指定的 Keil µVision 工程:

1
(venv) $ progen generate -f projects.yaml -p stm32f103xb_bl stm32f103xb_stm32f103rb_if -t uvision

上述命令当中的参数 -f 用于指定工程配置文件,而参数 -p 则用于指定工程的名称,最后的 -t 则用于指定工程所属的开发环境。

添加 ARM Compiler version 5

编译 DAPLink 工程所需要使用到的 ARM 编译器版本为 5,而当前最新版本的 Keil µVision 5.39 包含的编译器版本为 6,此时需要下载 Keil µVision 5.36,同时提取其 ARM 目录下的 ARMCC 编译器,并将其解压至当前 Keil µVision 程序安装目录下的 ARM 文件夹下面:

启动 Keil µVision 开发环境,依次点击菜单栏上面的 【Project】->【Mange】->【Project Items】 选项:

选中弹出对话框当中的 【Folders/Extensions】 选项卡,点击 Use ARM Compiler 最右侧的按钮(即下图橙色圈出部分):

鼠标再点击新弹出界面上的 【Add another ARM Compiler Version to List】 按钮,将路径定位至刚才放置到 Keil µVision 安装目录下的 ARMCC 文件夹:

关闭上述对话框,再使用鼠标点击一次界面上的 【Setup Default ARM Compiler Version】 按钮:

选中 【Use default Compiler Version 5】,将上面的 ARMCC 目录设置为当前 Keil µVision 的默认编译器:

完成上述操作之后,就可以打开当前 Keil µVision 工程的 【Target】 选项卡,打开 ARM Compiler 下拉菜单,就可以看到相关的编译器选项:

由于当前 DAPLink 采用了 Keil µVision 4 进行构建,所以打开工程的时候会弹出如下的 【Using an MDK Version 4 Project】 对话框:

依次点击弹出界面上的 【Migrate to Device Pack】【Stop Waiting】 按钮,最后点击 【是(Y)】

选择当前 UINIO-DAPLink 所使用的意法半导体 STM32F103C8T6 作为目标编译芯片:

确认把当前以 .uvproj 作为后缀名的 Keil µVision 4 工程,转换为以 .uvprojx 作为后缀名的 Keil µVision 5 工程:

当使用 progen 执行完成项目构建之后,就会自动在 DAPLink 工程的 projectfiles\uvision 目录下面生成如下两个 Keil µVision 工程:

  1. stm32f103xb_bl 目录:DAPLink 的 Bootloader 工程,编译后得到 stm32f103xb_bl.hex
  2. stm32f103xb_stm32f103rb_if 目录:DAPLink 的 Interface 工程,编译后得到 stm32f103xb_stm32f103rb_if.hex

首先,计算机需要连接上一台已经下载好固件的 CMSIS-DAP Debugger 调试器,并且在 Keil µVision 当中进行如下一系列设置:

然后,就可以编译 DAPLink 的 Bootloader 工程 stm32f103xb_bl,并且将其直接烧录至 UINIO-DAPLink 当中:

完成 Bootloader 的烧录之后,将 UINIO-DAPLink 连接至计算机的 USB 端口,就会自动在操作系统的资源管理器当中挂载出一个 MAINTENANCE 盘符:

接下来,开始编译 DAPLink 的 Interface 工程 stm32f103xb_stm32f103rb_if,完成之后将编译得到的 stm32f103xb_stm32f103rb_if.hex 文件拖入 MAINTENANCE 盘符。如果此时资源管理器当中的 MAINTENANCE 盘符自动被更名为 DAPLINK,就表示已经成功完成了 UINIO-DAPLink 的全部固件下载工作:

注意:下载 DAPLink 固件所需的 stm32f103xb_bl.hex stm32f103xb_stm32f103rb_if.hex 固件,已经被放置到 UINIO-DAPLink 开源项目的 Firmware 目录下面,故而大家可以省略前述的 Keil µVision 编译步骤,直接按照上述流程下载固件即可。

首先,打开 DAPLink\source\daplink\cmsis-dap 目录下的 dap_strings.h 源文件,将其中的 #define CMSIS_DAP_PRODUCT_NAME "DAPLink CMSIS-DAP" 语句修改为自定义的 #define CMSIS_DAP_PRODUCT_NAME "UINIO-CMSIS-DAP"

1
2
3
#if !defined(CMSIS_DAP_PRODUCT_NAME)
#define CMSIS_DAP_PRODUCT_NAME "UINIO-CMSIS-DAP"
#endif

然后,再打开 DAPLink\source\hic_hal\stm32\stm32f103xb 目录下的 IO_Config.h 头文件,根据当前 UINIO-DAPLink 的引脚连接关系进行如下一系列配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#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
#define CONNECTED_LED_PORT GPIOB
#define CONNECTED_LED_PIN GPIO_PIN_6
#define CONNECTED_LED_PIN_Bit 6

// 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
#define nRESET_PIN_PORT GPIOB
#define nRESET_PIN GPIO_PIN_0
#define nRESET_PIN_Bit 0

// SWD
#define SWCLK_TCK_PIN_PORT GPIOB
#define SWCLK_TCK_PIN GPIO_PIN_13
#define SWCLK_TCK_PIN_Bit 13

#define SWDIO_OUT_PIN_PORT GPIOB
#define SWDIO_OUT_PIN GPIO_PIN_14
#define SWDIO_OUT_PIN_Bit 14

#define SWDIO_IN_PIN_PORT GPIOB
#define SWDIO_IN_PIN GPIO_PIN_12
#define SWDIO_IN_PIN_Bit 12

// 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

UINIO-DAPLink 调试器采用意法半导体 STM32F103C8T6 作为主控芯片,片上 Flash 的容量为 64KB。在之前所述的步骤当中,已经为其烧录了 stm32f103xb_bl.hex 作为 Bootloader,因而支持通过拖拽方式升级快速升级 Interface 固件 stm32f103xb_stm32f103rb_if.hex,具体操作步骤如下所示:

  1. 使用杜邦线将 UINIO-DAPLink 调试器的 nRSTGND 针脚进行短接。
  2. UINIO-DAPLink 连接到电脑,资源管理器出现 MAINTENANCE 盘符。
  3. 此时可以把 nRSTGND 引脚的杜邦线连接断开。
  4. 将新版本固件拖动至 MAINTENANCE 盘符,等待 UINIO-DAPLink 自动更新固件。
  5. 如果 Windows 操作系统的资源管理器出现 DAPLINK 盘符,就表示已经升级成功。

在接下来的内容里,将会基于我所制作的 UINIO-MCU-STM32L051K8 核心板,在意法半导体提供的最新版本 STM32CubeIDE 当中,实现固件的烧录与调试。

安装 arm-eabi 工具链

STM32CubeIDE 当中运用 DAPLink 调试与下载程序,需要使用到 ARM 嵌入式应用程序二进制接口,也就是 ARM EABI。包括了 Windows Toolchain for ARMOpenOCD 两个工具库:

  1. 首先,需要调用 openocd.exe 开启一个连接到 DAP-Link 与目标微控制器的 GDB 调试服务;
  2. 然后,STM32CubeIDE 就可以通过 arm-none-eabi-gdb.exe 访问这个 GDB 服务;

下载并且解压上述两个工具库之后,分别将它们的 bin 目录添加到操作系统的环境变量,再分别执行如下两个命令,测试其是否已经正确的被安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
λ openocd

Open On-Chip Debugger 0.11.0 (2021-11-18) [https://github.com/sysprogs/openocd]
Licensed under GNU GPL v2
libusb1 09e75e98b4d9ea7909e8837b7a3f00dda4589dc3
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
embedded:startup.tcl:26: Error: Can't find openocd.cfg
in procedure 'script'
at file "embedded:startup.tcl", line 26
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Error: Debug Adapter has to be specified, see "adapter driver" command
embedded:startup.tcl:26: Error:
in procedure 'script'
at file "embedded:startup.tcl", line 26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
λ arm-none-eabi-gdb

GNU gdb (GDB) 10.2.90.20210621-git
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=i686-w64-mingw32 --target=arm-none-eabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb)

以命令行方式进行调用

配置 OpenOCD

OpenOCD 命令的调用格式如下面的代码所示,其中的 -f 参数表示当前使用的是配置文件:

1
openocd.exe -f interface\调试器接口配置文件 -f target\目标微控制器配置文件

下面列出了 OpenOCD\share\openocd\scripts\interface 目录下的所有配置文件,由于这里使用的是 DAP-Link 作为调试器,所以通常都是以 cmsis-dap.cfg 作为参数:

1
2
3
4
5
6
7
8
9
10
11
12
λ ls OpenOCD\share\openocd\scripts\interface

altera-usb-blaster.cfg dummy.cfg jtag_vpi.cfg raspberrypi2-native.cfg ti-icdi.cfg
altera-usb-blaster2.cfg estick.cfg kitprog.cfg raspberrypi-native.cfg ti-icdi-auto.cfg
arm-jtag-ew.cfg flashlink.cfg nds32-aice.cfg rlink.cfg ulink.cfg
at91rm9200.cfg ft232r/ nulink.cfg rshim.cfg usb-jtag.cfg
buspirate.cfg ft232r.cfg opendous.cfg stlink.cfg usbprog.cfg
calao-usb-a9260.cfg ftdi/ openjtag.cfg stlink-dap.cfg vsllink.cfg
cc3200lp.cfg imx-native.cfg osbdm.cfg stlink-v1.cfg xds110.cfg
chameleon.cfg jlink.cfg parport.cfg stlink-v2.cfg
cmsis-dap.cfg jtag_dpi.cfg parport_dlc5.cfg stlink-v2-1.cfg
dln-2-gpiod.cfg jtag_hat_rpi2.cfg picoprobe.cfg sysfsgpio-raspberrypi.cfg

接下来例出的是 OpenOCD\share\openocd\scripts\target 目录下的全部配置文件,这里需要根据目标 MCU 微控制器的型号,酌情选择相应的配置文件作为参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
λ ls OpenOCD\share\openocd\scripts\target

adsp-sc58x.cfg bluenrg-x.cfg lpc13xx.cfg samsung_s3c2440.cfg
aduc702x.cfg c100.cfg lpc1549.cfg samsung_s3c2450.cfg
aducm3027.cfg c100config.tcl lpc15xx.cfg samsung_s3c4510.cfg
aducm3029.cfg c100helper.tcl lpc17xx.cfg samsung_s3c6410.cfg
aducm302x.tcl c100regs.tcl lpc1850.cfg sharp_lh79532.cfg
aducm360.cfg cc2538.cfg lpc1xxx.cfg sim3x.cfg
aducm4050.cfg cs351x.cfg lpc2103.cfg smp8634.cfg
aducm4x50.tcl davinci.cfg lpc2124.cfg snps_em_sk_fpga.cfg
allwinner_v3s.cfg dragonite.cfg lpc2129.cfg snps_hsdk.cfg
alphascale_asm9260t.cfg dsp56321.cfg lpc2148.cfg spear3xx.cfg
altera_fpgasoc.cfg dsp568013.cfg lpc2294.cfg stellaris.cfg
altera_fpgasoc_arria10.cfg dsp568037.cfg lpc2378.cfg stm32f0x.cfg
am335x.cfg efm32.cfg lpc2460.cfg stm32f1x.cfg
am437x.cfg em357.cfg lpc2478.cfg stm32f2x.cfg
amdm37x.cfg em358.cfg lpc2900.cfg stm32f3x.cfg
ampere_emag.cfg eos_s3.cfg lpc2xxx.cfg stm32f4x.cfg
ar71xx.cfg epc9301.cfg lpc3131.cfg stm32f7x.cfg
arm_corelink_sse200.cfg esi32xx.cfg lpc3250.cfg stm32g0x.cfg
armada370.cfg exynos5250.cfg lpc40xx.cfg stm32g0x_alt.cfg
at32ap7000.cfg faux.cfg lpc4350.cfg stm32g4x.cfg
at91r40008.cfg feroceon.cfg lpc4357.cfg stm32g4x_alt.cfg
at91rm9200.cfg fm3.cfg lpc4370.cfg stm32h7x.cfg
at91sam3ax_4x.cfg fm4.cfg lpc546xx.cfg stm32h7x_dual_bank.cfg
at91sam3ax_8x.cfg fm4_mb9bf.cfg lpc55sxx.cfg stm32h7x_dual_core.cfg
at91sam3ax_xx.cfg fm4_s6e2cc.cfg lpc84x.cfg stm32l0.cfg
at91sam3nXX.cfg gd32e23x.cfg lpc8nxx.cfg stm32l0_dual_bank.cfg
at91sam3sXX.cfg gd32vf103.cfg lpc8xx.cfg stm32l1.cfg
at91sam3u1c.cfg gp326xxxa.cfg ls1012a.cfg stm32l1x_dual_bank.cfg
at91sam3u1e.cfg hi3798.cfg marvell/ stm32l4x.cfg
at91sam3u2c.cfg hi6220.cfg max32620.cfg stm32l5x.cfg
at91sam3u2e.cfg hilscher_netx10.cfg max32625.cfg stm32mp15x.cfg
at91sam3u4c.cfg hilscher_netx50.cfg max3263x.cfg stm32u5x.cfg
at91sam3u4e.cfg hilscher_netx500.cfg mc13224v.cfg stm32w108xx.cfg
at91sam3uxx.cfg icepick.cfg mdr32f9q2i.cfg stm32wbx.cfg
at91sam3XXX.cfg imx.cfg nds32v2.cfg stm32wlx.cfg
at91sam4c32x.cfg imx21.cfg nds32v3.cfg stm32xl.cfg
at91sam4cXXX.cfg imx25.cfg nds32v3m.cfg stm8l.cfg
at91sam4lXX.cfg imx27.cfg nds32v5.cfg stm8l152.cfg
at91sam4sd32x.cfg imx28.cfg nhs31xx.cfg stm8s.cfg
at91sam4sXX.cfg imx31.cfg npcx.cfg stm8s003.cfg
at91sam4XXX.cfg imx35.cfg nrf51.cfg stm8s103.cfg
at91sam7a2.cfg imx51.cfg nrf52.cfg stm8s105.cfg
at91sam7se512.cfg imx53.cfg nuc910.cfg str710.cfg
at91sam7sx.cfg imx6.cfg numicro.cfg str730.cfg
at91sam7x256.cfg imx6_dual.cfg omap2420.cfg str750.cfg
at91sam7x512.cfg imx6_quad.cfg omap3530.cfg str912.cfg
at91sam9.cfg imx6sx.cfg omap4430.cfg swj-dp.tcl
at91sam9260.cfg imx6ul.cfg omap4460.cfg swj-dp-legacy.tcl
at91sam9260_ext_RAM_ext_flash.cfg imx7.cfg omap5912.cfg swm050.cfg
at91sam9261.cfg imx7ulp.cfg omapl138.cfg test_reset_syntax_error.cfg
at91sam9263.cfg imx8m.cfg or1k.cfg test_syntax_error.cfg
at91sam9g10.cfg imx8qm.cfg pic32mm.cfg ti_calypso.cfg
at91sam9g20.cfg imxrt.cfg pic32mx.cfg ti_cc13x0.cfg
at91sam9g45.cfg infineon/ psoc4.cfg ti_cc13x2.cfg
at91sam9rl.cfg is5114.cfg psoc5lp.cfg ti_cc26x0.cfg
at91sama5d2.cfg ixp42x.cfg psoc6.cfg ti_cc26x2.cfg
at91samdXX.cfg k1921vk01t.cfg pxa255.cfg ti_cc3220sf.cfg
at91samg5x.cfg k40.cfg pxa270.cfg ti_cc32xx.cfg
atheros_ar2313.cfg k60.cfg pxa3xx.cfg ti_dm355.cfg
atheros_ar2315.cfg ke02.cfg qualcomm_qca4531.cfg ti_dm365.cfg
atheros_ar9331.cfg ke04.cfg quark_d20xx.cfg ti_dm6446.cfg
atheros_ar9344.cfg ke06.cfg quark_x10xx.cfg ti_k3.cfg
atmega128.cfg ke0x.cfg raspberry.cfg ti_msp432.cfg
atmega128rfa1.cfg ke1xf.cfg raspberrypi2.cfg ti_rm4x.cfg
atsame5x.cfg ke1xz.cfg raspberrypi3.cfg ti_tms570.cfg
atsaml1x.cfg kex.cfg raspberrypi3_single.cfg ti_tms570ls1224.cfg
atsamv.cfg kinetis_128k.cfg readme.txt ti_tms570ls20xxx.cfg
avr32.cfg kinetis_1m.cfg renesas_r7s72100.cfg ti_tms570ls3137.cfg
bcm2711.cfg kinetis_256k.cfg renesas_rcar_gen2.cfg ti-ar7.cfg
bcm281xx.cfg kinetis_32k.cfg renesas_rcar_gen3.cfg ti-cjtag.cfg
bcm2835.cfg kinetis_512k.cfg renesas_rcar_reset_common.cfg tmpa900.cfg
bcm2836.cfg kinetis_64k.cfg renesas_rz_g2.cfg tmpa910.cfg
bcm2837.cfg kinetis_generic.cfg renesas_s7g2.cfg tnetc4401.cfg
bcm4706.cfg kl25.cfg rk3308.cfg u8500.cfg
bcm4718.cfg kl46.cfg rk3399.cfg vybrid_vf6xx.cfg
bcm47xx.cfg klx.cfg rm57x.cfg xilinx_zynqmp.cfg
bcm5352e.cfg ks869x.cfg rp2040.cfg xmc1xxx.cfg
bcm6348.cfg kx.cfg rp2040-core0.cfg xmc4xxx.cfg
bluefield.cfg lpc11xx.cfg rs14100.cfg xmos_xs1-xau8a-10_arm.cfg
bluenrg-lp.cfg lpc12xx.cfg samsung_s3c2410.cfg zynq_7000.cfg

这里以 STM32L0STM32F1STM32F4 系列微控制器为例,需要分别使用到如下几条 OpenOCD 命令:

1
2
3
openocd.exe -f interface\cmsis-dap.cfg -f target\stm32l0.cfg
openocd.exe -f interface\cmsis-dap.cfg -f target\stm32f1x.cfg
openocd.exe -f interface\cmsis-dap.cfg -f target\stm32f4x.cfg

接下来以 STM32L051K8U6 微控制器为例,正确执行 OpenOCD 命令之后的效果如下所示,命令行会提示当前提供的 GDB 服务端口为 3333

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
λ openocd.exe -f interface\cmsis-dap.cfg -f target\stm32l0.cfg

Open On-Chip Debugger 0.11.0 (2021-11-18) [https://github.com/sysprogs/openocd]
Licensed under GNU GPL v2
libusb1 09e75e98b4d9ea7909e8837b7a3f00dda4589dc3
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "swd". To override use 'transport select <transport>'.
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Warn : could not read product string for device 0x058f:0x9540: Entity not found
Info : CMSIS-DAP: SWD supported
Info : CMSIS-DAP: JTAG supported
Info : CMSIS-DAP: FW Version = 1.0
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 1 TDO = 1 nTRST = 0 nRESET = 0
Info : CMSIS-DAP: Interface ready
Info : clock speed 300 kHz
Info : SWD DPIDR 0x0bc11477
Info : stm32l0.cpu: Cortex-M0+ r0p1 processor detected
Info : stm32l0.cpu: target has 4 breakpoints, 2 watchpoints
Info : starting gdb server for stm32l0.cpu on 3333
Info : Listening on port 3333 for gdb connections

简便起见,也可以将上述命令保存为 Windows 系统下面一个名为 OpenOCD stm32l0.bat 的批处理文件,方便调试的时候快速进行调用:

1
2
3
echo Openocd Runing ... ... ...
openocd.exe -f interface\cmsis-dap.cfg -f target\stm32l0.cfg
pause

配置 STM32CubeIDE

启动 OpenOCD 服务之后,接着在 STM32CubeIDE 当中新建一个名称叫做 Test-STM32L051K8U6 的工程:

首先,选中 STM32CubeIDE 左侧的工程名称,点击鼠标右键菜单上的 【Build Project】, 编译生成出一个 Test-STM32L051K8U6.elf 二进制文件。点击工具栏上【Debug】图标右侧的箭头,点击弹出菜单上的 Debug Configrations... 打开调试配置窗口,鼠标双击窗口上的 GDB Hardware Debugging 新建一条名为 Test-STM32L051K8U6 Debug 的 GDB 硬件调试配置,并在自动打开的【Main】选项卡界面进行如下一系列配置:

切换至【Debugger】选项卡,将 GDB 命令修改为 D:\Software\Tech\ARMEabi\bin\arm-none-eabi-gdb.exe,并且将连接地址设置为 localhost:3333

经过上述步骤的配置,鼠标点击【Debug】按钮,就已经可以让 STM32CubeIDE 通过 UINIO-DAPLink 实现固件的烧录下载,如果需要进入单步调试模式,则可以在【Startup】选项卡当中,手动在 main 函数位置设置一个断点:

以 External Tools 方式使用

首先,需要在 STM32CubeIDEExternal Tool 当中添加 OpenOCD,依次点击顶部菜单栏当中的 【RUN -> External Tools -> External Tools Configrations...】,新建一个名称为 Test-STM32L051K8U6 Run 的配置,并且将 OpenOCD 命令所在的位置指定为 D:\Software\Tech\ARMEabi\OpenOCD\bin\openocd.exe,相应的参数设置为 -f interface\cmsis-dap.cfg -f target\stm32l0.cfg

打开 STM32CubeIDEDebugger Configration 窗口,鼠标双击左侧的【Launch Group】新建一个名为 UINIO-DAPLink运行组,然后点击右侧的【Add...】按钮:

此时添加的执行配置策略为:首先执行 OpenOCD 命令开启 GDB 服务,然后再通过 arm-none-eabi-gdb 执行调试任务。

最后,配置完成之后的 Launch Group 顺序如下图所示:

接下来,就可以在 STM32CubeIDE 顶部工具栏上【Run】和【Debug】按钮的下面,发现上面的配置的 UINIO-DAPLink 运行组,点击之后就可以愉快的使用 UINIO-DAPLink 执行 STM32 微控制器的程序调试工作了。

本节内容将会基于 UINIO-MCU-GD32F350RBT6 核心板,新建一个名称为 testKeil µVision 工程,并且点击菜单栏上的 【Options for target】->【Device】,选择当前编译的目标设备为 GD32F350RB

接下来,再点击弹出的 【Manage Run-Time Environment】 界面上的 OK 按钮,完成测试工程的建立:

再次打开 【Options for target】,鼠标选择 【Output】 选项卡,勾选 Create HEX File 选项之后,在 Name of Executable 当中把待下载的二进制文件添加上 .hex 后缀名称(否则 Keil µVision 会默认下载 .axf 后缀的二进制文件):

紧接着打开 【Debug】 选项卡,选择 CMSIS-DAP Debugger,并且点击 【Settings】 按钮:

在弹出的对话框中,选择 UINIO-CMSIS-DAP(需要提前将 UINIO-DAPLink 连接到电脑的 USB 端口):

再打开对话框上的 【Flash Download】 选项卡,勾选 Reset and Run 之后,点击 【Add】 按钮添加片上的 Flash 编程算法

至此就完成了 UINIO-DAPLinkKeil µVision 当中的全部配置,接下来就可以添加官方的 ARM 标准库,愉快的编写并且下载工程代码了。

通过 Keil µVision 直接下载 HEX

如果需要直接烧录已经编译过的 .hex 固件(例如下载 UINIO-DAPLink 当中 Firmware 目录下的 stm32f103xb_bl.hex),可以按照前一小节内容所述的步骤,建立一个名为 testKeil µVision 工程,并将需要下载的 .hex 文件拷贝至其 Objects 目录当中,接着在 【Options for target】->【Output】 选项卡下面的 Name of Executable 输入框当中,填入当前需要下载的 .hex 文件完整名称(下图以 stm32f103xb_bl.hex 为例):

注意:通过上述界面当中的 【Select Folder Objects...】 按钮,还可以指定除了 Objects 之外其它包含有 .hex 固件的目录。

然后,就可以点击 Keil µVision 顶部工具栏上的 【Download】 按钮,或者直接按下快捷键 【F8】,就可以将上面指定的 .hex 文件下载至目标 ARM 芯片当中:

注意:新建的 Keil µVision 工程必须参考前面的步骤,配置好目标芯片的型号以及片上 Flash 的编程算法。

ARM 调试工具 UINIO-DAPLink 应用详解

http://www.uinio.com/Project/UINIO-DAPLink/

作者

Hank

发布于

2023-01-22

更新于

2024-09-22

许可协议