现今,每家嵌入式芯片厂商基本上都推出了自家的 Eclipse-based IDE 以方便开发者进行快速开发,如 ST 的 STM32CubeIDE、NXP 的 MCUXpresso 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
)。点击左侧栏中的扩展,搜索并安装以下插件:
配置项目
在项目的根目录下创建 .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 命令文件
J-Link Commander 可以使用 J-Link 命令文件 以在批处理模式下执行烧写固件任务。在项目的根目录下创建文件 flash.jlink
,并根据实际情况填写如下内容:
1 2 3 4
| r h loadfile build/led-demo.hex q
|
添加 gdbinit 文件
在项目的根目录下创建文件 reset.gdb
,并填写如下内容:
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}/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 左侧栏的调试,并点击调试按钮:
这将会编译项目,并将固件烧写到目标设备上,然后启动调试:
你可以通过点击源文件的行号左侧以设置断点,也可以观察程序暂停时的变量值、寄存器及调用栈: