You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.txtcubemx/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循环前加:
    // 先声明咱们的应用初始化函数(可以在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();
      }
    }
    
    要是怕重新生成CubeMX代码时覆盖这几行,也可以在CubeMX的IOC配置里添加一个自定义源文件(比如user_main.c),把衔接逻辑写在这个文件里,这样重新生成时不会被覆盖。

这样配置完之后,你就可以在app文件夹里自由写自己的业务代码,完全不用碰cubemx文件夹里的内容。后续更新硬件配置时,直接用CubeMX重新生成代码,然后重新构建项目就行,你的应用代码不会受到任何影响~

火山引擎 最新活动