如何使用STM32 HAL UART驱动程序API和回调?

  • UART TX/RX中涉及哪些回调?
  • 这些回调是如何调用的?
  • 为什么没有调用回调?

1.STM32 HAL UART支持发射机(TX)/接收机(RX)的3种模式:

  • 轮询模式(无DMA,无IRQ)
    • 仅适用于低波特率、阻塞
  • 中断模式(无DMA)
    • 对于每个接收/发送的字符执行中断服务程序(ISR)。
    • 应用程序代码在ISR调用的回调函数中执行。
  • DMA模式
    • 从UART到内存的传输由DMA完成,无需CPU交互。
    • 在高波特率的情况下非常理想,以避免CPU停滞和低功耗模式。
    • 当接收/发送了一定数量的字符时,可以执行中断服务例程(ISR)。
      • 半转移-可选
      • 传输完成
    • 应用程序代码在ISR调用的回调函数中执行。

2.轮询模式

  • 发送/接收功能
    • HAL_UART_Transmit()/HAL_UART_Rereceive()(HAL_UART_发送()/接收()
    • 参数为:
      • 指向数据缓冲区的指针
      • 要发送/接收的数据元素的数量
      • 超时持续时间
数据处理在一个循环中进行内部处理。超时(以毫秒表示)用于防止进程挂起。
当函数返回HAL_OK状态时,操作被视为完成,否则返回错误状态。
 

 

3.中断模式

  • 发送/接收功能
    • HAL_UART_Transmit_IT()/HAL_UART_Receive_IT(
    • 参数为:
      • 指向数据缓冲区的指针
      • 要发送/接收的数据元素的数量
  • 中断服务例程和回调函数
    • UART_IRQ手柄()
    • HAL_UART_IRQHandler()
    • HAL_UART_TxCpltCallback()/HAL_UART_RxCpltCallback()
HAL功能在开始数据处理并启用适当的中断后返回处理状态。
操作的结束由回调函数指示:发送/接收完成或错误。
回调函数在驱动程序中被声明为弱函数,没有可执行的代码。这意味着用户可以在应用程序中再次声明Tx/Rx回调,并对其进行自定义以实时通知进程完成情况并执行一些应用程序代码。

技巧:

  • 什么时候STM32管MX用于生成项目UART中断未启用默认情况下
  • 在任何情况下,如果UART IRQ未启动,请验证是否已启用。在STM32CubeMX的特定情况下,验证NVIC设置中是否有复选标记,以验证中断,如以下屏幕截图所示。

 

4.DMA模式

  • 发送/接收功能
    • HAL_UART_Transmit_DMA()/HAL_UART_Receive_DMA(
    • 参数为:
      • 指向数据缓冲区的指针
      • 要发送/接收的数据元素的数量
  • 中断服务例程和回调函数
    • DMA_IRQHandler()
    • HAL_DMA_IRQ句柄()
    • HAL_UART_TxHalfCpltCallback()/HAL_UART_RxHalfCpltCallback()
    • HAL_UART_TxCpltCallback()/HAL_UART_RxCpltCallback()

原理与中断模式相同,只是DMA完全管理数据缓冲传输。它连续使用数据缓冲区将数据复制到USART数据寄存器中,直到DMA计数器达到0。
当DMA HT(半传输)或TC(传输完成)中断发生时,会调用UART半传输回调或传输完成回调。与中断模式一样,弱默认回调不执行任何代码。它可以在应用程序中声明和自定义。

技巧:

  • 在传输方向上,当最后一个数据已写入UART数据寄存器,但尚未完全从UART传输出去时,触发DMA TC事件(TC事件由DMA触发)。

    • 在循环缓冲区模式中,从HAL_DMA_IRQHandler调用HAL_UART_TxCpltCallback。

    • 在正常缓冲模式下,HAL_UART_TxCpltCallback未被调用从HAL_ DMA_。相反,UART传输完成(UART TC)中断被启用。
      在这种情况下,HAL_UART_TxCpltCallback将从HAL_UART_IRQHandler调用当最后一个数据被完全传输时。
       

                       

  • 什么时候STM32管MX用于生成项目DMA中断已启用默认情况下
  • 什么时候STM32管MX用于生成项目UART中断未启用默认情况下.如果在正常缓冲模式下使用HAL_UART_TxCpltCallback,则必须启用UART中断。
  • 在任何情况下,如果DMA IRQ没有启动,请验证是否已启用。在STM32CubeMX的特定情况下,NVIC设置中应该有复选标记,以验证默认行为,如下面的屏幕截图所示。
  • 在任何情况下,如果未调用HAL_UART_TxCpltCallback并且使用了正常缓冲模式,请验证UART中断是否已启用以及UART_IRQ处理器是否已实现。在STM32CubeMX的特定情况下,NVIC设置中应该有复选标记,以验证UART中断,如下面的屏幕截图所示。

5.如何停止正在进行的转账?

只能停止正在进行的传输在非阻塞模式下、中断或DMA。
中止两个传输(TX和RX),或者可以选择发送或接收信道。
 

  • 基本中止功能
    • HAL_UART_A博尔特()/HAL_UART_AbortTransmit()部分/HAL_UART_Abort接收()


如果需要,可以调用回调来执行一些用户应用程序代码。
 

  • 使用回调中止函数
    • HAL_UART_Abort_IT()/HAR_UART_AbortTransmit_IT()/HAL_UART_A博尔特Receive_IT(
  • 回调函数
    • HAL_UART_AbortCpltCallback/HAL_UART_ABortTransmitPltCallback/HAL_UART-AbortCreceiveCplt回调


最后,特别是当使用DMA时,可以使用以下方法暂停、恢复或停止(中止)传输:
 

  • HAL_UART_DMAP暂停()/HAL_UART_DMAResume大厅()/HAL_UART_DMAStop大厅()

6.更进一步:

  • 以下是STM32Cube MCU固件包中每个STM32系列的示例。
    • 例如C:\<用户名>\STM32Cube\Repository\STM32Cube_FW_H7_1.9.0\Projects\NUCLEO-H223ZG\Examples\UART
  • 用户手册
    • STM32xx HAL和低层驱动器的说明
      • 例如UM2217-STM32H7 HAL和低层驱动器的说明
    • STM32Cubexx系列STM32Cubex入门
      • 例如UM2204-开始使用STM32Cube7,用于STM32H7系列
  • MOOCS公司
    • STM32CubeMX和CubeHAL基础
      • 部分10在3种模式中寻址UART。
    • STM32CubIDE基础知识
      • 第11节STM32CubeIDE/CubeMX上下文中的基本UART示例
  • 常见问题
    • STM32 UART DMA RX/TX
      • 基于UART和DMA的LL(低级)驱动程序。