你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

HAL2架构与项目工程格式使用方法

[复制链接]
攻城狮Melo 发布时间:2026-6-29 14:51

摘要

本文介绍在STM32应用开发中HAL2项目工程格式的使用方法,对比说明了HAL2相较于HAL1结构的变更点、新工程结构对用户代码的影响,以及安全配合代码自动生成的操作方式。

文中说明:在HAL2架构下,main.c作为用户主代码区,不再被代码生成工具覆盖;自动生成层具备更强的可移植性与复用性。同时介绍了借助代码生成菜单、代码预览功能保护用户代码的手段、新工程格式适配VS Codeworkspace的方式,以及HAL2中驱动、handles和中断服务函数的组织结构。

简介

HAL2的推出标志着STM32Cube软件生态迎来重要升级。从驱动层面来看,HAL2优化了运行性能与内存占用,为外设handles设计了逻辑更清晰的状态机,并统一依托底层LL接口实现寄存器访问。从工程层面来看,HAL2重构了生成代码的目录架构,同时调整了用户代码的集成方式。

本文梳理HAL1与HAL2在工程格式及文件架构上的差异。

前置准备

需安装下述工具:

1、文件目录结构

1.1 HAL1架构

在HAL1架构中:

image.png

黄色区块为Core文件夹:

  • Core/Inc(头文件目录):包含main.h、stm32zyxx_hal_conf.h、stm32zyxx_it.h等头文件
  • Core/Src(源文件目录):包含main.c、stm32zyxx_hal_msp.c、stm32zyxx_it.c、syscalls.c、sysmem.c、system_stm32zyxx.c等源文件

粉色区块为Drivers文件夹:

  • Drivers/CMSIS/……
  • Drivers/STM32zyxx_HAL_Driver/Inc
  • Drivers/STM32zyxx_HAL_Driver/Src

在该架构下,main.c存放于Core/Src目录,与其他自动生成文件混放。HAL驱动保存在“项目工程本地”的Drivers文件夹中,以下三类代码无明确划分边界:

  • 工具生成代码
  • device/driver包代码
  • 用户自定义代码

工程配置重新生成代码时会覆盖Core目录全部内容(含main.c、stm32zyxx_it.c),用户只能依托文件内/USER CODE/预留区域编写代码。

1.2 HAL2架构

HAL2将工程划分为三层独立目录。

image.png

Generated与DFP(黄色框)

黄色框包含顶层生成目录(内含hal、utilities、misc等子目录)以及stm32c5xx_dfp目录。

本层为generated+DFP(Device Family Pack)层:

  • generated:存放由工程配置生成的代码:
  • HAL初始化与配置代码(mx_系列源码、辅助工具代码)。
  • stm32c5xx_dfp/(命名随芯片系列变化):存放器件固件包内容:
  • Include、Source:器件头文件与启动文件;
  • CMakeLists.txt、RTE_Components.h;
  • IDE补丁与metadata。

该目录归属工具管理:STM32CubeMX2可重新生成或更新本目录内容,不会改动用户应用代码。

代码重新生成时可开启差异对比提示:在STM32CubeMX2的【Project settings】标签页,点击【Advanced】,选择【Custom…】可自定义配置代码生成分类规则。

image.png

HAL驱动软件包(粉色框)

粉色框圈选stm32c5xx_drivers目录:

  • 目录内含:
  • hal、ll
  • os_port、timebases、templates、utils
  • CMakeLists.txt、LICENSE.md、README.md

本目录是该芯片系列对应的HAL2驱动包,独立于工程本体:

  • 作用等同于工程引用的软件包。
  • 不建议在单工程内直接修改。
  • 同芯片系列的多个工程可共用此驱动包。

该结构由HAL1时代Drivers/STM32ZYxx_HAL_Driver迭代优化而来,现已实现标准化打包与版本管控。

用户可修改应用代码(蓝色框)

蓝色框是架构改动最明显的区域,包含user_modifiable用户可编辑目录。

  • 编译输出目录(_debug_GCC_NUCLEO…、_release_GCC_NUCLEO…)
  • Application\STM32C5xx…应用文件夹。
  • 关键存在多版本main文件:
  • main.c
  • [email]main.base@0.1.0[/email]
  • main.h
  • [email]main.base@0.1.0.h[/email]

本区域明确标注为用户可修改:

  • main.c为用户代码文件。
  • main.base@…是工具生成的备份模板文件,用于版本比对与代码迁移,不作为业务逻辑开发位置。
  • 应用代码编辑路径:
  • user_modifiable/main.c
  • 用户在该目录下自行新增的各类源码。

如需避免main.c被生成操作覆盖,建议将分类规则改为【Custom】,用户可编辑文件选项配置为【Don’t generate】或【Backup】。

image.png

和HAL1的关键区别:main.c不再存放于工具管控的Core/Src生成目录内,而是单独放在标识明确的用户目录下,HAL2工具在重新生成代码时默认不会覆盖该文件。

1.3 HAL1与HAL2对比

image.png

HAL1

  • 工程源码、生成代码与用户自定义代码全部混杂在 Core、Drivers 目录下。
  • main.c由工具生成,用户代码只能写在 USER CODE 注释标记区间内。
  • HAL 驱动仅作为 Drivers 下普通子目录存在。

HAL2

  • 工程目录拆分为三层独立结构:
  • generated + stm32c5xx_dfp:依赖配置、由生成工具管控的代码;
  • stm32c5xx_drivers:对应芯片系列的HAL2/LL驱动软件包;
  • user_modifiable:应用层代码(含main.c),归属用户所有。
  • 重新生成仅更新生成目录与软件包配置,user_modifiable源码完整保留。
  • 在VS Code资源管理器中可直观区分可修改目录与禁止改动目录。

简言之,HAL2把HAL1杂乱混编的单目录工程,拆分为三层架构:device package、generated HAL、独立隔离的用户应用区(main.c置于该区核心)。

**总结

**

HAL1与HAL2对比可见:工程架构从代码混杂模式升级为分层规整架构。HAL1中main.c、生成代码、HAL驱动共处Core与Drivers文件夹,重生成极易误改用户业务代码。

HAL2实现功能解耦:配置相关代码存放于生成目录;器件包与HAL2驱动分别封装在stm32c5xx_dfp、stm32c5xx_drivers;用户文件(重点是main.c)移入专属user_modifiable目录,工具管控目录和用户开发目录一目了然。

由此代码生成更安全、版本升级更便捷;工程移植至新开发板/芯片时,只需重新生成HAL2层,原有应用代码可直接复用。HAL2配套驱动质量更优,工程结构健壮、易于维护。

收藏 评论0 发布时间:2026-6-29 14:51

举报

0个回答

所属标签

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版