HAL库串口函数解析

串口句柄 UART_HandleTypeDef

UART_HandleTypeDef UART1_Handler;

定义在stm32f1xx_hal_uart.h的138行左右,这个结构体,作为对 UART 的抽象来使用的。它记录了 UART 相关参数和状态,并提供回调函数的接口,以便用户可以根据需要执行各种操作。

在整个串口的操作中几乎都要用到。

typedef struct __UART_HandleTypeDef
{
  USART_TypeDef                 *Instance;        /*!< UART 寄存器基地址        */

  UART_InitTypeDef              Init;             /*!< UART 通信参数      */

  uint8_t                       *pTxBuffPtr;      /*!< 指向 UART Tx 传输缓冲区的指针 */

  uint16_t                      TxXferSize;       /*!< UART Tx 传输大小              */

  __IO uint16_t                 TxXferCount;      /*!< UART Tx 传输计数器           */

  uint8_t                       *pRxBuffPtr;      /*!< 指向 UART Rx 传输缓冲区的指针 */

  uint16_t                      RxXferSize;       /*!< UART Rx 传输大小              */

  __IO uint16_t                 RxXferCount;      /*!< UART Rx 传输计数器           */

  DMA_HandleTypeDef             *hdmatx;          /*!< UART Tx DMA 句柄参数      */

  DMA_HandleTypeDef             *hdmarx;          /*!< UART Rx DMA 句柄参数      */

  HAL_LockTypeDef               Lock;             /*!< 锁定对象                     */

  __IO HAL_UART_StateTypeDef    gState;           /*!< 与全局句柄管理和 Tx 操作相关的 UART 状态信息。
                                                       此参数可以是 @ref HAL_UART_StateTypeDef 的值 */

  __IO HAL_UART_StateTypeDef    RxState;          /*!< 与 Rx 操作相关的 UART 状态信息。
                                                       此参数可以是 @ref HAL_UART_StateTypeDef 的值 */

  __IO uint32_t                 ErrorCode;        /*!< UART 错误代码                    */

#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  void (* TxHalfCpltCallback)(struct __UART_HandleTypeDef *huart);        /*!< UART Tx 半完成回调        */
  void (* TxCpltCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Tx 完成回调             */
  void (* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart);        /*!< UART Rx 半完成回调        */
  void (* RxCpltCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Rx 完成回调             */
  void (* ErrorCallback)(struct __UART_HandleTypeDef *huart);             /*!< UART 错误回调                   */
  void (* AbortCpltCallback)(struct __UART_HandleTypeDef *huart);         /*!< UART 中止完成回调          */
  void (* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART 中止传输完成回调 */
  void (* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart);  /*!< UART 中止接收完成回调  */
  void (* WakeupCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART 唤醒回调                  */

  void (* MspInitCallback)(struct __UART_HandleTypeDef *huart);           /*!< UART Msp 初始化回调                */
  void (* MspDeInitCallback)(struct __UART_HandleTypeDef *huart);         /*!< UART Msp 去初始化回调              */
#endif  /* USE_HAL_UART_REGISTER_CALLBACKS */

} UART_HandleTypeDef;

串口服务函数 HAL_UART_IRQHandler

HAL_UART_IRQHandler(UART_HandleTypeDef *huart)

解析:

当串口接收或发送数据时,会产生相应的中断,该中断处理函数会根据标志位(isrflags)和控制寄存器(cr1itscr3its)的状态来判断中断原因并进行相应的处理,如调用接收函数、传输函数或结束传输函数,并设置错误标志位(huart->ErrorCode)以便后续处理。

具体而言,

当没有发生错误时,==如果接收缓冲区非空且接收中断使能,则调用接收函数UART_Receive_IT==;如果处于发送模式,调用发送函数

当发生错误时,根据错误类型设置错误标志位,并根据是否使用DMA模式接收数据以及错误类型采取不同的处理方式,如中止传输、关闭DMA请求等。

在上述过程中,还要考虑如何调用错误处理回调函数(huart->ErrorCallback)或者弱错误回调函数(HAL_UART_ErrorCallback())以及是否开启了注册回调函数的功能(USE_HAL_UART_REGISTER_CALLBACKS)。

函数具体解析:

串口中断使能 HAL_UART_Receive_IT

该函数负责开启中断

串口接收函数 UART_Receive_IT

UART_Receive_IT 是真正在接收数据的函数,==但在最后会关闭中断==

同时该函数会调用HAL_UART_RxCpltCallback回调函数,去实现当数据接收完需要实现的业务。

串口发送函数

Last updated