STM32F407G-DISC1项目:独立应用代码与CubeMX生成CMake代码的整合配置问询
STM32F407G-DISC1项目:独立应用代码与CubeMX生成CMake代码的整合配置问询
你好呀!看你已经搭好了清晰的项目结构,把CubeMX生成的代码和自己的应用代码完全隔离开,这个思路特别棒——能彻底避免后续重新生成CubeMX代码时覆盖自己的工作。接下来咱们一步步配置各个CMake文件,实现两者的无缝整合:
1. 根目录 CMakeLists.txt
这个文件是整个项目的入口,负责统筹CubeMX生成的代码和咱们自己的应用代码。直接替换成下面的内容就行:
cmake_minimum_required(VERSION 3.22) # 自定义整个项目的名称,比如改成你喜欢的"MySTM32Project" project(MySTM32Project LANGUAGES C ASM) # 和CubeMX保持一致的C标准配置 set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS ON) # 导出compile_commands.json,方便clangd等工具做代码索引 set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) # 默认Debug构建,没指定时自动用这个 if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Debug") endif() message(STATUS "当前构建类型: ${CMAKE_BUILD_TYPE}") # 引入CubeMX生成的子项目(不用改CubeMX里的任何文件) add_subdirectory(cubemx) # 引入咱们自己的应用代码子项目 add_subdirectory(app) # 把应用代码链接到CubeMX的可执行目标上,让咱们的代码能调用HAL驱动等资源 target_link_libraries(app PRIVATE cubemx)
2. app/CMakeLists.txt
这个文件专门管理咱们自己的应用代码,配置成静态库形式最灵活:
cmake_minimum_required(VERSION 3.22) # 创建应用代码的静态库目标,名称就叫app add_library(app STATIC) # 添加咱们的所有源文件,后续加新文件直接在这里追加就行 target_sources(app PRIVATE src/app_entry.c src/error_handler.c src/module_uart.c ) # 公开应用的头文件路径,这样CubeMX的代码也能访问咱们的公共接口(如果需要的话) target_include_directories(app PUBLIC inc ) # 这里可以添加应用专属的编译宏定义,比如自定义调试开关,需要时取消注释就行 # target_compile_definitions(app PRIVATE # MY_APP_DEBUG=1 # )
3. 根目录 CMakePresets.json
用这个文件统一构建配置,不用每次cmake都手动输一堆参数:
{ "version": 3, "configurePresets": [ { "name": "default", "hidden": true, "generator": "Ninja", "binaryDir": "${sourceDir}/build/${presetName}", "toolchainFile": "${sourceDir}/cmake/toolchain-arm-none-eabi.cmake", "cacheVariables": {} }, { "name": "Debug", "inherits": "default", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug" } }, { "name": "Release", "inherits": "default", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release" } } ], "buildPresets": [ { "name": "Debug", "configurePreset": "Debug" }, { "name": "Release", "configurePreset": "Release" } ] }
这里指定了咱们自己的工具链文件,完全不用依赖CubeMX自带的工具链配置,自主性更强。
4. 关键注意事项
- 绝对不要修改CubeMX生成的任何文件:包括
cubemx/CMakeLists.txt、cubemx/cmake/stm32cubemx/CMakeLists.txt等,后续重新生成CubeMX代码时这些文件会被覆盖,但咱们的配置都在根目录和app文件夹里,完全不受影响。 - 工具链文件配置:确保
cmake/toolchain-arm-none-eabi.cmake正确指定了ARM交叉编译工具链(比如CMAKE_C_COMPILER设为arm-none-eabi-gcc),链接脚本CubeMX已经生成好了,会自动被使用,不用额外配置。 - 入口函数衔接:CubeMX生成的
main.c里有完整的硬件初始化逻辑,咱们不用动它,只需要在main()里调用自己的应用入口函数就行。比如在CubeMX的main.c的while循环前加:
要是怕重新生成CubeMX代码时覆盖这几行,也可以在CubeMX的IOC配置里添加一个自定义源文件(比如// 先声明咱们的应用初始化函数(可以在app_entry.h里定义) extern void app_init(void); extern void app_main_loop(void); int main(void) { /* CubeMX自动生成的初始化代码,别动它 */ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); // ...其他外设初始化 // 调用咱们的应用初始化 app_init(); while (1) { // 调用咱们的应用主循环 app_main_loop(); } }user_main.c),把衔接逻辑写在这个文件里,这样重新生成时不会被覆盖。
这样配置完之后,你就可以在app文件夹里自由写自己的业务代码,完全不用碰cubemx文件夹里的内容。后续更新硬件配置时,直接用CubeMX重新生成代码,然后重新构建项目就行,你的应用代码不会受到任何影响~




