这个仓库用于把传统 Keil/SPL 工程,迁移到 VSCode + CMake + STM32CubeCLT 的现代开发流程。
目标不是只“能编译”,而是做到:
- 工程结构清晰(应用层 / 驱动层 / 平台层分离)
- 构建配置可追踪(参数集中、可复用、可移植)
- 调试链路稳定(ST-Link 可重复配置)
- 新人可按步骤上手,不依赖 IDE 向导
当前工程已在 STM32F407VG 场景下打通:可编译、可下载、可调试。
本项目的技术路线是:
- 外设库路线:使用 STM32 SPL(StdPeriph),不是 HAL。
- 构建系统:使用 CMake + Ninja,目标产物为
.elf/.hex/.bin/.map。 - 工具链:
arm-none-eabi-gcc(通过 STM32CubeCLT 提供)。 - 编辑与诊断:VSCode + clangd(读取
compile_commands.json)。 - 调试:VSCode ST-Link 调试适配器(
stlinkgdbtarget)。
核心思想:
把“芯片相关参数”“源码清单”“工具链参数”“调试配置”拆开管理,迁移时只改必要点。
Core/Inc,Core/Src:应用入口、中断、系统初始化、syscallsHARDWARE:板级驱动(LED 等)Drivers/CMSIS:内核与器件头文件Drivers/SPL:SPL 外设驱动源码Startup:启动文件cmake:子 CMake 与工具链配置STM32F40_41xxx_FLASH.ld:链接脚本.vscode:VSCode 构建/调试配置docs:详细流程文档
cmake --preset Debug
cmake --build --preset Debug产物默认在 build/debug/:
STM32Vs-try-SPL.elfSTM32Vs-try-SPL.hexSTM32Vs-try-SPL.binSTM32Vs-try-SPL.map
直接在 VSCode 运行 STM32 ST-Link Debug (CMake) 启动配置。
本工程已固定调试关键项:
deviceName = STM32F407VGdeviceCore = Cortex-M4- 显式指定
gdb/serverExe/serverCwd/serverCubeProgPath
这样可以避开“自动解析 bundle 失败”的常见问题。
下面是推荐的“最短路径”迁移步骤。
按目标芯片替换:
- 启动文件:
Startup/startup_xxx.s - 系统时钟文件:
Core/Src/system_stm32f4xx.c(或对应系列) - 链接脚本:
STM32F40_41xxx_FLASH.ld(改成你的芯片容量)
在 cmake/CMakeLists.txt 的 SPL_DEFINES 修改:
- 芯片族宏(如
STM32F40_41xxx) HSE_VALUE=xxxxxxxU(与你板子晶振一致)
在 cmake/CMakeLists.txt:
APP_SOURCES:加你的业务模块(如USART.c、KEY.c)SPL_SOURCES:确保你用到的 SPL 驱动源码已加入
在 cmake/gcc-arm-none-eabi.cmake 确认:
-mcpu=...-mfpu=...-mfloat-abi=...- 链接脚本路径
-T"...ld"
在 STM32F40_41xxx_FLASH.ld 中修改:
FLASH容量RAM/CCMRAM容量
并保持当前这种权限写法,避免 RWX 警告:
MEMORY里 RAM 使用(rw),不要(xrw)- 只读段使用
(READONLY)
cmake --preset Debug
cmake --build --preset Debug如果能进 main 且外设行为正确,迁移基本完成。
| Keil 位置 | 本工程位置 |
|---|---|
| Options for Target -> C/C++ -> Define | cmake/CMakeLists.txt -> SPL_DEFINES |
| Options for Target -> C/C++ -> Include Paths | cmake/CMakeLists.txt -> SPL_INCLUDE_DIRS |
| 工程分组中的源文件列表 | cmake/CMakeLists.txt -> APP_SOURCES / SPL_SOURCES |
| Target 里的 CPU/FPU/ABI 相关编译参数 | cmake/gcc-arm-none-eabi.cmake -> TARGET_FLAGS |
| Scatter / Linker Script | STM32F40_41xxx_FLASH.ld + 工具链文件里的 -T |
| fromelf 后处理 | 顶层 CMakeLists.txt 里的 objcopy 后处理 |
| 调试器设备型号选择 | .vscode/launch.json -> deviceName / deviceCore |
原因:deviceName 用了料号后缀。
处理:改为 CMSIS 设备名,如 STM32F407VG。
原因:调试插件自动按 Cube 工程解析 bundle 失败。
处理:在 launch.json 显式固定 gdb/serverExe/serverCwd/serverCubeProgPath。
原因:nosys.specs 默认桩函数会告警。
处理:保留并加入 Core/Src/syscalls.c。
原因:链接脚本段权限未显式区分。
处理:按当前链接脚本写法,RAM 用 rw,只读段加 (READONLY)。
- 详细流程文档:
docs/VSCode_STM32_SPL_开发标准流程.md - 技术路线与避坑文档:
docs/VSCode_STM32_SPL_技术路线与迁移避坑.md - 顶层构建入口:
CMakeLists.txt - SPL 配置入口:
cmake/CMakeLists.txt - 工具链配置:
cmake/gcc-arm-none-eabi.cmake