跳到正文

Wiki

Linux環境搭建(新)

約 27 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

(本教程为2026年9月创建的,可能与以后的版本有些出入)

1.環境介紹

本教程環境介紹:

  1. 系統:Fedora 44 KDE Edition Linux

  2. 系統核心:Linux 7.2.6-200.fc44.x86_64

  3. 架構:X86_64(amd64)

其他Linux環境也可以。

2.需要準備的東西

  1. 一臺Linux電腦

  2. 一塊STM32F4及以上的板子(目前STM32F1使用MDK6比較麻煩)

  3. CubeMX最新版

  4. VScode最新版

  5. pyOcd(如何安裝下方有教程)

  6. 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)外掛使用,避免和預設環境衝突。

alt text

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

建立後選配置:

選中他

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
  1. Arm CMSIS-Toolbox

找到Arm CMSIS-Toolbox,選擇2.15.0,這個版本儘量可以先選這個,後續你明白這玩意是幹啥的了,再選擇其他版本。

彈出來的介面一直選总是允许

彈出來的這個vcpkg-configuration.json你用Ctrl + S幫他儲存一下

左下角這裡會開始下載,當下載完畢會出現Arm Tools:x如下圖:

  1. MDK-Toolbox

選最新版即可

  1. 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)

  1. Kitware's CMake tool

選最新版即可

  1. 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等等。