jklincn


Stm32F103 + Stm32CubeMX(一):VSCode 开发环境配置


记得以前大二的时候玩过野火的开发板,当时下载 keil 然后做配置与开发。现在过了四五年重新买了块板子,想试试能不能完全使用 vscode 进行开发。

此篇文章不适合计算机纯小白搭建环境,新手还是看正点原子/野火教程使用 keil 来学习入门吧。

硬件平台:正点原子精英开发板(STM32F103ZET6)、正点原子 STM32下载器

软件平台:Windows 11 专业版 24H2(26100.7462)

选用 Windows 平台是懒得用 WSL 了,以前是 WSL 重度用户,现在有远程 Linux 开发机后,本地的 WSL 几乎没打开过了。

环境准备

软件安装

这里提供的都是官方下载页面,确实会存在一些网络问题或注册下载导致的麻烦,因此我打包了所有的安装包(至 2025-12-17 的最新版本),可以在此下载:https://oss.jklincn.com/stm32_vscode_env.zip

如果链接失效或无法下载,可以给我发邮件获取:jklincn@foxmail.com

VSCode

https://code.visualstudio.com/download

下载安装即可

CMake

https://cmake.org/download/

找到 cmake-[version]-windows-x86_64.msi 下载安装,并加入到环境变量

Ninja

https://github.com/ninja-build/ninja/releases

找到 ninja-win.zip,下载后解压加入到环境变量

Arm GNU Toolchain

https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

找到 arm-gnu-toolchain-[version]-mingw-w64-x86_64-arm-none-eabi.exe,下载安装即可,并加入到环境变量。

https://www.st.com/en/development-tools/stsw-link009.html

下载并解压,点击 dpinst_amd64.exe 安装。

安装后可以将 ST-Link 调试器与电脑连接,查看设备管理器-通用串行总线设备中是否能正确识别 STM32 STLink。

STM32CubeMX

https://www.st.com/en/development-tools/stm32cubemx.html

下载安装即可

xPack OpenOCD

https://github.com/xpack-dev-tools/openocd-xpack/releases/

找到 xpack-openocd-[version]-win32-x64.zip,下载后解压加入到环境变量

环境变量检查

打开 PowerShell / CMD,运行以下命令检查是否都正常安装并加入到环境变量中

1
2
3
4
arm-none-eabi-gcc --version
cmake --version
ninja --version
openocd --version

连接硬件

  1. 将 ST-Link 调试器连接到电脑
  2. 将开发板连接 ST-Link 调试器
  3. 开发板接入电源上电

打开 CMD 进行连接测试,如果是其他 MCU 需要相应修改 target,可以在 xpack-openocd-[version]\openocd\scripts\target 中寻找

openocd -f interface/stlink.cfg -f target/stm32f1x.cfg

如果一切正常,应该可以看到

...
Info : STLINK V2J35S7 (API v2) VID:PID 0483:3748
...
Info : [stm32f1x.cpu] Cortex-M3 r1p1 processor detected
...
Info : Listening on port 3333 for gdb connections

说明识别到 ST-Link V2 和 Cortex-M3,并且 GDB Server 已启动。

例程说明

就做一个简单的 LED 控制吧。

由《精英V2 硬件参考手册_V1.0》可以看到精英版有 2 个LED:DS0(红灯)和 DS1(绿灯),分别接到了 PB5 和 PE5 上,并且都是低电平亮。

生成工程

从这一节开始发现本人也是嵌入式小白,只是在软件环境配置上更熟练一点😂

以下配置不一定是最合适的,可能存在非常多的优化空间,只是先按照网上教程来,先把 VSCode 开发这个路走通再慢慢学习嵌入式的知识。

打开 STM32CubeMX,New Project 下选择 Start My project from MCU(即点击 ACCESS TO MCU SELECTOR)

输入 STM32F103ZET6 进行查找,双击两下即可进入配置页面。

Pinout & Configuration 中需要修改的配置

  • System Core -> RCC -> High Speed Clock (HSE) -> Crystal/Ceramic Resonator
  • System Core -> SYS -> Debug -> Serial Wire
  • 右侧 Pinout view -> PB5/PE5 -> GPIO_Output

Project Manager 中需要修改的配置

  • Project -> Project Settings -> Project Name
  • Project -> Project Settings -> Project Location (注意路径不要有空格与中文,避免潜在问题)
  • Project -> Project Settings -> Toolchain / IDE -> CMake

设置完之后点击右上角 GENERATE CODE 即可,第一次应该会提示下载,点击 YES 即可

生成完之后打开文件夹,应该会看到这些文件。

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2025/12/17     15:02                cmake
d-----        2025/12/17     15:02                Core
d-----        2025/12/17     15:02                Drivers
-a----        2025/12/17     15:02           6421 .mxproject
-a----        2025/12/17     15:02           1584 CMakeLists.txt
-a----        2025/12/17     15:02            906 CMakePresets.json
-a----        2025/12/17     15:02          12022 startup_stm32f103xe.s
-a----        2025/12/17     15:02           8376 STM32F103XX_FLASH.ld
-a----        2025/12/17     15:02           3287 test1.ioc

如果后续在外设引脚方面有更改,使用 STM32CubeMX 打开该项目重新进行代码生成就可以了,会自动更新而不用重新创建。

VSCode 打开工程

打开 VSCode,可以先安装以下插件

  • CMake Tools
  • Cortex-Debug

C/C++ 插件在本文中不是必需的,因此暂不安装。

然后在 VSCode 中打开上述生成的工程文件夹,这时界面上方 CMake 应该会弹出配置预设,选择 Debug 即可。

如果没有弹出,则在左边页面中手动选择 CMake,点击配置右侧的按钮;或者输入 Ctrl + Shift + P 打开命令面板,输入 CMake: Configure 也可以进行配置。

修改代码

修改 Core\Src\main.c 代码,这里在 main() 函数中会看到大量 USER CODE BEGIN 和 USER CODE END 的注释,AI 解释说是 CubeMX 在重新 Generate Code 时,只保证 USER CODE 区域里的代码不被覆盖。因此我们也将代码加入到这些区域内。

初始化逻辑添加到 MX_GPIO_Init() 之后

1
2
3
4
5
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); // DS0 灭
+ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET); // DS1 灭
  /* USER CODE END 2 */

LED 闪烁逻辑写到 while (1) 循环中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
+   HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5); // DS0 翻转
+   HAL_Delay(300);
+   HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5); // DS1 翻转
+   HAL_Delay(300);
  }
  /* USER CODE END 3 */

编译与调试

点击左下角【齿轮图标生成】就可以编译了,或者命令面板输入 CMake: Build。

为了更方便调试与烧录,下面会把编译、烧录与调试集成为一步。

在项目文件夹下创建 .vscode 文件夹,在其中创建 tasks.json 文件,写入以下内容,这主要是定义了一个 build 任务,调用 cmake 进行编译:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build",
      "type": "shell",
      "command": "cmake",
      "args": ["--build", "${workspaceFolder}/build/Debug"],
      "group": { "kind": "build", "isDefault": true },
      "problemMatcher": ["$gcc"],
      "presentation": { "reveal": "always" }
    }
  ]
}

再创建 launch.json 文件,写入以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
{
    "version": "0.2.0",
    "configurations": [
        {
            "cwd": "${workspaceRoot}",
            "executable": "./build/Debug/test1.elf",
            "name": "Debug with OpenOCD",
            "request": "launch",
            "type": "cortex-debug",
            "servertype": "openocd",
            "configFiles": [
                "interface/stlink.cfg",
                "target/stm32f1x.cfg"
            ],
            "searchDir": [],
            "runToEntryPoint": "main",
            "showDevDebugOutput": "none",
            "preLaunchTask": "build"
        }
    ]
}

这边需要相应修改:

  • executable:将 test1 换成你的项目名称
  • configFiles:如果你的开发板是其他 MCU 型号

之后,就可以按下 F5 一键编译、烧录、开启调试啦。

由于 launch.json 中写了 “runToEntryPoint”: “main”,因此在进入 main 中会自动地加入一个断点。

我们可以从这个断点出发进行逐行运行,也可以直接 F5 进入到循环中。

至此,使用 VSCode 进行 Stm32 的内容就结束了。

后续计划

下一篇文章会先介绍一下 STM32CubeMX 生成的项目文件分别是什么,等待学习中…

参考文章


本站不记录浏览量,但如果您觉得本内容有帮助,请点个小红心,让我知道您的喜欢。