Wiki
Linux環境搭建(新)
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
(本教程为2026年9月创建的,可能与以后的版本有些出入)
1.環境介紹
本教程環境介紹:
-
系統:Fedora 44 KDE Edition Linux
-
系統內核:Linux 7.2.6-200.fc44.x86_64
-
架構:X86_64(amd64)
其他Linux環境也可以。
2.需要準備的東西
-
一台Linux電腦
-
一塊STM32F4及以上的板子(目前STM32F1使用MDK6比較麻煩)
-
CubeMX最新版
-
VScode最新版
-
pyOcd(如何安裝下方有教程)
-
ST-Link驅動(如何安裝下方有教程)
3.安裝各種軟件與環境
3.1.安裝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
根據教程做,就可以實現這種效果啦。


3.2.安裝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)插件使用,避免和默認環境衝突。

進行一些設置,按我的來就可以。

創建後選配置:

選中他

3.3.安裝插件
搜索keil studio pack安裝第一個即可

4.環境配置
官方教程:https://mdk-packs.github.io/vscode-cmsis-solution-docs/installation.html
4.1.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:

添加完畢後關掉這個界面即可
5.創建一個簡單的例程
5.1.創建一個工程
點擊側邊欄的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工作區會自動跳轉到工程文件夾.
5.2.添加許可
可能右下角會提示讓你加許可,雖然咱沒用armclang(ac6),他也會要,但是實際上你不給許可也可以,但可以給個社區許可,照下圖這樣點擊即可.


許可成功

5.3.Pack安裝
5.3.1.安裝CMSIS
先打開下面這個網站:
https://www.keil.arm.com/packs
搜索CMSIS,

複製cpackget add命令

按ctrl + ~來開關VScode自帶的終端,在終端裏敲自己複製的那條命令,比如:
cpackget add ARM::CMSIS@6.3.0
他會開始猛猛下載:

這裏鍵盤上按A

安裝完畢:

5.3.2.安裝設備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
5.4.打開CubeMX生成器
5.4.1.圖形化
直接點擊:

如果界面彈不出,實測Arm CMSIS Solution 1.70.0可以彈出來,而Arm CMSIS Solution 1.72.0彈不出來,這可能是個bug(Issue #550),可以先降級或者直接用終端打開CubeMX.
5.4.2.終端
出現下面這種問題,你只能在終端裏打開CubeMX了:

csolution CubeMX.csolution.yml run \
-g CubeMX \
-a STM32F407IGHx
5.5.用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設置裏先設置一下:

5.6.下載固件與生成配置
點擊generate code後,如果彈出來要你下載FW,你就選yes.

下面這個選don't ask me again

他會自動開始下載固件(看你網絡環境如何了,一般裸連是可以的,必要時可以採取一些那什麼手段)

同意下許可

會自動開始解壓

這樣代碼就生成完畢了,點擊close,並關閉CubeMX

5.7.修改配置:
5.7.1.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幫他保存一下

5.7.2.solution的編譯器選擇
打開CubeMX.csolution.yml
把下面這個從AC6改成GCC

5.7.3.
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,你去看看具體是不是這個路徑,文件名是不是這個,可能需要修改下,不能直接複製。
6.初次編譯
接下來編譯

成功編譯

7.配置成標準工程
7.1.配置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
7.2.配置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

編譯一次試試:

7.3.點亮一個燈

複製這個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);
}
}
編譯一次試試:

8.配置Debugger
點擊設置,找到Debug Adapter for Target STM32F407IGHx:
可以選擇特別多的Debugger,比如ST-Link,J-Link,CMSIS-DAP等等。
