第 4 节

Linux环境搭建(新)

作者:董佳辉

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

环境介绍

本教程环境介绍:

  1. 系统:Fedora 44 KDE Edition Linux
  2. 系统内核:Linux 7.2.6-200.fc44.x86_64
  3. 架构:X86_64(amd64)

其他Linux环境也可以。

需要准备的东西

  1. 一台Linux电脑
  2. 一块STM32F4及以上的板子(目前STM32F1使用MDK6比较麻烦)
  3. CubeMX最新版
  4. VScode最新版
  5. pyOcd(如何安装下方有教程)
  6. 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)插件使用,避免和默认环境冲突。

alt text

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

创建后选配置:

选中他

安装插件

搜索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 侧对应工具链
AC6MDK-ARM
IAREWARM
GCCSTM32CubeIDE / 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
  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帮他保存一下

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