linux怎么使用正点原子无线dap烧录器

CLion + OpenOCD + CMSIS-DAP 配置记录

本文档针对当前工程 stm32_px4_rtos,目标板为 STM32F103,调试器为 ATK-HS-V3-CMSIS-DAP

1. 先说结论

这个调试器不是按 OpenOCD 0.11 默认偏好的 bulk 端点工作,而是走 HID 端点。

因此有两个关键点:

  1. OpenOCD 建议使用 0.12.0 或更高版本。
  2. 配置里必须显式指定 cmsis_dap_backend hid

本工程已经提供了可直接使用的 OpenOCD 配置文件:

openocd/stm32f103-cmsis-dap.cfg

内容如下:

cfg 复制代码
source [find interface/cmsis-dap.cfg]

cmsis_dap_vid_pid 0x04d8 0x00df
cmsis_dap_backend hid

transport select swd
adapter speed 1000

source [find target/stm32f1x.cfg]

2. 当前工程里的关键路径

  • OpenOCD 配置文件:openocd/stm32f103-cmsis-dap.cfg
  • 调试 ELF:build/Debug/stm32_px4_rtos.elf
  • CMake preset:Debug
  • GDB:arm-none-eabi-gdb

先构建:

bash 复制代码
cmake --preset Debug
cmake --build --preset Debug

3. 安装 OpenOCD

3.1 不建议继续用 0.11.0

如果你看到下面这种情况,基本就是版本太老:

text 复制代码
Error: unable to find a matching CMSIS-DAP device

或者:

text 复制代码
invalid command name "cmsis_dap_backend"

这说明当前 OpenOCD 版本太旧,不能正确处理这个 HID 型 CMSIS-DAP 设备。

3.2 Ubuntu 不同版本的区别

针对 ATK-HS-V3-CMSIS-DAP 这类 HID 型 CMSIS-DAP,Ubuntu 版本的关键区别主要是系统仓库里的 OpenOCD 版本。

根据 Ubuntu 包信息:

  • Ubuntu 20.04 Focal:openocd 0.10.0-6build1
  • Ubuntu 22.04 Jammy:openocd 0.11.0-1
  • Ubuntu 24.04 Noble:openocd 0.12.0-1build2

结论可以直接这么看:

  1. Ubuntu 20.04:太旧,不建议直接用系统包。
  2. Ubuntu 22.04:默认还是 0.11.0,大概率会卡在你现在这个问题上。
  3. Ubuntu 24.04:系统仓库通常已经是 0.12.0,多数情况下直接 apt install openocd 就够了。

对这块 DAP 来说,真正的分界线不是 Ubuntu 名字本身,而是 OpenOCD 有没有到 0.12.0+,以及配置里有没有 cmsis_dap_backend hid

3.3 依赖安装

bash 复制代码
sudo apt update
sudo apt install build-essential libtool pkg-config autoconf automake texinfo \
  libusb-1.0-0-dev libhidapi-dev libftdi1-dev libcapstone-dev \
  libjaylink-dev libgpiod-dev

3.4 用本工程脚本安装

本工程已经提供了安装脚本:

tools/install_openocd_0.12.0.sh

脚本默认行为:

  • 安装版本:v0.12.0
  • 安装目录:$HOME/.local/openocd
  • 源码缓存目录:$HOME/.cache/openocd-src
  • 自动安装依赖
  • 自动下载源码、编译并安装

直接执行:

bash 复制代码
cd /home/sg/SG/stm32_px4_rtos_db
./tools/install_openocd_0.12.0.sh

安装完成后,OpenOCD 在这里:

bash 复制代码
$HOME/.local/openocd/bin/openocd

检查版本:

bash 复制代码
$HOME/.local/openocd/bin/openocd --version

如果想让 CLion 和终端都优先使用这个版本,可以把它加到 PATH

bash 复制代码
export PATH="$HOME/.local/openocd/bin:$PATH"

如果要长期生效,把上面这行追加到 ~/.bashrc

3.5 脚本的常见用法

3.5.1 默认安装
bash 复制代码
./tools/install_openocd_0.12.0.sh
3.5.2 指定安装目录
bash 复制代码
INSTALL_PREFIX="$HOME/opt/openocd-0.12.0" ./tools/install_openocd_0.12.0.sh
3.5.3 指定国内镜像或自定义下载地址
bash 复制代码
OPENOCD_ARCHIVE_URL="https://ghproxy.com/https://github.com/openocd-org/openocd/releases/download/v0.12.0/openocd-0.12.0.tar.gz" \
./tools/install_openocd_0.12.0.sh
3.5.4 指定其他版本
bash 复制代码
OPENOCD_VERSION="v0.12.0" ./tools/install_openocd_0.12.0.sh

这个脚本虽然名字写的是 0.12.0,但它本身支持通过环境变量覆盖版本号。

3.6 脚本安装后怎么用

安装完成后,推荐直接用脚本安装出来的 OpenOCD 跑本工程配置:

bash 复制代码
$HOME/.local/openocd/bin/openocd \
  -f /home/sg/SG/stm32_px4_rtos_db/openocd/stm32f103-cmsis-dap.cfg

烧录当前工程:

bash 复制代码
$HOME/.local/openocd/bin/openocd \
  -f /home/sg/SG/stm32_px4_rtos_db/openocd/stm32f103-cmsis-dap.cfg \
  -c "program /home/sg/SG/stm32_px4_rtos_db/build/Debug/stm32_px4_rtos.elf verify reset exit"

CLion 里如果不想依赖系统自带的旧版本,OpenOCD executable 就填:

text 复制代码
/home/sg/.local/openocd/bin/openocd

3.7 手动源码编译

如果你是 git clone 下来的源码,不要跳过子模块和 bootstrap

bash 复制代码
git submodule update --init --recursive
./bootstrap
./configure --enable-cmsis-dap
make -j"$(nproc)"
sudo make install

安装后检查版本:

bash 复制代码
openocd --version

建议至少是 0.12.0

3.8 国内网络慢时

如果 GitHub 很慢,可以换成这两种思路:

  1. 用镜像仓库拉取源码,再执行同样的 submodulebootstrapconfiguremake
  2. 直接下载 release 源码压缩包,再在解压目录里执行 ./bootstrap./configure --enable-cmsis-dapmake

注意:

  • 如果只执行了 ./configure,但没先跑 ./bootstrap,通常会缺 jimtcl
  • 如果是 git clone 的源码,但没拉子模块,也会在 configure 阶段失败。
  • 如果你已经用了本工程的 tools/install_openocd_0.12.0.sh,优先给它传 OPENOCD_ARCHIVE_URL,比手动折腾更省事。

4. Linux 下权限

如果 OpenOCD 已经升级,但普通用户仍然打不开 USB 设备,再加 udev 规则。

ATK-HS-V3-CMSIS-DAP 的 VID/PID 是 04d8:00df

bash 复制代码
sudo tee /etc/udev/rules.d/99-openocd.rules <<'EOF'
SUBSYSTEM=="usb", ATTR{idVendor}=="04d8", ATTR{idProduct}=="00df", MODE="666"
EOF

sudo udevadm control --reload-rules
sudo udevadm trigger

重新插拔调试器后再试。

4.1 这次实际遇到的问题:被 mcp2200 错绑

这次排查里,真正的根因不是:

  • OpenOCD 语法写错
  • 板子没插好
  • cmsis_dap_backend hid 没配置

而是 Linux 把 ATK-HS-V3-CMSIS-DAP 的 HID 接口错误地绑定到了 mcp2200 驱动。

现象是:

  1. lsusb 能看到设备:
text 复制代码
04d8:00df Microchip Technology, Inc. ATK-HS-V3-CMSIS-DAP
  1. OpenOCD 0.12.0 也已经安装好了。
  2. 配置文件里也已经显式写了:
cfg 复制代码
cmsis_dap_vid_pid 0x04d8 0x00df
cmsis_dap_backend hid
  1. 但仍然报:
text 复制代码
Error: unable to find a matching CMSIS-DAP device

继续往下查 /sys/bus/hid/devices 后可以看到类似:

text 复制代码
DRIVER=mcp2200
HID_NAME=ATK ATK-HS-V3-CMSIS-DAP

这说明系统把这个设备当成了 MCP2200 相关设备,而不是交给 hid-generic

4.2 为什么会这样

ATK-HS-V3-CMSIS-DAP 的 USB VID/PID 是:

  • VID: 04d8
  • PID: 00df

其中 04d8 是 Microchip 的厂商 ID。

Linux 内核里的 mcp2200 / hid_mcp2200 驱动会匹配到这类设备,于是把这只本来应该给 OpenOCD cmsis-dap hid 使用的 HID 接口抢走。

一旦被它抢走,会出现两个直接后果:

  1. OpenOCD 虽然能在 lsusb 层面看到设备,但无法把它当成 CMSIS-DAP HID 正常打开。
  2. 设备不会按预期暴露为 hidraw 供用户态调试工具访问,或者即使暴露流程存在,也不是 OpenOCD 想要的那条路径。

所以这个问题的本质不是"OpenOCD 不支持正点原子",而是"Linux 把正点原子这只 DAP 绑到了错误驱动上"。

4.3 怎么确认是不是这个问题

先查 USB 是否存在:

bash 复制代码
lsusb | grep 04d8:00df

如果能看到:

text 复制代码
ATK-HS-V3-CMSIS-DAP

再查 HID 设备绑定到了谁:

bash 复制代码
udevadm info -q property -p /sys/bus/hid/devices/0003:04D8:00DF.xxxx

或者自动找:

bash 复制代码
for d in /sys/bus/hid/devices/*; do
  if [ -f "$d/modalias" ] && grep -q 'v000004D8p000000DF' "$d/modalias"; then
    echo "HID node: $(basename "$d")"
    udevadm info -q property -p "$d"
  fi
done

如果输出里有:

text 复制代码
DRIVER=mcp2200

那就说明已经命中这个问题。

4.4 临时解决方案

先把错误驱动解绑,再强制改用 hid-generic

本工程已经提供了脚本:

tools/fix_atk_dap_hid_binding.sh

它会自动:

  1. 查找当前 04D8:00DF 的 HID 节点
  2. 如果当前驱动是 mcp2200,先解绑
  3. 优先通过 driver_override 强制绑定 hid-generic
  4. 打印当前驱动和 hidraw 节点

执行:

bash 复制代码
cd /home/sg/SG/stm32_px4_rtos_db
./tools/fix_atk_dap_hid_binding.sh

修复后再测试:

bash 复制代码
./tools/openocd.sh -f openocd/stm32f103-cmsis-dap.cfg

4.5 手动修复命令

如果你不想走脚本,可以手工执行。建议用自动发现 HID 节点的方式,而不要手写 .0019.001B 这类编号,因为它每次重插都可能变化。

bash 复制代码
HID_ID=$(for d in /sys/bus/hid/devices/*; do
  [ -f "$d/modalias" ] && grep -q 'v000004D8p000000DF' "$d/modalias" && basename "$d" && break
done)

echo "HID_ID=$HID_ID"

sudo bash -c "
if [ -e /sys/bus/hid/drivers/mcp2200/\$HID_ID ]; then
  echo \$HID_ID > /sys/bus/hid/drivers/mcp2200/unbind
fi
echo hid-generic > /sys/bus/hid/devices/\$HID_ID/driver_override
echo \$HID_ID > /sys/bus/hid/drivers_probe
"

然后检查:

bash 复制代码
readlink -f /sys/bus/hid/devices/$HID_ID/driver
find /sys/bus/hid/devices/$HID_ID -maxdepth 3 -type d -name 'hidraw*'

预期结果:

  1. 驱动从 mcp2200 变成 hid-generic
  2. 能看到对应的 hidraw 节点

4.6 永久解决方案

如果确认这只 DAP 长期都应该给 OpenOCD 使用,而不是给 mcp2200 驱动使用,那么更稳妥的做法是直接禁止这个错误驱动自动抢占。

可以先临时卸载:

bash 复制代码
sudo modprobe -r hid_mcp2200

如果确认没有副作用,再做永久黑名单:

bash 复制代码
echo 'blacklist hid_mcp2200' | sudo tee /etc/modprobe.d/blacklist-hid_mcp2200.conf
sudo update-initramfs -u

然后重新插拔 DAP,或者重启。

4.7 这个修复会不会影响烧录

不会直接影响目标板 STM32 / PX4 的 Flash 内容。

这里修复的是:

  • 主机侧 Linux 对 ATK-HS-V3-CMSIS-DAP 这只调试器的驱动绑定

不是:

  • 目标板上的固件
  • OpenOCD 的烧录数据
  • STM32 的 Flash 内容

需要注意的是,这个探针本身同时还带有别的 USB 接口,例如:

  • cdc_acm 虚拟串口接口
  • HID 接口

这次处理的只是其中的 HID 接口,让它回到 CMSIS-DAP 应该走的 hid-generic 路径。对 SWD 烧录/调试是修复,不是破坏。

4.8 推荐排查顺序

针对 ATK-HS-V3-CMSIS-DAP,推荐按这个顺序排查:

  1. openocd --version 是否已经到 0.12.0+
  2. 配置里是否显式写了 cmsis_dap_backend hid
  3. lsusb | grep 04d8:00df 是否能看到设备
  4. 是否加过 udev 权限规则
  5. /sys/bus/hid/devices/... 当前驱动是不是 mcp2200

很多时候第 1 到第 4 步都没问题,最后仍然失败,真正原因就是第 5 步。

5. 命令行验证

先确认设备在线:

bash 复制代码
lsusb

应能看到类似:

text 复制代码
ID 04d8:00df Microchip Technology, Inc. ATK-HS-V3-CMSIS-DAP

再直接用本工程的配置文件测试:

bash 复制代码
openocd -f openocd/stm32f103-cmsis-dap.cfg

如果只是想烧录当前 Debug ELF:

bash 复制代码
openocd -f openocd/stm32f103-cmsis-dap.cfg \
  -c "program build/Debug/stm32_px4_rtos.elf verify reset exit"

6. 在 CLion 里配置

下面按本工程实际路径来填。

6.1 Toolchain / CMake

先确保 CLion 能正常构建工程:

  1. 打开 Settings | Build, Execution, Deployment | Toolchains
  2. C Compiler / C++ Compiler 走你的 ARM 工具链
  3. GDB 填 arm-none-eabi-gdb
  4. 打开 Settings | Build, Execution, Deployment | CMake
  5. 选择 Debug preset,或者保证构建目录为 build/Debug

如果 build/Debug/stm32_px4_rtos.elf 没生成,后面的调试配置都不会工作。

6.2 推荐方式:用 OpenOCD 作为 GDB Server

在 CLion 新建一个基于 OpenOCD 的嵌入式调试配置,核心信息如下:

  • Executable / Binary:$ProjectFileDir$/build/Debug/stm32_px4_rtos.elf
  • GDB:arm-none-eabi-gdb
  • OpenOCD executable:你的 openocd 可执行文件路径
  • OpenOCD arguments:-f $ProjectFileDir$/openocd/stm32f103-cmsis-dap.cfg

如果界面里有这些选项,建议同时开启:

  • Download executable
  • Reset / Halt after connect

调试时的典型流程是:

  1. CLion 先启动 OpenOCD
  2. OpenOCD 加载 openocd/stm32f103-cmsis-dap.cfg
  3. GDB 连接 OpenOCD
  4. 下载 build/Debug/stm32_px4_rtos.elf
  5. main 或断点处停住

6.3 如果你的 CLion 没有现成 OpenOCD 模板

可以退一步,用"手动启动 OpenOCD + GDB Remote Debug"的方式:

先在终端启动:

bash 复制代码
openocd -f /home/sg/SG/stm32_px4_rtos_db/openocd/stm32f103-cmsis-dap.cfg

然后在 CLion 里建一个远程 GDB 调试配置:

  • Symbol file:/home/sg/SG/stm32_px4_rtos_db/build/Debug/stm32_px4_rtos.elf
  • GDB:arm-none-eabi-gdb
  • Target remote:localhost:3333

常用初始化命令可填:

gdb 复制代码
monitor reset halt
load
monitor reset halt

7. 推荐的 CLion 调试参数

如果 CLion 支持 GDB 启动命令,常用这一组就够了:

gdb 复制代码
monitor reset halt
load
monitor reset halt

开始运行时:

gdb 复制代码
continue

如果只想连接,不重新下载程序,可以去掉 load

8. 常见报错对照

8.1 unable to find a matching CMSIS-DAP device

优先检查:

  1. OpenOCD 是否还是 0.11.0
  2. 配置里是否缺了 cmsis_dap_backend hid
  3. lsusb 是否能看到 04d8:00df
  4. 是否用了错误的接口文件,比如把 CMSIS-DAP 当成 ST-Link

8.2 invalid command name "cmsis_dap_backend"

说明 OpenOCD 太旧,升级到 0.12.0+

8.3 jimtcl is required but not found

说明源码构建步骤不完整,通常是:

  1. 没执行 git submodule update --init --recursive
  2. 没执行 ./bootstrap

9. 本工程建议

这个工程里建议统一使用:

  • OpenOCD 配置:openocd/stm32f103-cmsis-dap.cfg
  • 调试 ELF:build/Debug/stm32_px4_rtos.elf
  • GDB:arm-none-eabi-gdb

不建议继续使用根目录那个 daplink.cfg 作为主配置文件,因为它当前内容不适合这个 STM32F103 工程,也没有显式处理 ATK-HS-V3 的 HID 后端。

相关推荐
coward911 小时前
Linux 内核 KGDB 以及内核驱动单串口调试笔记:telnet + agent-proxy + gdb-multiarch 实践
linux·单片机·嵌入式硬件
念一不念二1 小时前
VScode+云服务器
运维·服务器
vortex51 小时前
Kali Linux 磁盘扩容后内部分配完整教程
linux·运维
刻BITTER2 小时前
VirtualBox 安装Armbian x86 虚拟机
linux·嵌入式硬件
想唱rap2 小时前
应用层协议与序列化
linux·运维·服务器·网络·数据结构·c++·算法
苏宸啊2 小时前
linux进程控制(一)
linux
开开心心_Every2 小时前
轻量级PDF阅读器,仅几M大小打开秒开
linux·运维·服务器·安全·macos·pdf·phpstorm
云达闲人2 小时前
搭建DevOps企业级仿真实验环境:006Proxmox 基础环境验证
运维·devops·proxmox ve·sre·仿真实验环境·快照与克隆·运维实操教程
the_fat_bird2 小时前
ubuntu install nvidia gpu driver
linux·运维·ubuntu