Linux环境搭建(新)
(本教程为2026年9月创建的,可能与以后的版本有些出入)
环境介绍
本教程环境介绍:
- 系统:Fedora 44 KDE Edition Linux
- 系统内核:Linux 7.2.6-200.fc44.x86_64
- 架构:X86_64(amd64)
其他Linux环境也可以。
需要准备的东西
- 一台Linux电脑
- 一块STM32F4及以上的板子(目前STM32F1使用MDK6比较麻烦)
- CubeMX最新版
- VScode最新版
- pyOcd(如何安装下方有教程)
- ST-Link驱动(如何安装下方有教程)
安装各种软件与环境
安装CubeMX

下载地址:
https://www.st.com.cn/zh/development-tools/stm32cubemx.html
推荐下载最新版本(此时最新版本是6.15.0)


解压出来

用root权限打开这个软件SetupSTM32CubeMX-6.18_1(不建议)
sudo ./SetupSTM32CubeMX-6.18_1
(更建议:也可以不用root权限打开,但在选择安装路径的时候注意以下,自己改成/home/xxx里的某个文件夹里)
./SetupSTM32CubeMX-6.18_1

在新弹出的界面一直点下一步就行,安装结束后出现如下图就成功了。

/usr/local/STMicroelectronics/STM32Cube/STM32CubeMX(如果你不是root权限安装的,你的路径不是这个,需要选择对应的路径)进入这个文件夹,然后打开终端输入
./STM32CubeMX

点击Help

选Manage embedded software packages,把STM32F1,F4,H7的第一个最新的固件勾上。

点install

登陆上账号

然后等下载和安装完

下载好就行了。
接下来可以把CubeMX应用配置一个桌面快捷方式等可以快速打开,教程详见Vinci机器人队Linux入门教程的Appimage章节,可以用ctrl+F快速定位该章节。
桌面快捷方式如下:
(如果你不是root权限安装的,你的路径不是这个/usr/local/STMicroelectronics/STM32Cube/STM32CubeMX/,需要选择对应的路径)
[Desktop Entry]
Name=STM32CubeMX
Exec=/usr/local/STMicroelectronics/STM32Cube/STM32CubeMX/STM32CubeMX
Icon=/usr/local/STMicroelectronics/STM32Cube/STM32CubeMX/help/STM32CubeMX.png
Type=Application
Categories=Development;Electronics;Embedded;
Comment=STM32CubeMX configuration and code generation tool
Terminal=false
根据教程做,就可以实现这种效果啦。


安装VScode
https://code.visualstudio.com/Download

如果是debian系下载deb,如果是rhel系下载rpm.
下载完之后,点击浏览器,找到这个安装包的文件夹,并在该路径打开终端。

Debian系:输入sudo apt install ./code然后按tab按键补齐文件名,回车。
RHEL系:输入sudo dnf install ./code然后按tab按键补齐文件名,回车。
例如补齐后的:
sudo dnf install ./code-1.102.1-1752598767.el8.x86_64.rpm

然后打开VScode,在终端输入下面的命令
code

然后可以配置一个环境单独给Keil Studio(MDK v6)插件使用,避免和默认环境冲突。

进行一些设置,按我的来就可以。

创建后选配置:

选中他

安装插件
搜索keil studio pack安装第一个即可

环境配置
官方教程:https://mdk-packs.github.io/vscode-cmsis-solution-docs/installation.html
CubeMX路径配置:
打开一个终端:
find ~/ /usr/local /opt -type f -name STM32CubeMX 2>/dev/null
一般会输出你的CubeMX可执行文件的目录,比如:
/usr/local/STMicroelectronics/STM32Cube/STM32CubeMX/STM32CubeMX
那么你复制/usr/local/STMicroelectronics/STM32Cube/STM32CubeMX即可,不要复制最后一个STM32CubeMX.
打开VScode设置:
搜索CMSIS Solution Environment Variables:

添加完毕后关掉这个界面即可
创建一个简单的例程
创建一个工程
点击侧边栏的CMSIS,如下图,
- 第一个是 创建
keil mdk6工程 - 第二个是 把
keil mdk5的工程转化为keil mdk6工程 - 第三个是浏览各种arm例程

选择Create New Solution后,选择 Device,然后搜索芯片,例如stm32f407ig

Templates选择CubeMX Basic solution

Solution Base Folder:workspace 所在目录,可以包含多个 project/solution.(工程文件夹所在的目录)Solution Sub Folder:通常是 workspace 下的一个子目录。(工程文件夹名字)
我这里选择了/home/tungchiahui/UserFolder/MySource/MDK6Projects/存放工程。(你任选一个空的你自己创建的纯英文路径的文件夹存放即可)
然后工程名叫做mdk6_test

点击创建后VScode工作区会自动跳转到工程文件夹.
添加许可
可能右下角会提示让你加许可,虽然咱没用armclang(ac6),他也会要,但是实际上你不给许可也可以,但可以给个社区许可,照下图这样点击即可.


许可成功

Pack安装
安装CMSIS
先打开下面这个网站:
https://www.keil.arm.com/packs
搜索CMSIS,

复制cpackget add命令

按ctrl + ~来开关VScode自带的终端,在终端里敲自己复制的那条命令,比如:
cpackget add ARM::CMSIS@6.3.0
他会开始猛猛下载:

这里键盘上按A

安装完毕:

安装设备DFP
再打开下面这个网站:
https://www.keil.arm.com/devices
搜索选中你想要的设备,这里比如STM32F407IGHx

点击那个CMSIS Pack:

复制cpackget add命令

按ctrl + ~来开关VScode自带的终端,在终端里敲自己复制的那条命令,比如:
cpackget add Keil::STM32F4xx_DFP@3.1.1
他会开始猛猛下载:

这里键盘上按A

安装完毕:

然后Ctrl + Shift + P搜索:
developer:reload window
打开CubeMX生成器
图形化
直接点击:

如果界面弹不出,实测Arm CMSIS Solution 1.70.0可以弹出来,而Arm CMSIS Solution 1.72.0弹不出来,这可能是个bug(Issue #550),可以先降级或者直接用终端打开CubeMX.
终端
出现下面这种问题,你只能在终端里打开CubeMX了:

csolution CubeMX.csolution.yml run \
-g CubeMX \
-a STM32F407IGHx
用CubeMX配置工程(这玩意不用教吧,自己配置吧)
顺利弹出CubeMX:

接下来进行配置,
我这里主要配置了如下设置:




并开启了一个LED做测试


配置完毕后,注意这里的设置也要根据下图进行修改:
| 你在 MDK6/csolution 里选的编译器 | CubeMX 侧对应工具链 |
|---|---|
AC6 | MDK-ARM |
IAR | EWARM |
GCC | STM32CubeIDE / Makefile / CMake |
我这里选择STM32CubeIDE(因为官方例程就是拿STM32CubeIDE举的例子),我也只测试过STM32CubeIDE没问题,其他俩选项你自己自测,但其实没必要,选STM32CubeIDE就行.
而 ST 官方对 Generate Under Root 的定义是:
- ✅ 勾上:把 STM32CubeIDE 的工程文件直接扔到 CubeMX 项目根目录
- ❌ 不勾:生成独立的 STM32CubeIDE/ 工具链目录
所以我们不勾选.

这里会有个问题,在GCC编译器(只要你使用GCC/newlib + FreeRTOS)下,需要开启configUSE_NEWLIB_REENTRANT,所以咱们需要先去FreeRTOS设置里先设置一下:

下载固件与生成配置
点击generate code后,如果弹出来要你下载FW,你就选yes.

下面这个选don't ask me again

他会自动开始下载固件(看你网络环境如何了,一般裸连是可以的,必要时可以采取一些那什么手段)

同意下许可

会自动开始解压

这样代码就生成完毕了,点击close,并关闭CubeMX

修改配置:
Arm Tools 环境配置
然后Ctrl + Shift + P搜索:
Arm Tools: Configure Arm Tools Environment

进入 Arm Tools Environment Manager。
至少安装:
Arm CMSIS-Toolbox
MDK-Toolbox
GCC compiler for ARM CPUs
Kitware's CMake tool
Ninja Build
- Arm CMSIS-Toolbox
找到Arm CMSIS-Toolbox,选择2.15.0,这个版本尽量可以先选这个,后续你明白这玩意是干啥的了,再选择其他版本。

弹出来的界面一直选总是允许

弹出来的这个vcpkg-configuration.json你用Ctrl + S帮他保存一下

左下角这里会开始下载,当下载完毕会出现Arm Tools:x如下图:

- MDK-Toolbox
选最新版即可

- GCC compiler for ARM CPUs
不用
Arm Compiler for Embedded的原因是Arm Clang(AC6)目前只支持C++17标准,而有很多C++20很爱好用的特性无法用,即便Arm Clang(AC6)很强,咱们还是放弃使用了,咱们用Arm GCC编译器.
选择最新版本即可,越高的版本,支持的C/C++标准越高.

然后同时可以关闭Arm Compiler for Embedded,咱们并不用Arm Clang(AC6)

- Kitware's CMake tool
选最新版即可

- Ninja Build
选最新版即可

弹出来的这个vcpkg-configuration.json你用Ctrl + S帮他保存一下

solution的编译器选择
打开CubeMX.csolution.yml
把下面这个从AC6改成GCC

CubeMX 生成的 startup_stm32f407ighx.s 需要 CubeMX 自己那套 GCC linker script 里的这些符号,但 CMSIS-Toolbox 现在却用了它自动生成的默认 gcc_linker_script.ld。
官方 CMSIS-Toolbox 的 CubeMX 文档其实专门强调了这一点:
CubeMX 生成的 linker script 和 startup/system 初始化代码是强绑定的,应该使用 CubeMX 生成的 linker script。
而且官方对 GCC 的路径就是,./STM32CubeMX/<target_name>/STM32CubeMX/<device_name>.ld
打开CubeMX.cproject.yml,在最底下加上:
linker:
- script: ./STM32CubeMX/STM32F407IGHx/STM32CubeMX/STM32F407xx_FLASH.ld
for-compiler: GCC
- 这个
linker是和components以及output属于同一级别,也就是属于project的下一级。 - 这里的
./STM32CubeMX/STM32F407IGHx/STM32CubeMX/STM32F407xx_FLASH.ld是CubeMX生成的.ld,你去看看具体是不是这个路径,文件名是不是这个,可能需要修改下,不能直接复制。
初次编译
接下来编译

成功编译

配置成标准工程
配置C/C++标准
打开CubeMX.cproject.yml,在最底下加上:
这俩是属于project的下一级:
我这里拿C23和C++23举例子,实际上你可能用不到那么高的标准,自行决定标准,我们也只用到C++20。
# List the programming languages used in the project.
language-C: c23
language-CPP: c++23
以下是这俩选项具体可以填什么:
language-C:
Documentation: https://open-cmsis-pack.github.io/cmsis-toolbox/YML-Input-Format/#language-c
Language standard to apply for compiling C source files.
For example c17, or gnu11.
Allowed Values:
c90
gnu90
c99
gnu99
c11
gnu11
c17
gnu17
c23
gnu23
Source: cproject.schema.json
language-CPP:
Documentation: https://open-cmsis-pack.github.io/cmsis-toolbox/YML-Input-Format/#language-cpp
Language standard to apply for compiling C++ source files.
For example c++17 or gnu++17.
Allowed Values:
c++98
gnu++98
c++03
gnu++03
c++11
gnu++11
c++14
gnu++14
c++17
gnu++17
c++20
gnu++20
c++23
gnu++23
Source: cproject.schema.json
配置STM32 C++标准工程
git clone
把文件夹里的东西全部复制到工程目录mdk6_test:


打开CubeMX.cproject.yml:
我们要添加:
add-path:
groups:
files:
add-path和groups是属于project的下一级
官方定义就是:
- add-path:添加 C/C++ include path
- groups:添加源码分组
- files:添加具体源码文件
比如咱们这里的工程:
# List the include paths to be used by the compiler.
add-path:
- ./applications/Inc
- ./bsp/boards/Inc
# List the groups of source files to be compiled.
groups:
- group: applications
files:
- file: ./applications/Src/cpp_interface.cpp
- group: bsp/boards
files:
- file: ./bsp/boards/Src/bsp_delay.cpp
写完保存下。
然后打开main.c

在这个地方加上:
/* USER CODE BEGIN Includes */
#include "cpp_interface.h"
/* USER CODE END Includes */

/* USER CODE BEGIN 2 */
cpp_main();
/* USER CODE END 2 */

然后打开cpp_interface.cpp,找到isRTOS:

给isRTOS改成1

编译一次试试:

点亮一个灯

复制这个void StartDefaultTask(void *argument)。
去cpp_interface.cpp做一个简单测试:
#include "cpp_interface.h"
#include "cmsis_os.h"
#include "main.h"
void cpp_main(void)
{
#if isRTOS == 0 // 裸机开发
for (;;)
{
}
#endif
}
extern "C"
void StartDefaultTask(void *argument)
{
for (;;)
{
HAL_GPIO_TogglePin(LED_B_GPIO_Port , LED_B_Pin);
osDelay(500);
}
}
编译一次试试:

配置Debugger
点击设置,找到Debug Adapter for Target STM32F407IGHx:
可以选择特别多的Debugger,比如ST-Link,J-Link,CMSIS-DAP等等。
