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 国际标准)以及5V
和 3.3V
电源,并且附带有 SWD 至 JTAG 转接板的
PCB 设计,而固件部分则是基于 ARM
官方的最新的原版固件移植而来,全部的原理图与固件程序都已经开源在 GitHub。
DAP Link 简介
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 的固件完全兼容:
- 恩智浦 MCU-LINK,基于 LPC55xx 主控;
- 新唐 Nu-Link2-Me,基于 M48SSIDAE 主控;
- 美信 MAX32625PICO,基于 MAX32625 主控;
- Segger J-Link OB,基于 Atmel SAM3U 主控芯片;
- 意法半导体 ST-LINK/V2,基于 STM32F103CB 主控;
- 恩智浦 OpenSDA,基于 K20, K22, KL26Z 和 KL27Z 主控;
- 恩智浦 LPC-Link2 based,基于 LPC11U35 或者 LPC4322 主控;
DAPLink 主要提供了拖放编程、串口通信、调试三种主要功能:
- 拖拽烧录:通过将
.bin
或者.hex
格式的文件复制或者保存到 DAPLink 驱动器,从而实现对目标微控制器的编程。完成以后,驱动器将会重新进行挂载。如果下载出现问题,则驱动器上将会自动生成一个包含有故障信息的FAIL.TXT
文件; - 串口通信:可以直接与目标 MCU
微控制器进行双向串行通信,支持
9600
、14400
、19200
、28800
、38400
、56000
、57600
、115200
等常用波特率; - 下载调试:可以使用任意支持 CMSIS-DAP 协议的 IDE 集成开发环境进行调试,例如 pyOCD、uVision、IAR;
更新设备固件时,只需要连接上 USB 并且按住重置键,让设备进入
Bootloader
引导模式,从而开始下载固件。如果下载成功,那么设备将会离开引导模式,并且开始运行新的固件。如果下载失败,则设备将会自动生成显示有错误信息的
FAIL.TXT
文件。
编译 DAPLink 工程
DAPLink 的固件源代码,使用开源项目构建工具 project-generator
提供的 progen
命令进行构建。除此之外,在编译过程当中还需要使用到如下一系列工具软件:
- 安装 Git 并将其加入环境变量;
- 安装 Python 3 并将其加入环境变量;
- 安装相关的编译器,可以选择标识为
gcc_arm
的 GNU ARM Embedded Toolchain 、标识为armclang
的 ARM Compiler 6,以及标识为armcc
的 Keil MDK 或者 ARM Compiler 5 编译器,它们当中的大部分都只支持 Linux 和 Windows 操作系统环境; - 安装 GNU Make 构建工具,可以组合使用 CMake 以及 ninja;
- 通过
pip Install virtualenv
命令全局安装 Python 虚拟环境virtualenv
;
准备虚拟环境
首先,需要去克隆 DAPLink 托管在 Github 上面的开源工程,并且创建出一个 Python 虚拟环境:
1 | $ git clone https://github.com/mbedmicro/DAPLink |
如果当前使用的是 DAPLink 的指定 Release 版本,当把这些版本下载至本地以后,为了避免后续编译过程当中报错,需要将其初始化为一个 Git 工程项目:
1 | $ git init |
接下来,就可以激活 Python 虚拟环境,并且更新 DAPLink 开源工程相关的第三方依赖库:
1 | $ venv/Scripts/activate (For Linux) |
除此之外,还需要再额外全局安装 intelhex
和
pyelftools
两个 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_arm
、make_armclang
、make_armcc
、cmake_gcc_arm
、cmake_armclang
、cmake_armcc
;--clean
: 清除现有的编译结果,并且强制重新编译所有文件;-v
: 列出详细信息,该选项会延长编译运行时间;--parallel
: 启用并行编译,加快编译速度;<project>
: 等待编译的目标工程,如果缺省将会编译全部工程;
通过执行下面的命令,可以在 projectfiles/uvision
目录下面生成一系列的 Keil µVision 工程:
1 | (venv) $ progen generate -t uvision |
当然也可以使用下面这条命令,只生成 stm32f103xb_bl
和
stm32f103xb_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 5
由于当前 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 工程:
开始下载 DAPLink 固件
当使用 progen
执行完成项目构建之后,就会自动在
DAPLink 工程的 projectfiles\uvision
目录下面生成如下两个 Keil µVision 工程:
stm32f103xb_bl
目录:DAPLink 的 Bootloader 工程,编译后得到stm32f103xb_bl.hex
。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 源文件
首先,打开 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 |
然后,再打开 DAPLink\source\hic_hal\stm32\stm32f103xb
目录下的 IO_Config.h
头文件,根据当前
UINIO-DAPLink 的引脚连接关系进行如下一系列配置:
1 |
|
拖拽方式升级 DAPLink 固件
UINIO-DAPLink 调试器采用意法半导体
STM32F103C8T6
作为主控芯片,片上 Flash
的容量为 64KB
。在之前所述的步骤当中,已经为其烧录了
stm32f103xb_bl.hex
作为
Bootloader,因而支持通过拖拽方式升级快速升级
Interface 固件
stm32f103xb_stm32f103rb_if.hex
,具体操作步骤如下所示:
- 使用杜邦线将 UINIO-DAPLink 调试器的
nRST
和GND
针脚进行短接。 - 将 UINIO-DAPLink 连接到电脑,资源管理器出现
MAINTENANCE
盘符。 - 此时可以把
nRST
和GND
引脚的杜邦线连接断开。 - 将新版本固件拖动至
MAINTENANCE
盘符,等待 UINIO-DAPLink 自动更新固件。 - 如果 Windows 操作系统的资源管理器出现
DAPLINK
盘符,就表示已经升级成功。
在 STM32CubeIDE 使用 DAPLink
在接下来的内容里,将会基于我所制作的 UINIO-MCU-STM32L051K8 核心板,在意法半导体提供的最新版本 STM32CubeIDE 当中,实现固件的烧录与调试。
安装 arm-eabi 工具链
在 STM32CubeIDE 当中运用 DAPLink 调试与下载程序,需要使用到 ARM 嵌入式应用程序二进制接口,也就是 ARM EABI。包括了 Windows Toolchain for ARM 和 OpenOCD 两个工具库:
- 首先,需要调用
openocd.exe
开启一个连接到 DAP-Link 与目标微控制器的 GDB 调试服务; - 然后,STM32CubeIDE 就可以通过
arm-none-eabi-gdb.exe
访问这个 GDB 服务;
下载并且解压上述两个工具库之后,分别将它们的 bin
目录添加到操作系统的环境变量,再分别执行如下两个命令,测试其是否已经正确的被安装:
1 | λ openocd |
1 | λ arm-none-eabi-gdb |
以命令行方式进行调用
配置 OpenOCD
OpenOCD 命令的调用格式如下面的代码所示,其中的 -f
参数表示当前使用的是配置文件:
1 | openocd.exe -f interface\调试器接口配置文件 -f target\目标微控制器配置文件 |
下面列出了 OpenOCD\share\openocd\scripts\interface
目录下的所有配置文件,由于这里使用的是 DAP-Link
作为调试器,所以通常都是以 cmsis-dap.cfg
作为参数:
1 | λ ls OpenOCD\share\openocd\scripts\interface |
接下来例出的是 OpenOCD\share\openocd\scripts\target
目录下的全部配置文件,这里需要根据目标 MCU
微控制器的型号,酌情选择相应的配置文件作为参数:
1 | λ ls OpenOCD\share\openocd\scripts\target |
这里以
STM32L0
、STM32F1
、STM32F4
系列微控制器为例,需要分别使用到如下几条 OpenOCD 命令:
1 | openocd.exe -f interface\cmsis-dap.cfg -f target\stm32l0.cfg |
接下来以 STM32L051K8U6
微控制器为例,正确执行 OpenOCD
命令之后的效果如下所示,命令行会提示当前提供的 GDB 服务端口为
3333
:
1 | λ openocd.exe -f interface\cmsis-dap.cfg -f target\stm32l0.cfg |
简便起见,也可以将上述命令保存为 Windows 系统下面一个名为
OpenOCD stm32l0.bat
的批处理文件,方便调试的时候快速进行调用:
1 | echo Openocd Runing ... ... ... |
配置 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 方式使用
首先,需要在 STM32CubeIDE 的 External
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
:
打开 STM32CubeIDE 的 Debugger
Configration 窗口,鼠标双击左侧的【Launch
Group】新建一个名为 UINIO-DAPLink
的运行组,然后点击右侧的【Add...】按钮:
此时添加的执行配置策略为:首先执行 OpenOCD
命令开启 GDB
服务,然后再通过 arm-none-eabi-gdb
执行调试任务。
最后,配置完成之后的 Launch Group 顺序如下图所示:
接下来,就可以在 STM32CubeIDE
顶部工具栏上【Run】和【Debug】按钮的下面,发现上面的配置的
UINIO-DAPLink
运行组,点击之后就可以愉快的使用
UINIO-DAPLink 执行 STM32 微控制器的程序调试工作了。
在 Keil µVision 使用 DAPLink
本节内容将会基于 UINIO-MCU-GD32F350RBT6
核心板,新建一个名称为 test
的 Keil
µ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-DAPLink 在 Keil µVision 当中的全部配置,接下来就可以添加官方的 ARM 标准库,愉快的编写并且下载工程代码了。
通过 Keil µVision 直接下载 HEX
如果需要直接烧录已经编译过的 .hex
固件(例如下载 UINIO-DAPLink 当中
Firmware
目录下的
stm32f103xb_bl.hex
),可以按照前一小节内容所述的步骤,建立一个名为
test
的 Keil µ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 应用详解