VSCode 嵌入式项目设置

现今,每家嵌入式芯片厂商基本上都推出了自家的 Eclipse-based IDE 以方便开发者进行快速开发,如 STSTM32CubeIDENXPMCUXpresso IDE

然而,Eclipse 的编辑功能个人认为并不好用,并且这些 Eclipse-based IDE 运行得并不流畅。因此,我决定自己搭建一个开发环境来替代这些 Eclipse-based IDE。本文以 ST 方案为例,因为我的机器上正好有 STM32CubeMX

先决条件

假定已安装了如下软件:

注:

请确保将 GNU Arm Embedded Toolchain 添加到环境变量 PATH 中。

在 Windows 下,不建议将 J-Link 添加到环境变量 PATH 中,因为它可能会被 JDK 的 jlink 命令覆盖。

创建项目

使用 STM32CubeMX 创建一个新项目,配置好你板子上的外设及时钟,确保启用了调试功能(根据实际选择调试方式):

Project Manager 页下命名项目,并将 Toolchain/IDE 改为 Makefile

点击 GENERATE CODE 以生成项目。项目的目录结构应该如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ tree -aCL 2 .
.
├── .mxproject
├── Core
│   ├── Inc
│   └── Src
├── Drivers
│   ├── CMSIS
│   └── STM32H7xx_HAL_Driver
├── Makefile
├── STM32H743IITx_FLASH.ld
├── led-demo.ioc
└── startup_stm32h743xx.s

安装 VSCode 插件

使用 VSCode 打开生成的项目目录(示例中为 C:\workspace\led-demo)。点击左侧栏中的扩展,搜索并安装以下插件:

  • C/C++ —— 用于 C/C++ 的智能提示、调试和代码查阅。
  • Embedded Tools —— 用于调试嵌入式设备时查看其寄存器及 RTOS 数据。

配置项目

在项目的根目录下创建 .vscode 目录,该目录用于存放工作区设置。此时,项目的目录结构应该如下:

1
2
3
4
5
6
7
8
9
10
$ tree -aCL 1 .
.
├── .mxproject
├── .vscode
├── Core
├── Drivers
├── Makefile
├── STM32H743IITx_FLASH.ld
├── led-demo.ioc
└── startup_stm32h743xx.s

添加 CMSIS-SVD 文件

CMSIS-SVD 文件用于描述 Arm Cortex-M 芯片的详细系统信息,主要是外设的内存映射寄存器。目前没有一个用于统一存储所有 Arm Cortex-M 芯片的 CMSIS-SVD 文件的仓库。但是有一个可用的 Github 仓库,其存储了大量的 CMSIS-SVD 文件:https://github.com/posborne/cmsis-svd,你可以按需下载。

将需要的 CMSIS-SVD 文件保存到项目的根目录下,如本示例(STM32H743x.svd):

1
2
3
4
5
6
7
8
9
10
11
$ tree -aCL 1 .
.
├── .mxproject
├── .vscode
├── Core
├── Drivers
├── Makefile
├── STM32H743IITx_FLASH.ld
├── STM32H743x.svd
├── led-demo.ioc
└── startup_stm32h743xx.s

J-Link Commander 可以使用 J-Link 命令文件 以在批处理模式下执行烧写固件任务。在项目的根目录下创建文件 flash.jlink,并根据实际情况填写如下内容:

1
2
3
4
r
h
loadfile build/led-demo.hex
q

添加 gdbinit 文件

在项目的根目录下创建文件 reset.gdb,并填写如下内容:

1
reset

reset 命令用于重置并停止目标 CPU。确保在使用此命令之前选择设备以使用正确的复位策略。

添加调试设置文件

.vscode 目录下创建 launch.json 文件,并根据实际情况填写如下内容,该文件用于自定义工作区的运行和调试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"configurations": [
{
"name": "Build, Flash and Debug",
"type": "cppdbg",
"request": "launch",
"cwd": "${workspaceFolder}",
"program": "${workspaceFolder}/build/led-demo.elf",
"stopAtEntry": true,
"MIMode": "gdb",
"miDebuggerPath": "C:/gcc-arm-none-eabi/bin/arm-none-eabi-gdb.exe",
"miDebuggerServerAddress": "localhost:2331",
"debugServerPath": "C:/Program Files/SEGGER/JLink/JLinkGDBServerCL.exe",
"debugServerArgs": "-if swd -speed 4000 -endian little -device STM32H743II -x ${workspaceFolder}/reset.gdb",
"svdPath": "${workspaceFolder}/STM32H743x.svd",
"preLaunchTask": "Build and Flash"
}
]
}

添加任务设置文件

.vscode 目录下创建 tasks.json 文件,并根据实际情况填写如下内容,该文件用于定义工作区的任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
"version": "2.0.0",
"tasks": [
{
"label": "Build",
"type": "shell",
"command": "C:/msys64/usr/bin/make.exe",
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "Build and Flash",
"type": "shell",
"command": "C:/Program Files/SEGGER/JLink/JLink.exe",
"args": [
"-Device",
"STM32H743II",
"-If",
"SWD",
"-Speed",
"4000",
"-AutoConnect",
"1",
"-CommandFile",
"flash.jlink"
],
"dependsOn": "Build"
}
]
}

添加 C/C++ 设置文件

.vscode 目录下创建 c_cpp_properties.json 文件,并根据实际情况填写如下内容,该文件用于配置工作区的 C/C++ 插件设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"configurations": [
{
"name": "Win32",
"includePath": [
// 可以使用如下匹配进行目录递归,这将包含工作区的所有目录:
//"${workspaceFolder}/**"

// 单独列出路径可能性能更佳(猜测!)
"${workspaceFolder}/Core/Inc",
"${workspaceFolder}/Drivers/STM32H7xx_HAL_Driver/Inc",
"${workspaceFolder}/Drivers/STM32H7xx_HAL_Driver/Inc/Legacy",
"${workspaceFolder}/Drivers/CMSIS/Include",
"${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32H7xx/Include"
],
"defines": [
"USE_HAL_DRIVER",
"STM32H743xx"
],
"compilerPath": "C:/gcc-arm-none-eabi/bin/arm-none-eabi-gcc.exe",
"cStandard": "c11",
"cppStandard": "c++11",
"intelliSenseMode": "gcc-arm"
}
],
"version": 4
}

调试项目

现在,项目的目录结构应该如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ tree -aCL 2 .
.
├── .mxproject
├── .vscode
│   ├── c_cpp_properties.json
│   ├── launch.json
│   └── tasks.json
├── Core
│   ├── Inc
│   └── Src
├── Drivers
│   ├── CMSIS
│   └── STM32H7xx_HAL_Driver
├── Makefile
├── STM32H743IITx_FLASH.ld
├── STM32H743x.svd
├── flash.jlink
├── led-demo.ioc
├── reset.gdb
└── startup_stm32h743xx.s

点击 VSCode 左侧栏的调试,并点击调试按钮:

这将会编译项目,并将固件烧写到目标设备上,然后启动调试:

你可以通过点击源文件的行号左侧以设置断点,也可以观察程序暂停时的变量值、寄存器及调用栈:


VSCode 嵌入式项目设置
https://dsyx.github.io/2022/03/17/vscode-embedded-project-setup/
作者
Yaoxing Shan
发布于
2022年3月17日
许可协议