Ubuntu下搭建Black Magic Probe (BMP) 编译环境
版本和环境信息如下:
PC平台: Windows 11 专业版
虚拟机运行平台:Oracle VM VirtualBox 7.1.6
Linux虚拟机: Ubuntu24.04
Debug调试器:
BlackMagicProbe(BMP) 开源调试器:WeAct STM32F103CBT6 BluePill 核心板 WeAct STM32F411CEU6 BlackPill 核心板
USB-TO-TTL: USB转TTL串口小板
ARM Linux GDB: arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi.tar.xz
BlackMagicProbe固件:blackmagic-firmware
1. 背景
在学习Zephyr 实时操作系统项目的时候,接触到一款高效又 经济的调试开发神器--Black Magic Probe(BMP)。这是一款专为ARM Cortex微控制器设计的JTAG/SWD探针,其独特的魅力在于内置了GDB服务器,从而允许开发者直接利用强大的GNU Debugger进行远程调试,简化了传统嵌入式开发中的调试流程。
Black Magic Probe之所以能在众多调试工具中脱颖而出,得益于它简洁的设计理念和对开源生态的支持。它需要的开发环境包括一系列标准库,如libbsd-dev, libfontconfig-dev, libgtk-3-dev, libusb-1.0-dev以及glfw-3.3,这些是保证其在Linux系统上无缝运行的基础。通过这样的配置,BMP不仅实现了与硬件的紧密交互,也为开发者提供了图形界面与命令行双重支持,极大地丰富了调试手段。
2. 源码与固件
调试器固件:https://github.com/koendv/blackmagic-firmware (BMP release固件库)
调试器源码:https://github.com/blackmagic-debug/blackmagic (BMP固件与BMDA程序库)
调试器上位机程序:https://github.com/compuphase/Black-Magic-Probe-Book (不太好用)
2.1. 调试器源码编译
2.1.1. 编译器依赖标准库安装
# 依赖标准库
sudo apt-get install -y libbsd-dev libfontconfig-dev libgtk-3-dev libusb-1.0-0 libftdi1 libcapstone4 libgpiod2 libhidapi-hidraw0 libjaylink0 libjim0.79 pkg-config
# STM32烧录工具
# stm32flash ISP烧录工具
# dfu-util USB烧录工具
sudo apt-get install -y dfu-util stm32flash
# 编译所需工具
# 解压GCC工具
tar -xzf arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi.tar.xz -C ~/workspace/zephyr-gdb/arm-gnu-toolchain-14.2/
# 添加ARM工具链到系统路径
export PATH=$HOME/workspace/zephyr-gdb/arm-gnu-toolchain-14.2/bin:$PATH
pip install meson==0.63.0 ninja==1.10.2 -i https://pypi.mirrors.ustc.edu.cn/simple/
2.1.2. 生成编译配置
要构建固件,您需要配置固件将运行的探测硬件,以及要使用的交叉编译工具链。
# 配置固件配置文件
user@desktop:~/workspace/blackmagic/cross-file$ ls -al
total 88
drwxrwxr-x 2 polaris polaris 4096 6月 1 16:39 .
drwxrwxr-x 14 polaris polaris 4096 6月 1 16:42 ..
-rw-rw-r-- 1 polaris polaris 628 6月 1 15:48 96b_carbon.ini
-rw-rw-r-- 1 polaris polaris 443 6月 1 15:48 arm-none-eabi.ini
-rw-rw-r-- 1 polaris polaris 662 6月 1 15:48 blackpill-f401cc.ini
-rw-rw-r-- 1 polaris polaris 662 6月 1 15:48 blackpill-f401ce.ini
-rw-rw-r-- 1 polaris polaris 662 6月 1 15:48 blackpill-f411ce.ini
-rw-rw-r-- 1 polaris polaris 565 6月 1 15:48 bluepill.ini
-rw-rw-r-- 1 polaris polaris 578 6月 1 15:48 ctxlink.ini
-rw-rw-r-- 1 polaris polaris 574 6月 1 15:48 f072.ini
-rw-rw-r-- 1 polaris polaris 612 6月 1 15:48 f3.ini
-rw-rw-r-- 1 polaris polaris 630 6月 1 15:48 f4discovery.ini
-rw-rw-r-- 1 polaris polaris 624 6月 1 15:48 hydrabus.ini
-rw-rw-r-- 1 polaris polaris 636 6月 1 15:48 launchpad-icdi.ini
-rw-rw-r-- 1 polaris polaris 827 6月 1 15:48 native.ini
-rw-rw-r-- 1 polaris polaris 697 6月 1 15:48 native-remote.ini
-rw-rw-r-- 1 polaris polaris 638 6月 1 15:48 native-riscv.ini
-rw-rw-r-- 1 polaris polaris 760 6月 1 15:48 native-st-clones.ini
-rw-rw-r-- 1 polaris polaris 759 6月 1 15:48 native-uncommon.ini
-rw-rw-r-- 1 polaris polaris 615 6月 1 15:48 stlink.ini
-rw-rw-r-- 1 polaris polaris 624 6月 1 15:48 stlinkv3.ini
-rw-rw-r-- 1 polaris polaris 566 6月 1 15:48 swlink.ini
该项目包含一些可配置的构建选项,这些选项会影响生成的二进制文件。您可以通过以下方式为相应的探针配置固件或启用某些功能。
本文主要介绍bluepill.ini和blackpill-f401cc.ini。
bluepill.ini文件解析
# This a cross-file for the bluepill probe, providing sane default options for it.
# 编译固件需要的gcc工具链
[binaries]
c = 'arm-none-eabi-gcc'
cpp = 'arm-none-eabi-g++'
ld = 'arm-none-eabi-gcc'
ar = 'arm-none-eabi-ar'
nm = 'arm-none-eabi-nm'
strip = 'arm-none-eabi-strip'
objcopy = 'arm-none-eabi-objcopy'
objdump = 'arm-none-eabi-objdump'
size = 'arm-none-eabi-size'
# BlackMagicProbe使用的是核是ARM
[host_machine]
system = 'bare-metal'
cpu_family = 'arm'
cpu = 'arm'
endian = 'little'[project options]
# 运行 BMD(BlackMagic-Debug) 固件的硬件平台
probe = 'bluepill'
# 启用调试和烧写的目标平台和架构如下
targets = 'cortexm,lpc,nrf,nxp,renesas,rp,sam,stm,ti'
# 启用 Real-Time Transfer RTT(实时传输)支持
rtt_support = false
# 需要编译black magic debug bootloader
bmd_bootloader = true
blackpill-f401cc.ini文件解析
# This a cross-file for the blackpill-f401cc probe, providing sane default options for it.
# 编译固件需要的gcc工具链
[binaries]
c = 'arm-none-eabi-gcc'
cpp = 'arm-none-eabi-g++'
ld = 'arm-none-eabi-gcc'
ar = 'arm-none-eabi-ar'
nm = 'arm-none-eabi-nm'
strip = 'arm-none-eabi-strip'
objcopy = 'arm-none-eabi-objcopy'
objdump = 'arm-none-eabi-objdump'
size = 'arm-none-eabi-size'
# BlackMagicProbe使用的是核是ARM
[host_machine]
system = 'bare-metal'
cpu_family = 'arm'
cpu = 'arm'
endian = 'little'[project options]
# 运行 BMD(BlackMagic-Debug) 固件的硬件平台
probe = 'blackpill-f401cc'
# 启用调试和烧写的目标平台和架构如下
targets = 'cortexar,cortexm,riscv32,riscv64,apollo3,at32f4,ch32,ch579,efm,gd32,hc32,lpc,mm32,nrf,nxp,puya,renesas,rp,sam,stm,ti,xilinx'
# 启用 Real-Time Transfer RTT(实时传输)支持
rtt_support = true
# 需要编译black magic debug bootloader
bmd_bootloader = true
不难发现blackpill-f401cc比bluepill支持设备多很多,是应为F401的Flash和RAM都比F103大。
这里我选择的是WeAct STM32F103CBT6 BluePill 核心板作为BlackMagicProbe调试器。所以我选择bluepill.ini进行编译
# 配置预编译
meson setup build --cross-file cross-file/bluepill.ini
配置预编译会检测编译的依赖是否准备齐全。
问题: 解决github https下载失败超时问题
git config --local url."git@github.com:".insteadOf "https://github.com/"
这样会将所有 https://github.com/
开头的 URL 自动替换为 SSH 协议
meson setup build --cross-file cross-file/bluepill.ini
meson setup build --cross-file cross-file/blackpill-f401cc.ini
meson setup build --cross-file cross-file/bluepill.ini配置构建解析
meson setup build --cross-file cross-file/bluepill.ini
......
......
Black Magic Debug 2.0.0-rc2Remote ProtocolRISC-V acceleration : NO
# 支持调试的CPU厂家TargetsCortex-A/R support : NOCortex-M support : YESRISC-V 32-bit support : NORISC-V 64-bit support : NOArterytek parts : NOAmbiq Apollo3 parts : NOWinChipHead CH32 parts : NOWinChipHead CH579 parts : NOEnergy Micro parts : NOGigaDevice parts : NOHC32 parts : NOLPC series parts : YESMindMotion parts : NOnRF series parts : YESKinetis series parts : YESPuya PY32 series parts : NORenesas parts : YESRaspberry Pi MCUs (RP2040, RP2350): YESATSAM series parts : YESSTM32 (and clones) parts : YESTexas Instruments parts : YESXilinx parts : NO
# 作为BlackMagicProbe硬件的固件信息ProbeName : BluePillPlatform : STM32F1Bootloader : Black Magic Debug BootloaderLoad Address : 0x8002000SWIM as UART : NO
# 支持调试功能Black Magic Debug# 启用调试输出(用于调试 BMD 堆栈,而非调试目标平台)Debug output : NO# 启用 RTT(实时传输)支持RTT support : NOAdvertise QStartNoAckMode : YES# 编译固件Building Firmware : YES# 编译BMDA BlackMagicDebugAppBuilding BMDA : YES
# 编译依赖的字库是否齐全Subprojectshidapi : YESlibopencm3 : YESlibusb : YES#使用调试配置文件User defined optionsCross files : cross-file/bluepill.ini#编译固件
meson compile -C build
#生成dfu文件
meson compile -C build boot-bin
#生成固件
~/workspace/blackmagic$ ls build/ -al
total 5824
drwxrwxr-x 11 polaris polaris 4096 6月 1 18:08 .
drwxrwxr-x 14 polaris polaris 4096 6月 1 17:34 ..
-rwxrwxr-x 1 polaris polaris 7848 6月 1 17:46 blackmagic_bluepill_bootloader.bin
-rwxrwxr-x 1 polaris polaris 265144 6月 1 17:46 blackmagic_bluepill_bootloader.elf
-rwxrwxr-x 1 polaris polaris 119080 6月 1 17:38 blackmagic_bluepill_firmware.bin
-rwxrwxr-x 1 polaris polaris 1286032 6月 1 17:38 blackmagic_bluepill_firmware.elf
#合并allinone文件
#因为STM32F103CBT6默认没有dfu固件,所以需要生成blackmagic_bluepill_bootloader.bin
#blackmagic_bluepill_bootloader为dfu
dd if=blackmagic_bluepill_bootloader.bin of=blackmagic_allinone-bluepill.bin
dd if=blackmagic_bluepill_firmware.bin of=blackmagic_allinone-bluepill.bin seek=8 bs=1k conv=notrunc
meson setup build --cross-file cross-file/blackpill-f401cc.ini配置构建解析
meson setup build --cross-file cross-file/blackpill-f401cc.ini
......
......
Build targets in project: 40Black Magic Debug 2.0.0-rc2Remote ProtocolRISC-V acceleration : NO
# 支持调试的CPU厂家TargetsCortex-A/R support : YESCortex-M support : YESRISC-V 32-bit support : YESRISC-V 64-bit support : YESArterytek parts : YESAmbiq Apollo3 parts : YESWinChipHead CH32 parts : YESWinChipHead CH579 parts : YESEnergy Micro parts : YESGigaDevice parts : YESHC32 parts : YESLPC series parts : YESMindMotion parts : YESnRF series parts : YESKinetis series parts : YESPuya PY32 series parts : YESRenesas parts : YESRaspberry Pi MCUs (RP2040, RP2350): YESATSAM series parts : YESSTM32 (and clones) parts : YESTexas Instruments parts : YESXilinx parts : YES
# 作为BlackMagicProbe硬件的固件信息ProbeName : WeAct Studio F401CC BlackPillPlatform : STM32F4Bootloader : Black Magic Debug BootloaderLoad Address : 0x08004000
# 支持调试功能Black Magic Debug# 启用调试输出(用于调试 BMD 堆栈,而非调试目标平台)Debug output : NO# 启用 RTT(实时传输)支持RTT support : YESAdvertise QStartNoAckMode : YES# 编译固件Building Firmware : YES# 编译BMDA BlackMagicDebugAppBuilding BMDA : YES
# 编译依赖的字库是否齐全Subprojectshidapi : YESlibopencm3 : YESlibusb : YES
# 使用调试配置文件User defined optionsCross files : cross-file/blackpill-f401cc.ini#编译固件
meson compile -C build
#生成dfu文件
meson compile -C build boot-bin
#生成固件
~/workspace/blackmagic$ ls build/ -aldrwxrwxr-x 11 polaris polaris 4096 6月 11 09:46 .
drwxrwxr-x 13 polaris polaris 4096 6月 11 09:41 ..
-rwxrwxr-x 1 polaris polaris 2090448 6月 11 09:45 blackmagic
-rwxrwxr-x 1 polaris polaris 8232 6月 11 09:46 blackmagic_blackpill_f401cc_bootloader.bin
-rwxrwxr-x 1 polaris polaris 138760 6月 11 09:46 blackmagic_blackpill_f401cc_bootloader.elf
drwxrwxr-x 2 polaris polaris 4096 6月 11 09:46 blackmagic_blackpill_f401cc_bootloader.elf.p
-rwxrwxr-x 1 polaris polaris 150212 6月 11 09:45 blackmagic_blackpill_f401cc_firmware.bin
-rwxrwxr-x 1 polaris polaris 1486816 6月 11 09:45 blackmagic_blackpill_f401cc_firmware.elf
#合并allinone文件
#因为STM32F401CCU6默认没有dfu固件,blackmagic_blackpill_f401cc_bootloader.bin
#blackmagic_blackpill_f401cc_bootloader为dfu
dd if=blackmagic_blackpill_f401cc_bootloader.bin of=blackmagic_allinone-blackpill.bin
dd if=blackmagic_blackpill_f401cc_firmware.bin of=blackmagic_allinone-blackpill.bin seek=16 bs=1k conv=notruncdfu-util -d 0483:df11 -a 0 -s 0x08000000 -D blackmagic_allinone-blackpill.bin
编译bluepill固件和BMDA
#编译固件
meson compile -C build
#生成dfu文件
meson compile -C build boot-bin
#生成固件
~/workspace/blackmagic$ ls build/ -al
total 5824
drwxrwxr-x 11 polaris polaris 4096 6月 1 18:08 .
drwxrwxr-x 14 polaris polaris 4096 6月 1 17:34 ..
-rwxrwxr-x 1 polaris polaris 7848 6月 1 17:46 blackmagic_bluepill_bootloader.bin
-rwxrwxr-x 1 polaris polaris 265144 6月 1 17:46 blackmagic_bluepill_bootloader.elf
-rwxrwxr-x 1 polaris polaris 119080 6月 1 17:38 blackmagic_bluepill_firmware.bin
-rwxrwxr-x 1 polaris polaris 1286032 6月 1 17:38 blackmagic_bluepill_firmware.elf
-rwxrwxr-x 1 polaris polaris 1286032 6月 1 17:38 blackmagic.exe
-rwxrwxr-x 1 polaris polaris 1286032 6月 1 17:38 ftd2xx.dll
#合并allinone文件
#因为STM32F103CBT6默认没有dfu固件,所以需要生成blackmagic_bluepill_bootloader.bin
#blackmagic_bluepill_bootloader为dfu
dd if=blackmagic_bluepill_bootloader.bin of=blackmagic_allinone-bluepill.bin
dd if=blackmagic_bluepill_firmware.bin of=blackmagic_allinone-bluepill.bin seek=8 bs=1k conv=notrunc
编译blackpill_f401cc固件和BMDA
#编译固件
meson compile -C build
#生成dfu文件
meson compile -C build boot-bin
#生成固件
~/workspace/blackmagic$ ls build/ -aldrwxrwxr-x 11 polaris polaris 4096 6月 11 09:46 .
drwxrwxr-x 13 polaris polaris 4096 6月 11 09:41 ..
-rwxrwxr-x 1 polaris polaris 2090448 6月 11 09:45 blackmagic
-rwxrwxr-x 1 polaris polaris 8232 6月 11 09:46 blackmagic_blackpill_f401cc_bootloader.bin
-rwxrwxr-x 1 polaris polaris 138760 6月 11 09:46 blackmagic_blackpill_f401cc_bootloader.elf
drwxrwxr-x 2 polaris polaris 4096 6月 11 09:46 blackmagic_blackpill_f401cc_bootloader.elf.p
-rwxrwxr-x 1 polaris polaris 150212 6月 11 09:45 blackmagic_blackpill_f401cc_firmware.bin
-rwxrwxr-x 1 polaris polaris 1486816 6月 11 09:45 blackmagic_blackpill_f401cc_firmware.elf
#合并allinone文件
#因为STM32F401CCU6默认没有dfu固件,blackmagic_blackpill_f401cc_bootloader.bin
#blackmagic_blackpill_f401cc_bootloader为dfu
dd if=blackmagic_blackpill_f401cc_bootloader.bin of=blackmagic_allinone-blackpill.bin
dd if=blackmagic_blackpill_f401cc_firmware.bin of=blackmagic_allinone-blackpill.bin seek=16 bs=1k conv=notrunc
2.2 BMP固件烧录
USB-TO-TTL 与 STM32F103CB6T/F401CCU6 接线
USB-TO_TTL 引脚 | STM32F103CB/F401CC 引脚 | 备注 |
TX | PA10 (RX) | 必须连接 |
RX | PA9 (TX) | 必须连接 |
GND | GND | 必须连接 |
VCC | 3V3 | 必须连接 |
接上USB-TO-TTL至PC后,在USB设置中勾选“FTDI FT231X USB UART [1000]”
并在Ubuntu虚拟机中查询到如下:
user@desktop:~$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
# USB-TO-TLL设备
Bus 002 Device 006: ID 0403:6015 Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO)
Bus 002 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
user@desktop:~$ ls /dev/ttyUSB* -al
crw-rw---- 1 root dialout 188, 0 6月 12 19:33 /dev/ttyUSB0
保持BOOT0开关按压状态,同时短按NRST开关后立即释放。然后执行下载固件命令:
下面命令必须在固件所在目录下执行,如果不是必须带绝对路径。
# bluepill更新固件命令
sudo stm32flash -b 115200 -w blackmagic_allinone-bluepill.bin /dev/ttyUSB0stm32flash 0.5http://stm32flash.sourceforge.net/Using Parser : Raw BINARY
Interface serial_posix: 115200 8E1
Version : 0x22
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0410 (STM32F10xxx Medium-density)
- RAM : Up to 20KiB (512b reserved by bootloader)
- Flash : Up to 128KiB (size first sector: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory
Wrote address 0x0801ec6c (100.00%) Done.# 特别注意同时不要将MCU的Type-C连接到电脑,必须使用外部供电,不然会影响MCU下载。
# 同时在DFU模式和ISP模式STM32F4x1首选DFU模式
# blackpill更新固件命令sudo stm32flash -b 115200 -w blackmagic_allinone-blackpill.bin /dev/ttyUSB0 stm32flash 0.5http://stm32flash.sourceforge.net/Using Parser : Raw BINARY
Interface serial_posix: 115200 8E1
Version : 0x31
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0433 (STM32F401xD(E))
- RAM : Up to 96KiB (12288b reserved by bootloader)
- Flash : Up to 512KiB (size first sector: 1x16384)
- Option RAM : 16b
- System RAM : 30KiB
Write to memory
Erasing memory
Wrote address 0x08028ac4 (100.00%) Done.
自制BlackMagic Probe刷完固件后接上Type-C,便可以在设备管理器看到如下:
user@desktop:~/workspace/zephyr-gdb/blackmagic/build$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 010: ID 1d50:6018 OpenMoko, Inc. Black Magic Debug Probe (Application)
Bus 002 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
user@desktop:~/workspace/zephyr-gdb/blackmagic/build$ ls /dev/ttyA*
/dev/ttyACM0 # Debug Port
/dev/ttyACM1 # UART Port
自制BMP(BluePill)引脚定义参考:
BMP(STM32F103CB) Cotrex-M芯片
-------------------------------------
GND -------------> GND
SWCLK (PA5) -------------> SWCLK
SWDIO (PB14) -------------> SWDIO
TX (PA2) -------------> RX
RX (PA3) -------------> TX
VCC(3.3V) -------------> VDD (可选,若目标板无供电)
自制BMP(BlackPill)引脚定义参考:
BMP(STM32F401CC) Cotrex-M芯片
-------------------------------------
GND -------------> GND
SWCLK (PB8) -------------> SWCLK
SWDIO (PB9) -------------> SWDIO
TX (PA2) -------------> RX
RX (PA3) -------------> TX
VCC(3.3V) -------------> VDD (可选,若目标板无供电)
参考文献:
How to Install on STM32F103 Blue Pill and STM32F401/STM32F411 Black Pill
Black Magic Debug 官方文档