[应用相关] STM32:HAL_xxx_Init()和HAL_xxx_MspInit()之间的区别

[复制链接]
3657|16
 楼主| 麻花油条 发表于 2024-7-26 21:05 | 显示全部楼层 |阅读模式
在任何STM32微控制器上使用HAL(硬件抽象库)时:
对于给定的外设,为什么必须调用HAL _... init(),以及HAL ..._ MspInit() - 为什么几个'inits'分开?
kzlzqi 发表于 2024-7-29 15:13 | 显示全部楼层
HAL_..._Init() 负责外设的高层次初始化,通常涉及到外设功能的配置。这部分是与硬件抽象层直接相关的,它不需要知道具体的硬件实现细节。

HAL_..._MspInit() 负责外设的底层初始化,涉及到硬件的具体设置,如GPIO配置和中断设置。这部分需要了解特定硬件的细节。
申小林一号 发表于 2024-7-29 22:49 | 显示全部楼层
感谢分享
纠结的那些年 发表于 2024-7-31 11:57 | 显示全部楼层
分开初始化函数提供了灵活性。用户可以在 HAL_..._MspInit() 中添加特定硬件的初始化代码,而不必修改 HAL 库本身的代码。这使得 HAL 库能够为不同的硬件平台提供相同的高层次 API,同时允许用户根据需要配置底层硬件细节。
AdaMaYun 发表于 2024-7-31 12:55 | 显示全部楼层
各个初始化对应初始化的范围应该是不一样的
公羊子丹 发表于 2025-3-20 08:20 | 显示全部楼层
HAL_...Init() 是用来初始化外设的,它会配置外设的基本参数、时钟、GPIO等。而 HAL..._MspInit() 主要是用来初始化硬件相关的底层资源,比如中断向量表、外设时钟和 NVIC 配置等。
周半梅 发表于 2025-3-20 08:21 | 显示全部楼层
你可以把 HAL_...Init() 看作是外设初始化,而 HAL..._MspInit() 是外设的低层硬件初始化,主要为外设提供必要的系统资源。
帛灿灿 发表于 2025-3-20 08:22 | 显示全部楼层
其实,HAL_..._MspInit() 是由 STM32 HAL 库定义的低层硬件初始化代码,一般情况下,用户并不需要修改它,除非需要改变底层硬件资源的配置。
童雨竹 发表于 2025-3-20 08:23 | 显示全部楼层
为何分开呢?因为外设的初始化和硬件资源配置是两个独立的过程,外设初始化依赖硬件资源初始化。如果将它们合并会造成不必要的耦合。
万图 发表于 2025-3-20 08:24 | 显示全部楼层
HAL_...MspInit() 是硬件初始化,可以理解为和 MCU 的启动过程紧密相关,而 HAL..._Init() 是外设初始化,更注重外设本身的工作设置。
Wordsworth 发表于 2025-3-20 08:25 | 显示全部楼层
如果你需要在应用层控制外设的初始化顺序或添加额外的硬件配置(例如为外设提供特定的时钟源),就需要在 HAL_..._MspInit() 中进行调整。
Bblythe 发表于 2025-3-20 08:26 | 显示全部楼层
HAL_...Init() 内部会调用 HAL...MspInit() 来完成底层硬件配置。如果你重载了 HAL..._MspInit(),可以改变默认的硬件初始化行为。
Pulitzer 发表于 2025-3-20 08:27 | 显示全部楼层
一般来说,HAL_...Init() 是跨平台的,它不依赖于具体硬件,而 HAL..._MspInit() 需要针对特定的硬件平台进行修改。
Uriah 发表于 2025-3-20 08:28 | 显示全部楼层
对于一些特殊的外设,如果需要自定义外设的硬件配置,你需要修改 HAL_..._MspInit(),如给外设的时钟配置一个不同的时钟源。
Clyde011 发表于 2025-3-20 08:29 | 显示全部楼层
HAL_...Init() 和 HAL..._MspInit() 的分开设计,使得 HAL 层更加模块化,方便开发者定制化配置底层硬件,满足不同应用的需求。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

308

主题

1743

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部