本文详细介绍如何在 Ubuntu 22.04 操作系统中,使用 VSCode、GCC交叉编译器 和 OpenOCD 搭建一套完整的STM32单片机集成开发环境,实现代码编辑、编译、烧录与可视化调试的全流程。
一、开发环境概述
目标环境为 Ubuntu 22.04,核心工具链包括:使用 GCC (arm-none-eabi-gcc) 进行交叉编译,通过 OpenOCD 连接ST-Link硬件,并利用 VSCode 及其插件提供高效的代码编辑与图形化调试界面。

二、安装必要依赖
打开终端,执行以下命令安装所有必需的软件包:
sudo apt update
# 安装ARM GCC交叉编译器(用于编译STM32程序)
sudo apt install -y gcc-arm-none-eabi
# 安装GDB调试器(支持多架构,OpenOCD通过它与芯片通信)
sudo apt install -y gdb-multiarch
# 安装OpenOCD(连接开发板硬件的桥梁)
sudo apt install -y openocd
# 安装make cmake构建工具
sudo apt install -y make cmake
# 安装串口工具,用于查看程序输出(可选)
# sudo apt install -y minicom
主要工具清单:
- 交叉编译工具链: arm-none-eabi-gcc (ARM官方工具链)
- 调试与烧录工具: OpenOCD (适配ST-Link V1/V2/V2-1)
- 开发IDE: VSCode + 扩展插件
重要权限配置:
Ubuntu默认限制普通用户直接访问USB调试器,需为当前用户添加设备访问权限,以解决“无法访问ST-Link/串口设备”的问题。
# 为当前用户追加串口/USB设备访问权限
sudo usermod -a -G dialout,plugdev $USER

注意:执行此命令后,必须注销并重新登录(或重启系统)才能使新的组权限生效。
验证权限添加成功:
执行以下命令,查看输出中是否包含 dialout 和 plugdev:
groups $USER
# 输出示例:ubuntu : ubuntu sudo dialout plugdev
检查ST-Link驱动:
连接开发板后,在终端中输入以下命令,应能看到ST-Link设备信息。
lsusb

三、VSCode安装与工程配置
VSCode版本:Version: 1.107.1
- 安装VSCode:从微软官网下载安装,或通过Snap安装:
sudo snap install --classic code。
- 安装必要扩展:打开VSCode,进入扩展市场,搜索并安装以下插件:
- C/C++ (Microsoft):提供代码智能感知、跳转、错误检查。
- Cortex-Debug:提供针对Cortex-M芯片的专用调试界面(查看寄存器、变量、外设等)。

3.1 生成VSCode工程
使用构建工具(如scons)生成适用于VSCode的工程文件。例如,使用scons命令:
# 生成 VSCode 工程
scons --target=vsc
# 亦可生成 Makefile 工程,本文以此为例
scons --target=makefile


3.2 工程配置
3.2.1 配置构建任务 (.vscode/tasks.json)
按 Ctrl+Shift+P → 输入 Tasks: Configure Task → 选择 Create tasks.json file from template → 选择 Others。

将文件内容替换为以下配置,用于定义编译和清理任务:
{
"version": "2.0.0",
"tasks": [
{
"label": "build stm32",
"type": "shell",
"command": "make -j4", // 针对 Makefile 工程
// 若为 CMake 工程,可替换为:"command": "cmake --build build -j4"
"args": [],
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"echo": true,
"reveal": "always",
"panel": "shared"
},
"problemMatcher": "$gcc"
},
{
"label": "clean stm32",
"type": "shell",
"command": "make clean",
"args": [],
"group": "build",
"presentation": {
"echo": true,
"reveal": "always",
"panel": "shared"
},
"problemMatcher": "$gcc"
}
]
}
3.2.2 配置调试环境 (.vscode/launch.json)
点击VSCode左侧的“运行和调试”图标,然后点击创建 launch.json 文件,或按F5后选择C++ (GDB/LLDB)。


配置内容如下,实现通过OpenOCD和ST-Link进行调试:
{
"version": "0.2.0",
"configurations": [
{
"name": "STM32 Debug (OpenOCD)",
"type": "cortex-debug", // 依赖于 Cortex-Debug 插件
"request": "launch",
"cwd": "${workspaceFolder}",
"executable": "${workspaceFolder}/build/STM32F407ZET6.elf", // 替换为你的 ELF 文件路径
"device": "STM32F407ZG", // 芯片型号
"interface": "swd", // 调试接口(SWD)
"servertype": "openocd", // 调试服务器:OpenOCD
"configFiles": [
"interface/stlink.cfg", // ST-Link 配置
"target/stm32f4x.cfg" // STM32F4 系列配置
],
"openocdPath": "/usr/bin/openocd", // OpenOCD 安装路径
"preLaunchTask": "build stm32", // 调试前自动执行编译任务
"runToMain": true, // 启动后自动运行到 main 函数
"svdFile": "${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/svd/STM32F407.svd", // 用于查看寄存器(可选)
"showDevDebugOutput": "none",
"gdbPath": "/usr/bin/gdb-multiarch" // 指定 GDB 路径
}
]
}
关键参数适配:
executable:替换为工程编译生成的 .elf 文件实际路径。
device:根据实际使用的STM32芯片型号修改。
configFiles:根据芯片系列选择对应配置文件(如STM32F1系列用target/stm32f1x.cfg)。
3.2.3 配置代码补全与头文件索引 (.vscode/c_cpp_properties.json)
按 Ctrl+Shift+P → 输入 C/C++: Edit Configurations (JSON)。

修改配置文件,确保代码智能感知能正确找到所有头文件和定义,这对于前端框架/工程化项目中的复杂依赖管理同样重要。
{
"configurations": [
{
"name": "Ubuntu-STM32F407",
"defines": [
"HAVE_CCONFIG_H",
"RT_USING_LIBC",
"RT_USING_NEWLIB",
"STM32F407xx",
"USE_HAL_DRIVER",
"_POSIX_C_SOURCE=1",
"__RTTHREAD__"
],
"intelliSenseMode": "gcc-arm",
"compilerPath": "/usr/bin/arm-none-eabi-gcc",
"cStandard": "c99",
"cppStandard": "c++11",
"includePath": [
"applications",
"rt-thread/components/libc/compilers/common/include",
"rt-thread/components/libc/compilers/newlib",
"rt-thread/libcpu/arm/common",
"rt-thread/libcpu/arm/cortex-m4",
"rt-thread/components/drivers/include",
"board",
"board/CubeMX_Config/Inc",
"board/ports",
"libraries/HAL_Drivers",
"libraries/HAL_Drivers/config",
"libraries/HAL_Drivers/CMSIS/Include",
"rt-thread/components/finsh",
".",
"rt-thread/include",
"libraries/STM32F4xx_HAL/STM32F4xx_HAL_Driver/Inc",
"libraries/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Include",
"rt-thread/components/libc/posix/ipc",
"rt-thread/components/libc/posix/io/stdio",
"rt-thread/components/libc/posix/io/poll"
]
}
],
"version": 4
}
注意:配置修改后需重启VSCode,或按 Ctrl+Shift+P 执行 C/C++: Reset IntelliSense Database 使配置生效。
3.3 环境验证与调试
3.3.1 硬件连接
- 将STM32开发板通过ST-Link调试器连接到Ubuntu主机的USB口。
- 再次执行
lsusb 命令,应能识别到 STMicroelectronics ST-LINK/V2 或类似设备信息。
3.3.2 编译与调试
- 编译工程:按
Ctrl+Shift+B 执行默认构建任务,或在终端执行 make,将在指定目录生成 .elf 文件。
- 启动调试:按
F5,VSCode将自动执行以下操作:
- 启动OpenOCD服务,连接ST-Link与目标芯片。
- 将编译好的
.elf 文件烧录至STM32的Flash。
- 程序指针停在
main 函数入口(因配置了 "runToMain": true)。
- 调试操作:
- 打断点:点击代码行号左侧区域。
- 单步执行:
F10 (逐过程),F11 (逐语句)。
- 查看状态:在左侧“运行和调试”面板中查看“变量”、“监视”、“调用堆栈”以及“Cortex-Debug”提供的“外设寄存器”等信息。


命令行烧录(可选):
也可直接使用OpenOCD命令进行烧录,这对于运维/DevOps流程中的自动化脚本集成非常有用。
openocd -f /usr/share/openocd/scripts/interface/stlink.cfg \
-f /usr/share/openocd/scripts/target/stm32f4x.cfg \
-c "program build/STM32F407ZET6.elf verify reset exit"
# 注意:`build/STM32F407ZET6.elf` 需替换为实际的ELF文件路径

代码格式化建议:
为保持代码风格统一,可安装 Clang-Format 扩展,并在项目根目录配置 .clang-format 文件。
参考资料