STM32HAL(一)外设驱动框架与回调函数应用

前言:这段时间开始学习STM32F4,同时为了以后的便捷性性就开始学HAL库了

目录

HAL库文件

基本文件结构

API命名规则

HAL库回调函数

HAL_ XXX _MspInit() / _MspDeInit()

HAL_PPP_MspInit()

HAL_PPP_MspDeInit()

HAL_PPP_ProcessCpltCallback

HAL_PPP_ErrorCallback


HAL库文件

基本文件结构

stm32f1xx_hal_XXX.cstm32f1xx_hal_XXX.h

这些是基础的外设驱动文件,包含外设的基本功能函数声明与定义,如初始化、读写、控制及状态获取等

stm32f1xx_hal_XXX_ex.cstm32f1xx_hal_XXX_ex.h

扩展文件,提供对基础外设驱动的补充功能,包括更高级或特定配置的功能实现。

API命名规则

  • 函数命名HAL_XXX_Function
    • XXX 表示外设或功能模块名称,例如 GPIO 对应通用输入输出端口,TIM 对应定时器。
    • Function 描述函数执行的操作,如初始化 (Init)、读 (Read)、写 (Write) 等。
    • Eg. HAL_GPIO_表示GPIO相关函数,HAL_TIM_对应定时器函数等。
  • 如:初始化/反初始化函数:HAL_XXX_Init(), HAL_XXX_DeInit()

    外设读写函数:HAL_ XXX _Read(),HAL_XXX_Write(),HAL_XXX_Transmit(), HAL_XXX_Receive()

    控制函数:HAL_ XXX _Set (),HAL_ XXX _Get ()

    状态和错误:HAL_ XXX _GetState (), HAL_ XXX _GetError ()

HAL库回调函数

HAL_ XXX _MspInit() / _MspDeInit()

上述函数是与外设(XXX代表任何特定外设,比如USART, TIM, SPI)相关的CMSIS-OS(或称为HAL库的OS抽象层)初始化和反初始化函数。这两个函数主要用于处理与操作系统(如果有使用)和硬件相关的低级设置,它们是用户自定义的函数,需要用户根据实际项目需求来实现。

HAL_PPP_MspInit()

  • 目的此函数用于外设的初期硬件配置和资源分配,特别是那些不在HAL库标准初始化中涵盖的部分。它通常涉及到GPIO的配置(如复用、上拉/下拉设置)、时钟使能、DMA通道配置(如果该外设使用了DMA)、NVIC中断使能等操作。
  • 调用时机:当你调用像HAL_UART_Init()这样的HAL外设初始化函数时,HAL库内部会自动调用对应的HAL_UART_MspInit()来完成底层的系统配置。
  • 实现:用户需要根据项目需求,在这个函数里添加必要的硬件初始化代码。这为开发者提供了高度的灵活性,以便于适应不同的硬件设计和系统要求。

HAL_PPP_MspDeInit()

  • 目的:与HAL_PPP_MspInit()相对应,此函数用于释放由HAL_PPP_MspInit()配置的资源,进行硬件状态的恢复或清理工作。它在你调用诸如HAL_UART_DeInit()之类的函数时被调用,用来反初始化外设相关的硬件设置,如关闭时钟、禁用中断、释放DMA通道等。
  • 调用时机:当不再需要某个外设服务,准备重新配置或释放资源时。
  • 实现:同样需要用户根据实际配置进行实现,确保所有之前由MspInit配置的资源得到妥善清理,以便于外设能够被正确地重新初始化或系统资源可以被其他组件复用。

注意事项

这两个函数不是HAL库本身提供的,而是作为用户层接口,需要用户在自己的项目中定义和实现。

HAL_PPP_ProcessCpltCallback

是一个在STM32 HAL库中用于处理特定外设(PPP代表任何特定的外设,如USART、SPI、I2C、ADC等)操作完成回调的函数指针。这个函数让用户有机会在某个外设操作(如数据传输、转换完成等)完成后执行自定义的操作。它是HAL库提供的一种事件通知机制,使得用户代码能够在异步操作完成时得到通知并采取相应行动。

目的:

  • 通知机制:当一个异步过程(如DMA传输、ADC转换等)完成时,HAL库会自动调用这个回调函数,通知用户层程序操作已经成功结束。
  • 后续处理:允许用户在操作完成的瞬间执行后续逻辑,比如数据处理、状态更新、触发下一个任务或控制流程等。
  • 灵活性:提供了一种灵活的方式来定制化处理各种操作完成后的场景,增强了代码的模块化和可维护性。

实现方式:

  • 定义:用户需要在自己的代码中定义这个回调函数,其原型通常如下所示:
    void HAL_PPP_ProcessCpltCallback(PERIPH_HandleTypeDef *hperiph);

    其中PERIPH_HandleTypeDef *hperiph是指向相应外设句柄的指针,包含了外设的状态信息和配置。

  • 注册:用户需要在初始化外设或配置操作时,将这个回调函数的地址赋给相应的句柄结构体中的回调函数指针成员。这样,当操作完成时,HAL库就能找到并调用这个函数。
  • 使用场景:例如,在使用HAL库进行DMA传输时,可以设置HAL_DMA_Transmit_DMA()之后的完成回调为HAL_PPP_ProcessCpltCallback,以在DMA传输完成后执行特定的处理逻辑。

HAL_PPP_ErrorCallback

是STM32 HAL库中用于处理特定外设(PPP代表任何特定外设,如USART、SPI、I2C等)错误情况的回调函数。当外设发生错误时,HAL库会自动调用这个用户自定义的函数,以便用户可以及时得知错误情况并采取相应的错误处理措施。这为开发者提供了一种灵活的方式,来应对硬件操作过程中可能出现的各种异常情况。

目的:

  • 错误通知:当外设操作中检测到错误,如通信错误、DMA传输错误、超时、硬件故障等,HAL库通过调用此回调函数来通知用户。
  • 错误处理:用户可以在该函数中实现具体的错误处理逻辑,比如清除错误标志、重启外设、记录错误日志、执行故障恢复流程等。
  • 提高鲁棒性:通过适当的错误处理,可以增强系统的稳定性和可靠性,避免因单一错误导致整个系统崩溃。

实现方式:

  • 定义:用户需根据需要在自己的代码中定义此函数,其原型通常如下:
    void HAL_PPP_ErrorCallback(PERIPH_HandleTypeDef *hperiph);

    其中PERIPH_HandleTypeDef *hperiph指向发生错误的外设句柄,包含了错误状态和其他相关信息。

  • 注册:通常情况下,HAL库在初始化外设时会默认注册一个空的错误回调函数。用户可根据需要覆盖这个默认的回调,将自己的实现赋值给外设句柄结构中的相应成员,例如huart.ErrorCode和huart.ErrorCallback。
  • 使用场景:适用于所有使用HAL库进行外设操作的场合,尤其是涉及复杂交互和可能产生多种错误条件的应用中。

注意事项:错误码检查:在HAL_PPP_ErrorCallback内部,应该检查外设句柄中的错误码(hperiph.ErrorCode)来确定具体的错误类型,从而采取相应的处理措施。

 

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值