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)和控制寄存器(cr1its和cr3its)的状态来判断中断原因并进行相应的处理,如调用接收函数、传输函数或结束传输函数,并设置错误标志位(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