
在STM32CubeMX的 Application Structure 选项中选择 Advanced 还是 Basic,主要区别在于生成代码的项目结构组织方式和复杂性,选择哪个取决于你的项目规模、复杂度、个人习惯以及团队协作需求。 以下是两者的核心区别和选择建议:
结构非常简单、扁平。 所有用户编写的应用代码(.c 和 .h 文件)都默认放在 Core/Src 和 Core/Inc 目录下。 main.c 直接位于 Core/Src 中。 生成的 HAL/MSP 初始化代码 (stm32..._hal_msp.c/.h) 也放在 Core/Src 和 Core/Inc 中。 中间件(如 USB Host/Device, FATFS, LwIP 等)的应用程序代码(如果有)也默认混在 Core/Src/Inc 中。 优点: 简单直观: 所有文件都在少数几个目录里,对于新手或非常小的项目来说,容易找到和管理。 快速上手: 无需理解复杂的目录结构,直接开始写 main.c。 编译设置简单: 包含路径相对简单。 缺点: 混乱: 随着项目规模增大,用户代码、HAL初始化代码、中间件代码都混在一起,难以区分和维护。 易被覆盖: 当使用 CubeMX 重新生成代码时,CubeMX 会覆盖 Core/Src 和 Core/Inc 下的文件(除了 / USER CODE BEGIN ... / 和 / USER CODE END ... / 标记之间的用户代码)。如果你在错误的地方添加了代码,很容易被覆盖掉。需要非常小心地使用 USER CODE 区域。 可扩展性差: 不利于模块化设计和代码复用。添加新功能模块时,文件容易堆积在同一个目录下。 不够专业: 不太符合中大型项目或团队协作的代码组织规范。
结构清晰,层次分明,采用功能模块化组织。 核心目录结构通常包含: Application/User: 这是放置你编写的应用代码的主要位置。 包含 main.c, main.h 以及你创建的其他应用模块文件(如 app_led.c/h, app_sensor.c/h 等)。CubeMX 重新生成代码时,默认不会覆盖此目录下的文件(除非你指定覆盖)。 Application/(可能还有 Middleware, Target 等子目录): 用于放置中间件的应用层代码(如 usb_device.c, fatfs.c 等)。 Drivers/STM32..._HAL_Driver: 包含 ST 提供的 HAL 库源文件和头文件。 Drivers/CMSIS: 包含 CMSIS 核心文件、设备特定头文件和启动文件。 Core/Src 和 Core/Inc: 主要放置由 CubeMX 生成和维护的代码,特别是: 系统初始化 (SystemClock_Config) HAL 外设初始化 (MX_GPIO_Init, MX_USART1_UART_Init 等) 外设的 MSP 初始化/反初始化 (HAL_UART_MspInit, HAL_TIM_Base_MspInit 等,在 stm32..._hal_msp.c 中) 中断向量表 (stm32..._it.c/h) Core/Startup: 包含启动文件 (startup_stm32....s). 优点: 清晰分离: 严格区分了用户代码 (Application/User)、CubeMX 生成的初始化/配置代码 (Core/Src/Inc)、HAL 库 (Drivers) 和中间件代码。 这是最大的优势。 安全: 用户代码 (Application/User 下) 受到保护,在 CubeMX 重新生成代码时,默认不会被覆盖。 大大降低了误覆盖的风险。你需要维护的主要是 Core/Src/Inc 中的 / USER CODE BEGIN ... / 区域(用于MSP初始化、回调函数等)。 模块化与可维护性: 鼓励你将应用划分为不同的功能模块(每个模块有自己的 .c/.h 文件放在 Application/User 或其子目录下),代码结构清晰,易于阅读、调试、维护和扩展。 适合团队协作: 清晰的目录结构便于多人分工合作。 符合最佳实践: 更接近现代嵌入式软件项目的组织结构。 缺点: 稍显复杂: 对于绝对初学者或极其简单的项目,目录结构看起来可能有点“重”。 路径设置: 在 IDE 中需要正确设置包含路径(指向 Application/User, Core/Inc, Drivers/.../Inc 等),比 Basic 模式稍繁琐一点(但通常 CubeMX 生成的工程已经设置好了)。 总结与建议 强烈推荐选择 Advanced: 对于绝大多数项目,尤其是你打算认真开发、维护、扩展或者项目复杂度稍高一点的项目,Advanced 结构是更优、更安全、更专业的选择。 它提供的代码分离和保护是至关重要的。 Basic 仅适用于: 你第一次接触 STM32 和 CubeMX,想以最少的干扰快速点个灯、调个串口。 项目极其简单,只有几十行代码,且确定以后不需要扩展。 你只是临时快速验证某个外设功能。 关键实践提示(无论选哪个) 严格使用 USER CODE 区域: 在 Core/Src 和 Core/Inc 下的文件(特别是 main.c, stm32..._hal_msp.c, stm32..._it.c)中,只在 / USER CODE BEGIN ... / 和 / USER CODE END ... / 注释标记之间添加或修改你的代码。这是防止 CubeMX 重新生成代码时覆盖你代码的生命线!在 Advanced 模式下,Application/User 下的文件是安全的。 模块化(Advanced模式下): 在 Application/User 下创建有意义的 .c/.h 文件对来组织你的功能(如 led.c/h, button.c/h, uart_comms.c/h, sensor_driver.c/h)。避免把所有东西都堆在 main.c 里。 理解文件作用域: 清楚知道哪些文件是 CubeMX 生成和维护的(Core/Src/Inc),哪些是你自己编写和维护的 (Application/User 及可能的子目录)。 结论:除非你只是在做最简单、最快速的验证,否则无脑选 Advanced 结构。它能为你避免很多未来的麻烦,并促使你写出更好的代码结构。 克服一点点初期的目录复杂性,会带来长期巨大的维护便利性。 |
经验分享 | STM32CubeMX 生成时钟获取函数的分析
兔哥的最强U5图显【000】——U5G9最小系统绘制
兔哥的ST67——【000】ST67模组订购
基于LORA的环境感知系统
经验分享 | 使用CubeMx配置NVIC时为何不见子优先级?
经验分享 | 三个 ADC 同步模式配置以及 CubeMx 错误配置的解决方法
兔哥的边缘AI【001】——DIY-STM32N6全IO扩展板
兔哥的BLE【002】-WB09最小系统板PCB设计
兔哥的L4【001】——32脚的小板
新版STM32Cube for Visual Studio Code开发体验