嵌入式开源工具链环境配置指引
Prerequisite
Architecture: x86_64
OS: Ubuntu 22.04 Jammy
开源工具链概览
配置工具:STM32CubeMX
构建工具:Arm GNU Toolchain
编辑工具:VSCode
调试器后端/烧录工具:pyOCD/OpenOCD
调试器前端:Cortex-Debug
关于调试器后端的选择:OpenOCD支持更丰富,使用范围更广,资料更多(其实很大程度上是OpenOCD问题更多导致的……pyOCD几乎没什么问题,就没人讨论),但是技术比较老旧,经常有奇怪问题(比如连接之后看外设寄存器会报错),而且配置用的是TCL脚本,相对冷门,有额外学习成本;pyOCD更现代,使用方便,而且提供python接口(!),但是资料相对较少,且相关支持有限(比如Cortex-Debug至今没有支持以pyOCD为后端的LiveWatch)。如果你看了足够多的论坛帖子,会经常发现有人提问一个OpenOCD的问题,然后补充一句“芯片和调试器硬件不存在差错,因为我用pyOCD就没这个问题”
我更推荐pyOCD,后面的配置也会主要基于pyOCD进行(OpenOCD配置过程两千字打不住,问题太多了),如果你有闲心可以装个OpenOCD备用。
下载地址:
| https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
|
(注意:不是https://developer.arm.com/downloads/-/gnu-rm
这个页面,该工具链已经deprecated)
有两个参数:Host和Target。Host指的是开发机硬件架构,Target指的是目标平台硬件架构。
对于我们的需求,选择x86_64 Linux hosted cross toolchains下的AArch32 bare-metal target (arm-none-eabi)即可。
ARM GNU Toolchain在官网只提供pre-build版本(类似Windows下的portable,也就是刚才下载的压缩包中包含完整的可执行文件),建议将压缩包直接解压到一个固定的目录(假设解压后为toolchain-directory
),然后添加环境变量到.bashrc
(这样每次启动终端时会自动设置环境变量):
| # 注意把下面的路径改成你的实际路径
echo 'export PATH="/path/to/toolchain-directory/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
|
测试:
| arm-none-eabi-gcc --version
|
正常输出版本信息则安装成功。
安装pyOCD
安装后测试:
正常输出版本信息则安装成功。
安装/使用STM32CubeMX
Step 0:下载安装包
为什么这会成为一个独立的步骤?需要解释一下,在2021年之后,由于出口管制等原因(说的直接一点就是制裁),已经没法直接从ST官网下载安装包(摊手),点击下载会提示如下:
We apologize for the inconvenience, but in accordance with the European Union's Export Regulation 2021/821, the US Export Administration Regulations (EAR), and other relevant rules and regulations, ST is not authorized to allow the download of this software from your country.
因此我们必须从其他地方下载。目前网上仍然能找到6.5版本的安装包,我们可以安装之后在软件内更新本体(没限制),就能用上最新版CubeMX。我已经把安装包传到了服务器上,可以自行下载。
下载地址:
| http://43.138.83.226/package/en.stm32cubemx-lin_v6-5-0.zip
|
Step 1:安装
解压刚下载的zip(建议解压到一个固定位置),运行安装程序:
| sudo ./SetupSTM32CubeMX-6.5.0
|
像Windows下一样一路Next即可完成安装。装完之后,在STM32CubeMX
目录下
即可启动软件。
Ubuntu下的CubeMX在高分辨率下会出现字体偏小的问题。CubeMX是GDK应用,可以通过设置GDK缩放比来解决:
| GDK_SCALE=2 ./STM32CubeMX
|
Step 2:更新
Warning
为了更新软件,必须以sudo权限启动。
启动后从顶部Help 》Check Updates进入更新检查,点击Refresh获取最新版本,选中后点击Install安装即可。
安装/配置Cortex-Debug
Step 0:【可选步骤】获取SVD文件
SVD=System View Description系统视图描述文件,就是用于描述芯片寄存器映射、外设信息等系统配置的一个文本xml文件。调试插件需要svd才能获取系统信息,展示寄存器状态。如果不打算看寄存器状态,就不需要SVD文件。不同系列芯片的SVD文件不同,但是获取的方法是通用的。如果用Ozone会方便点(自带各种型号芯片的SVD),但是Cortex-Debug没这个功能,所以得自己找。
SVD文件是DFP(=Device Family Pack,芯片厂商提供的一个软件包,除了svd之外还包括HAL库/链接脚本/启动文件等硬件强相关的软件接口)的一部分。ST的DFP包(在正常情况下)通过Keil MDK Pack Installer分发,所以下面安装的时候会发现所有DFP包都有Keil前缀(摊手)。虽然DFP是为Keil定制的,但是它本质上仍然是个压缩包,可以直接解压提取出内容。
获取SVD文件的方法有多种,最简单的方法是自己下载(指路:https://github.com/Open-CMSIS-Pack),但是麻烦+不好管理,更合理的方法是使用pyOCD自带的包管理器,也就是pyocd pack
命令。
我们假设目标芯片是STM32H723VGT6
(其他芯片可以同理),按照以下步骤执行:
| # 先确认pyocd有内建这块芯片的dfp,找到对应的pack名称
$ pyocd pack -f h723
Part Vendor Pack Version Installed
---------------------------------------------------------------------------------
STM32H723VEHx STMicroelectronics Keil.STM32H7xx_DFP 4.1.0 False
STM32H723VETx STMicroelectronics Keil.STM32H7xx_DFP 4.1.0 False
STM32H723VGHx STMicroelectronics Keil.STM32H7xx_DFP 4.1.0 False
STM32H723VGTx STMicroelectronics Keil.STM32H7xx_DFP 4.1.0 False # 此处匹配(可见pack未安装)
STM32H723ZEIx STMicroelectronics Keil.STM32H7xx_DFP 4.1.0 False
STM32H723ZETx STMicroelectronics Keil.STM32H7xx_DFP 4.1.0 False
STM32H723ZGIx STMicroelectronics Keil.STM32H7xx_DFP 4.1.0 False
STM32H723ZGTx STMicroelectronics Keil.STM32H7xx_DFP 4.1.0 False
# 随后直接安装即可
$ pyocd pack -i STM32H723VGTx
Downloading packs (press Control-C to cancel):
Keil.STM32H7xx_DFP.4.1.0
Downloading descriptors (001/001)
# 安装完成之后,对应的pack会被放在$HOME/.local/share/cmsis-pack-manager/Keil/下($HOME是你的用户home目录)
$ cd ~/.local/share/cmsis-pack-manager/Keil
# 根据对应的pack名称(上面-f命令的输出)找到存放pack的目录。可见最终我们需要的pack名称为4.1.0.pack
$ ls && cd STM32H7xx_DFP && ls
STM32H7xx_DFP
4.1.0.pack
# 接下来我们将4.1.0.pack当作一个zip文件进行解压,并提取出其中的svd文件
$ cp 4.1.0.pack pack.zip # 复制一份,改名为pack.zip
$ unzip pack.zip -d pack # 解压到名为pack的目录
$ cd pack/CMSIS/SVD && ls
_htmresc STM32H723.svd STM32H733.svd STM32H742.svd STM32H745_CM4.svd STM32H747_CM7.svd STM32H755_CM4.svd STM32H757_CM7.svd STM32H7B3.svd
Release_Notes_files STM32H725.svd STM32H735.svd STM32H742x.svd STM32H745_CM7.svd STM32H750.svd STM32H755_CM7.svd STM32H7A3.svd
Release_Notes.htm STM32H730.svd STM32H73x.svd STM32H743.svd STM32H747_CM4.svd STM32H753.svd STM32H757_CM4.svd STM32H7B0.svd
# 该目录下的STM32H723.svd就是我们最终需要的SVD文件
# 提取完成之后,推荐把我们临时解压的pack目录和复制的pack.zip删除,避免直接操作pyOCD系统路径带来的一些问题
|
Step 1: 安装VSCode插件
直接在插件中心搜索Cortex-Debug安装即可。
Step 2: 配置launch.json
此时还没有创建launch.json,直接按Ctrl+Shift+D进入“运行和调试”面板点击创建即可。
Cortex-Debug支持多种server类型,包括但不限于OpenOCD、pyOCD,以及external。如果你指定了一个具体的调试器后端,Cortex-Debug会按照它的语法直接启动gdb server,然后和它通信。external意味着你需要先在外部(比如另开一个终端)启动一个gdb server,然后在VSCode按F5进调试,Cortex-Debug会通过指定端口和该server通信,完成调试。
对于pyOCD的launch.json配置:
| {
"name": "pyOCD", // 【无需更改】显示在顶部选择框中的调试选项名称
"cwd": "${workspaceFolder}", // 【无需更改】当前项目工作目录
"executable": "build/demo.elf", // 【需要配置】编译出的ELF文件路径(相对cwd的路径)
"request": "launch", // 【无需更改】
"type": "cortex-debug", // 【无需更改】
// 【无需更改】指定pyocd为gdb server(cortex-debug会按照语法自动生成启动命令)
"servertype": "pyocd",
// 【可选配置】svd文件存放路径
"svdFile": "${workspaceFolder}/STM32H723.svd",
// 【需要配置】芯片型号(和上面pyocd pack -f结果的Part部分一致)
"targetId": "STM32H723VGTx",
// 【需要配置】芯片的DFP包(上面提到的.pack文件)
"cmsisPack": "/path/to/cmsis/pack"
},
|
对于external gdb server的launch.json配置
| {
"name": "External", // 【无需更改】显示在顶部选择框中的调试选项名称
"cwd": "${workspaceFolder}", // 【无需更改】当前项目工作目录
"executable": "build/demo.elf", // 【需要配置】编译出的ELF文件路径(相对cwd的路径)
"request": "launch", // 【无需更改】
"type": "cortex-debug", // 【无需更改】
"servertype": "external", // 【无需更改】指定外部gdb server
"gdbTarget": "localhost:3333", // 【无需更改】gdb server端口,默认为3333
// 【需要配置】arm-none-eabi-gdb的可执行文件路径(绝对路径)
"gdbPath" : "/path/to/arm-none-eabi-gdb/executable",
// 【可选配置】svd文件存放路径
"svdFile": "${workspaceFolder}/STM32H723.svd",
}
|
以上配置对应的gdb server启动命令(别忘了:先启动,再进调试):
| # 对于pyOCD
# 只需指定目标芯片型号和DFP。默认通信端口为localhost:3333,如果要更改可以通过--port指定
pyocd gdbserver --target=STM32H723VGTx --pack=$HOME/.local/share/cmsis-pack-manager/Keil/STM32H7xx_DFP/4.1.0.pack
# 对于OpenOCD
# 如果用的不是JLink可以自己改
openocd -f interface/jlink.cfg -f target/stm32h7x.cfg
|
Note
截至目前(2025年7月),Cortex-Debug仍然没有支持以pyOCD为后端的LiveWatch。
【可选步骤】安装OpenOCD
推荐使用编译安装(实际上也可以用apt install直接装,但是二进制版本容易出现问题)。
Step 0:安装依赖
根据OpenOCD README内容:
| GCC or Clang is currently required to build OpenOCD. The developers
have begun to enforce strict code warnings (-Wall, -Werror, -Wextra,
and more) and use C99-specific features: inline functions, named
initializers, mixing declarations with code, and other tricks. While
it may be possible to use other compilers, they must be somewhat
modern and could require extending support to conditionally remove
GCC-specific extensions.
You'll also need:
- make
- libtool
- pkg-config >= 0.23 or pkgconf
- libjim >= 0.79
Additionally, for building from git:
- autoconf >= 2.69
- automake >= 1.14
- texinfo >= 5.0
|
以上提到的dependencies必须预先安装。同时,在后续编译安装的configure阶段可能出现部分依赖缺失,如果查出问题可以按照以下方法安装(如果没问题就不要输入下面的命令,防止误装两个版本)。
Note
对于编译安装的软件,可以自己选择是否保留源码目录。保留这个目录的主要目的是将来卸载(makefile文件保存了安装路径信息,将来可以通过sudo make uninstall
移除),如果不打算卸载可以直接删了,如果打算保留,建议在电脑上建一个专门的目录统一存放,否则home目录会变得很乱。
1.HIDAPI
| sudo apt install libhidapi-dev
|
2.jimtcl
| git clone https://github.com/msteveb/jimtcl
cd jimtcl
./configure
make
sudo make install # 官方文档里没有这步,必须手动执行
|
3.libjaylink
| git clone git://git.zapb.de/libjaylink.git
cd libjaylink
./autogen.sh
./configure
make
sudo make install
sudo ldconfig # 装完之后必须手动刷新动态链接缓存,否则openocd的配置脚本识别不到
|
Step 1:下载源码
源码地址:
| https://github.com/openocd-org/openocd.git
|
在终端执行
| git clone https://github.com/openocd-org/openocd.git
|
命令会将代码仓库clone到~/openocd
Step 2:Build from source
OpenOCD使用gnu libtools进行构建,分成4步:bootstrap -> configure -> make -> make install
Warning
注意:步骤之间有先后关系,前一个步骤执行成功后才会生成后一个步骤所需的脚本和构建产物。
按照以下步骤执行(注意configure
步骤必须使能调试器):
| ./bootstrap
# 以下一步需要设置使能调试器类型。
# 注意:如果此处没有使能,后续将会无法更改,必须卸载重装
./configure --enable-cmsis-dap --enable-jlink --enable-stlink
make
sudo make install
|
configure
结束后,会输出一份configure summary
,类似下面这样:
| OpenOCD configuration summary
---------------------------------------------------
MPSSE mode of FTDI based devices yes (auto)
ST-Link Programmer yes
TI ICDI JTAG Programmer yes (auto)
Keil ULINK JTAG Programmer yes (auto)
ANGIE Adapter yes (auto)
Altera USB-Blaster II Compatible yes (auto)
Bitbang mode of FT232R based devices yes (auto)
Versaloon-Link JTAG Programmer yes (auto)
TI XDS110 Debug Probe yes (auto)
OSBDM (JTAG only) Programmer yes (auto)
eStick/opendous JTAG Programmer yes (auto)
Olimex ARM-JTAG-EW Programmer yes (auto)
Raisonance RLink JTAG Programmer yes (auto)
USBProg JTAG Programmer yes (auto)
Espressif JTAG Programmer yes (auto)
CMSIS-DAP v2 compliant dongle (USB bulk) yes (auto)
CMSIS-DAP v1 compliant dongle (HID) yes
Nu-Link Programmer yes (auto)
Cypress KitProg Programmer yes (auto)
Altera USB-Blaster Compatible no
ASIX Presto Adapter no
OpenJTAG Adapter no
Linux GPIO bitbang through libgpiod no
CoreSight Direct Memory yes (auto)
Linux GPIO bitbang through sysfs yes (auto)
Remote Bitbang driver yes (auto)
SEGGER J-Link Programmer yes
Xilinx XVC/PCIe yes (auto)
Bus Pirate yes (auto)
Linux spidev driver yes (auto)
Cadence Virtual Debug Interface yes (auto)
JTAG DPI Adapter yes (auto)
JTAG VPI Adapter yes (auto)
BlueField SoC via rshim yes (auto)
Amontec JTAG-Accelerator driver no
Bitbanging on EP93xx-based SBCs no
Bitbanging on AT91RM9200-based SBCs no
Bitbanging on BCM2835 (as found in Raspberry Pi) no
Bitbanging on NXP IMX processors no
Bitbanging on AM335x (as found in Beaglebones) no
Dummy Adapter yes (auto)
Use Capstone disassembly framework no
Collect coverage using gcov no
|
如果没输出说明configure
失败,可以检查最后一行输出,判断是哪个依赖缺失。
Step 3:验证
输出结果示例:
| Open On-Chip Debugger 0.12.0+dev-02088-gcbc32c383 (2025-07-09-15:47)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
|