16、STM32F1系列HAL库 源码注释汉化 stm32f1xx_hal_uart.h

本想着直接打包上传到CSDN,可现在资源审核好严格,直接给毙了。

觉得有用的点点点赞、收藏!

随便贴点代码水水。到发文时为止,已汉化内容:

HAL库驱动头文件(hal.h文件,48个)
HAL库驱动文件(hal.c 文件,42个)
外设访问层头文件(stm32f1xxx.h 寄存器宏定义文件,15个)
工具链向量表(.s文件,43个)
LL库(正在进行)
...
 本汉化只对库中注释进行汉化,所有原版校对完成的文件,实际代码均与官方原库一致 使用方法按官方库即可。(除部分原版代码报错的调整,修改条目见:使用说明)

源库文件来自ST官网:

版本:V1.8.0 + V1.8.5更新补丁(2023/10/7(官方更新记录2023/4/7))

长期下载链接(更新地址):

STM32F1汉化版HAL库icon-default.png?t=N7T8https://10heart.lanzouj.com/s/stm32f1-cnstm32f1xx_hal_uart.h

/**
  ******************************************************************************
  * @file    stm32f1xx_hal_uart.h
  * @author  MCD Application Team
  * @brief   HAL库 UART 模块驱动头文件
  ******************************************************************************
  * @attention
  *
  * 版权所有 (c) 2016 STMicroelectronics。
  * 保留所有权利。
  *
  * 本软件根据可以在此软件组件的根目录中找到的 LICENSE 文件中的条款进行许可。
  * 如果此软件没有附带 LICENSE 文件,则按原样提供。
  *
  ******************************************************************************
  */

/* 定义防止递归 -------------------------------------*/
#ifndef __STM32F1xx_HAL_UART_H
#define __STM32F1xx_HAL_UART_H

#ifdef __cplusplus
extern "C" {
#endif

/* 头文件 ------------------------------------------------------------------*/
#include "stm32f1xx_hal_def.h"

/** @addtogroup STM32F1xx_HAL_Driver
  * @{
  */

/** @addtogroup UART
  * @{
  */

/* 导出类型 ------------------------------------------------------------*/
/** @defgroup UART_Exported_Types UART 导出类型
  * @{
  */

/**
  * @brief UART 初始化结构体
  */
typedef struct
{
  uint32_t BaudRate;                  /*!< 这个成员用于配置UART通信的波特率。
                                           波特率使用以下公式计算:
                                           - IntegerDivider = ((PCLKx) / (16 * (huart->Init.BaudRate)))
                                           - FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 16) + 0.5 */

  uint32_t WordLength;                /*!< 指定在一帧中传输或接收的数据位数。
                                           该参数可以是@ref UART_Word_Length中的值之一。 */

  uint32_t StopBits;                  /*!< 指定要传输的停止位数。
                                           此参数可以是@ref UART_Stop_Bits的值之一。 */

  uint32_t Parity;                    /*!< 指定奇偶校验模式
                                           此参数可以是@ref UART_Parity中的值。
                                           注意:当启用奇偶校验时,计算得到的奇偶校验位将插入在发送数据的最高位位置
                                           (当字长设置为9位数据位时,是第9位,当字长设置为8位数据位时,是第8位)。 */

  uint32_t Mode;                      /*!< 指定接收或发送模式是否启用或禁用。
                                           此参数可以是 @ref UART_Mode 中的值之一。 */

  uint32_t HwFlowCtl;                 /*!< 指定硬件流控模式是否启用
                                           该参数可以是@ref UART_Hardware_Flow_Control中的值。 */

  uint32_t OverSampling;              /*!< 指定是否启用或禁用过采样8以实现更高的速度(最高可达fPCLK/8)
                                           此参数可以是@ref UART_Over_Sampling中的值。
                                           此功能仅适用于STM32F100xx系列,因此OverSampling参数应始终设置为16。 */
} UART_InitTypeDef;

/**
  * @brief HAL UART 状态枚举
  * @note  HAL UART状态值是由两个不同的子状态组合而成的:gState和RxState
  *        - gState包含与全局句柄管理相关的UART状态信息,以及与Tx操作相关的信息。
  *          gState的值编码遵循下面描述的位图:
  *          b7-b6  错误信息
  *             00 : 无错误
  *             01 : (未使用)
  *             10 : 超时
  *             11 : 错误
  *          b5     外设初始化状态
  *             0  : 复位 (外设未初始化)
  *             1  : 初始化完成 (外设已初始化。HAL UART Init函数已经被调用)
  *          b4-b3  (未使用)
  *             xx : 应当被设置为00
  *          b2     内部进程状态
  *             0  : 就绪
  *             1  : 忙碌 (外设正忙于某些配置或内部操作)
  *          b1     (未使用)
  *             x  : 应当被设置为0
  *          b0     Tx 状态
  *             0  : 就绪 (无发送操作正在进行)
  *             1  : 忙碌 (发送操作正在进行)
  *        - RxState包含与Rx操作相关的信息。
  *          RxState值的编码遵循下面描述的位图:
  *          b7-b6  (未使用)
  *             xx : 应当被设置为00
  *          b5     外设初始化状态
  *             0  : 复位 (外设未初始化)
  *             1  : 初始化完成 (外设已初始化)
  *          b4-b2  (未使用)
  *            xxx : 应当被设置为000
  *          b1     Rx 状态
  *             0  : 就绪 (无接收操作正在进行)
  *             1  : 忙碌 (接收操作正在进行)
  *          b0     (未使用)
  *             x  : 应当被设置为0.
  */
typedef enum
{
  HAL_UART_STATE_RESET             = 0x00U,    /*!< 外设未初始化
                                                   “gState”和“RxState”变量可以使用该值 */
  HAL_UART_STATE_READY             = 0x20U,    /*!< 外设已初始化且就绪
                                                   “gState”和“RxState”变量可以使用该值 */
  HAL_UART_STATE_BUSY              = 0x24U,    /*!< 内部进程正在运行
                                                   仅“gState”变量可以使用该值 */
  HAL_UART_STATE_BUSY_TX           = 0x21U,    /*!< 正在发送数据
                                                   仅“gState”变量可以使用该值 */
  HAL_UART_STATE_BUSY_RX           = 0x22U,    /*!< 正在接收数据
                                                   仅“RxState”变量可以使用该值 */
  HAL_UART_STATE_BUSY_TX_RX        = 0x23U,    /*!< 数据传输和接收过程正在进行中
                                                   不应该用于gState或RxState
                                                   该值是gState和RxState值之间组合(或操作)的结果 */
  HAL_UART_STATE_TIMEOUT           = 0xA0U,    /*!< 超时状态
                                                   仅“gState”变量可以使用该值 */
  HAL_UART_STATE_ERROR             = 0xE0U     /*!< 错误
                                                   仅“gState”变量可以使用该值 */
} HAL_UART_StateTypeDef;

/**
  * @brief HAL UART 接收类型定义
  * @note  HAL UART 接收类型值旨在标识正在进行的接收类型
  *         此参数可以是@ref UART_Reception_Type_Values中的值:
  *           HAL_UART_RECEPTION_STANDARD         = 0x00U,
  *           HAL_UART_RECEPTION_TOIDLE           = 0x01U,
  */
typedef uint32_t HAL_UART_RxTypeTypeDef;

/**
  * @brief HAL UART Rx 事件类型定义
  * @note  HAL UART Rx 事件类型值旨在标识已发生的事件类型,导致调用RxEvent回调函数
  *         此参数可以是@ref UART_RxEvent_Type_Values中的值:
  *           HAL_UART_RXEVENT_TC                 = 0x00U,
  *           HAL_UART_RXEVENT_HT                 = 0x01U,
  *           HAL_UART_RXEVENT_IDLE               = 0x02U,
  */
typedef uint32_t HAL_UART_RxEventTypeTypeDef;

/**
  * @brief  UART 句柄结构体
  */
typedef struct __UART_HandleTypeDef
{
  USART_TypeDef                 *Instance;        /*!< UART 寄存器基地址        */

  UART_InitTypeDef              Init;             /*!< UART 通信参数(初始化配置)      */

  const 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 接收计数         */

  __IO HAL_UART_RxTypeTypeDef ReceptionType;      /*!< 正在进行的接收类型          */

  __IO HAL_UART_RxEventTypeTypeDef RxEventType;   /*!< Rx 事件类型                   */

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

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

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

  __IO HAL_UART_StateTypeDef    gState;           /*!< 与全局句柄管理相关的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 发送过半回调    */
  void (* TxCpltCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART 发送完成回调     */
  void (* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart);        /*!< UART 接收过半回调   */
  void (* RxCpltCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART 接收完成回调   */
  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 (* RxEventCallback)(struct __UART_HandleTypeDef *huart, uint16_t Pos); /*!< 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;

#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
/**
  * @brief  HAL UART 回调 ID 枚举
  */
typedef enum
{
  HAL_UART_TX_HALFCOMPLETE_CB_ID         = 0x00U,    /*!< UART 发送过半回调 ID        */
  HAL_UART_TX_COMPLETE_CB_ID             = 0x01U,    /*!< UART 发送完成回调 ID             */
  HAL_UART_RX_HALFCOMPLETE_CB_ID         = 0x02U,    /*!< UART 接收过半回调 ID        */
  HAL_UART_RX_COMPLETE_CB_ID             = 0x03U,    /*!< UART 接收完成回调 ID             */
  HAL_UART_ERROR_CB_ID                   = 0x04U,    /*!< UART 错误回调 ID                   */
  HAL_UART_ABORT_COMPLETE_CB_ID          = 0x05U,    /*!< UART 中止完成回调 ID          */
  HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID = 0x06U,    /*!< UART 中止发送完成回调 ID */
  HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID  = 0x07U,    /*!< UART 中止接收完成回调 ID  */
  HAL_UART_WAKEUP_CB_ID                  = 0x08U,    /*!< UART 唤醒回调 ID                  */

  HAL_UART_MSPINIT_CB_ID                 = 0x0BU,    /*!< UART MspInit 回调 ID                 */
  HAL_UART_MSPDEINIT_CB_ID               = 0x0CU     /*!< UART MspDeInit 回调 ID               */

} HAL_UART_CallbackIDTypeDef;

/**
  * @brief  HAL UART 回调指针
  */
typedef  void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart);  /*!< UART 回调函数指针 */
typedef  void (*pUART_RxEventCallbackTypeDef)(struct __UART_HandleTypeDef *huart, uint16_t Pos);   /*!< 指向特定于UART Rx事件的回调函数的指针 */

#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

/**
  * @}
  */

/* 导出常量 --------------------------------------------------------*/
/** @defgroup UART_Exported_Constants UART 导出常量
  * @{
  */

/** @defgroup UART_Error_Code UART 错误代码
  * @{
  */
#define HAL_UART_ERROR_NONE              0x00000000U   /*!< 无错误       */
#define HAL_UART_ERROR_PE                0x00000001U   /*!< 奇偶校验错误   */
#define HAL_UART_ERROR_NE                0x00000002U   /*!< 噪音错误   */
#define HAL_UART_ERROR_FE                0x00000004U   /*!< 帧错误   */
#define HAL_UART_ERROR_ORE               0x00000008U   /*!< 溢出错误   */
#define HAL_UART_ERROR_DMA               0x00000010U   /*!< DMA 传输错误  */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
#define  HAL_UART_ERROR_INVALID_CALLBACK 0x00000020U   /*!< 无效回调错误  */
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
/**
  * @}
  */

/** @defgroup UART_Word_Length UART 数据长度
  * @{
  */
#define UART_WORDLENGTH_8B                  0x00000000U               /* 8位 */
#define UART_WORDLENGTH_9B                  ((uint32_t)USART_CR1_M)   /* 9位 */
/**
  * @}
  */

/** @defgroup UART_Stop_Bits UART 停止位数量
  * @{
  */
#define UART_STOPBITS_1                     0x00000000U                   /* 1停止位 */
#define UART_STOPBITS_2                     ((uint32_t)USART_CR2_STOP_1)  /* 2停止位 */
/**
  * @}
  */

/** @defgroup UART_Parity UART 奇偶校验
  * @{
  */
#define UART_PARITY_NONE                    0x00000000U                                 /* 无校验 */
#define UART_PARITY_EVEN                    ((uint32_t)USART_CR1_PCE)                   /* 偶校验 */
#define UART_PARITY_ODD                     ((uint32_t)(USART_CR1_PCE | USART_CR1_PS))  /* 奇校验 */
/**
  * @}
  */

/** @defgroup UART_Hardware_Flow_Control UART 硬件流控
  * @{
  */
#define UART_HWCONTROL_NONE                  0x00000000U                                    /* 无流控 */
#define UART_HWCONTROL_RTS                   ((uint32_t)USART_CR3_RTSE)                     /* RTS流控 */
#define UART_HWCONTROL_CTS                   ((uint32_t)USART_CR3_CTSE)                     /* CTS流控 */
#define UART_HWCONTROL_RTS_CTS               ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE))  /* RTS CTS流控 */
/**
  * @}
  */

/** @defgroup UART_Mode UART 传输模式
  * @{
  */
#define UART_MODE_RX                        ((uint32_t)USART_CR1_RE)                    /* 接收模式 */
#define UART_MODE_TX                        ((uint32_t)USART_CR1_TE)                    /* 发送模式 */
#define UART_MODE_TX_RX                     ((uint32_t)(USART_CR1_TE | USART_CR1_RE))   /* 收发模式 */
/**
  * @}
  */

/** @defgroup UART_State UART 状态
  * @{
  */
#define UART_STATE_DISABLE                  0x00000000U               /* 禁用 */
#define UART_STATE_ENABLE                   ((uint32_t)USART_CR1_UE)  /* 启用 */
/**
  * @}
  */

/** @defgroup UART_Over_Sampling UART 过采样
  * @{
  */
#define UART_OVERSAMPLING_16                    0x00000000U                   /* 16位过采样 */
#if defined(USART_CR1_OVER8)
#define UART_OVERSAMPLING_8                     ((uint32_t)USART_CR1_OVER8)   /* 8位过采样 */
#endif /* USART_CR1_OVER8 */
/**
  * @}
  */

/** @defgroup UART_LIN_Break_Detection_Length  UART LIN断开符检测长度
  * @{
  */
#define UART_LINBREAKDETECTLENGTH_10B      0x00000000U                    /* 10位的断开符检测 */
#define UART_LINBREAKDETECTLENGTH_11B      ((uint32_t)USART_CR2_LBDL)     /* 11位的断开符检测 */
/**
  * @}
  */

/** @defgroup UART_WakeUp_functions  UART 唤醒方法
  * @{
  */
#define UART_WAKEUPMETHOD_IDLELINE                0x00000000U                   /* 总线空闲唤醒 */
#define UART_WAKEUPMETHOD_ADDRESSMARK             ((uint32_t)USART_CR1_WAKE)    /* 地址唤醒 */
/**
  * @}
  */

/** @defgroup UART_Flags   UART 标志
  *        元素值约定: 0xXXXX
  *           - 0xXXXX  : SR 寄存器上的标志掩码
  * @{
  */
#define UART_FLAG_CTS                       ((uint32_t)USART_SR_CTS)  /* UART CTS标志 */
#define UART_FLAG_LBD                       ((uint32_t)USART_SR_LBD)  /* UART LIN断开检测标志 */
#define UART_FLAG_TXE                       ((uint32_t)USART_SR_TXE)  /* UART 发送寄存器空标志 */
#define UART_FLAG_TC                        ((uint32_t)USART_SR_TC)   /* UART 发送完成标志 */
#define UART_FLAG_RXNE                      ((uint32_t)USART_SR_RXNE) /* UART 接收数据寄存器非空标志 */
#define UART_FLAG_IDLE                      ((uint32_t)USART_SR_IDLE) /* UART 空闲标志 */
#define UART_FLAG_ORE                       ((uint32_t)USART_SR_ORE)  /* UART 溢出标志 */
#define UART_FLAG_NE                        ((uint32_t)USART_SR_NE)   /* UART 噪声错误标志 */
#define UART_FLAG_FE                        ((uint32_t)USART_SR_FE)   /* UART 帧错误标志 */
#define UART_FLAG_PE                        ((uint32_t)USART_SR_PE)   /* UART 校验值错误 */
/**
  * @}
  */

/** @defgroup UART_Interrupt_definition  UART 中断定义
  *        元素值约定: 0xY000XXXX
  *           - XXXX  : Y寄存器中的中断屏蔽位(16位)
  *           - Y  : 中断源寄存器 (2bits)
  *                   - 0001: CR1 寄存器
  *                   - 0010: CR2 寄存器
  *                   - 0011: CR3 寄存器
  * @{
  */

#define UART_IT_PE                       ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_PEIE))   /* UART 校验中断 */
#define UART_IT_TXE                      ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_TXEIE))  /* UART 发送寄存器空中断 */
#define UART_IT_TC                       ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_TCIE))   /* UART 发送完成中断 */
#define UART_IT_RXNE                     ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_RXNEIE)) /* UART 接收寄存器非空中断 */
#define UART_IT_IDLE                     ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_IDLEIE)) /* UART 空闲中断 */

#define UART_IT_LBD                      ((uint32_t)(UART_CR2_REG_INDEX << 28U | USART_CR2_LBDIE))  /* UART LIN断开符检测中断 */

#define UART_IT_CTS                      ((uint32_t)(UART_CR3_REG_INDEX << 28U | USART_CR3_CTSIE))  /* UART CTS流控中断 */
#define UART_IT_ERR                      ((uint32_t)(UART_CR3_REG_INDEX << 28U | USART_CR3_EIE))    /* UART 错误中断 */
/**
  * @}
  */

/** @defgroup UART_Reception_Type_Values  UART 接收类型
  * @{
  */
#define HAL_UART_RECEPTION_STANDARD          (0x00000000U)             /*!< 标准接收                */
#define HAL_UART_RECEPTION_TOIDLE            (0x00000001U)             /*!< 接收直到完成或空闲事件  */
/**
  * @}
  */

/** @defgroup UART_RxEvent_Type_Values  UART Rx事件类型
  * @{
  */
#define HAL_UART_RXEVENT_TC                  (0x00000000U)             /*!< RxEvent 与传输完成事件相关联 */
#define HAL_UART_RXEVENT_HT                  (0x00000001U)             /*!< RxEvent 与传输过半事件关联     */
#define HAL_UART_RXEVENT_IDLE                (0x00000002U)             /*!< RxEvent 与空闲事件关联 */
/**
  * @}
  */

/**
  * @}
  */

/* 导出宏 ------------------------------------------------------------*/
/** @defgroup UART_Exported_Macros UART 导出宏
  * @{
  */

/** @brief 重置 UART 句柄 gstate & RxState
  * @param  __HANDLE__ 指定 UART 句柄
  *         UART句柄选择USARTx或UARTy外设
  *         (USART,UART的可用性和x、y的值取决于设备)
  * @retval None
  */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
#define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__)  do{                                                   
                                                       (__HANDLE__)->gState = HAL_UART_STATE_RESET;      
                                                       (__HANDLE__)->RxState = HAL_UART_STATE_RESET;     
                                                       (__HANDLE__)->MspInitCallback = NULL;             
                                                       (__HANDLE__)->MspDeInitCallback = NULL;           
                                                     } while(0U)
#else
#define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__)  do{                                                   
                                                       (__HANDLE__)->gState = HAL_UART_STATE_RESET;      
                                                       (__HANDLE__)->RxState = HAL_UART_STATE_RESET;     
                                                     } while(0U)
#endif /*USE_HAL_UART_REGISTER_CALLBACKS */

/** @brief  刷新 UART数据寄存器(DR)的内容
  * @param  __HANDLE__ 指定 UART 句柄
  *         UART句柄选择USARTx或UARTy外设
  *         (USART,UART的可用性和x、y的值取决于设备)
  */
#define __HAL_UART_FLUSH_DRREGISTER(__HANDLE__) ((__HANDLE__)->Instance->DR)

/** @brief  检查指定的UART标志是否被设置
  * @param  __HANDLE__ 指定 UART 句柄
  *         UART句柄选择USARTx或UARTy外设
  *         (USART,UART的可用性和x、y的值取决于设备)
  * @param  __FLAG__ 指定要检查的标志
  *        这个参数可以是以下值之一:
  *            @arg UART_FLAG_CTS:  CTS 改变标志(UART4 和 UART5 不可用)
  *            @arg UART_FLAG_LBD:  LIN断开检测标志
  *            @arg UART_FLAG_TXE:  发送数据寄存器空标志
  *            @arg UART_FLAG_TC:   发送完成标志
  *            @arg UART_FLAG_RXNE: 接收数据寄存器非空标志
  *            @arg UART_FLAG_IDLE: 总线空闲标志
  *            @arg UART_FLAG_ORE:  溢出错误标志
  *            @arg UART_FLAG_NE:   噪声错误标志
  *            @arg UART_FLAG_FE:   帧错误标志
  *            @arg UART_FLAG_PE:   校验错误标志
  * @retval __FLAG__ 状态 (TRUE 或 FALSE).
  */
#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__))

/** @brief  清除指定的 UART 标志挂起
  * @param  __HANDLE__ 指定 UART 句柄
  *         UART句柄选择USARTx或UARTy外设
  *         (USART,UART的可用性和x、y的值取决于设备)
  * @param  __FLAG__ 指定要清除的标志
  *          该参数可以是以下值的任意组合:
  *            @arg UART_FLAG_CTS:  CTS 改变标志(UART4 和 UART5 不可用).
  *            @arg UART_FLAG_LBD:  LIN断开检测标志.
  *            @arg UART_FLAG_TC:   发送完成标志.
  *            @arg UART_FLAG_RXNE: 接收数据寄存器非空标志.
  *
  * @note   PE(奇偶校验错误)、FE(帧错误)、NE(噪声错误)、ORE(溢出错误)和IDLE(检测到空闲线路)标志由软件序列清除:先对USART_SR寄存器进行读取操作,然后对USART_DR寄存器进行读取操作。
  * @note   RXNE标志位也可以通过读取USART_DR寄存器来清除
  * @note   TC标志位也可以通过软件序列进行清除:先读取USART_SR寄存器,然后写入USART_DR寄存器。
  * @note   TXE标志位只能通过向USART_DR寄存器写入数据来清除。
  *
  * @retval None
  */
#define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__))

/** @brief  清除 UART PE 奇偶校验错误标志挂起
  * @param  __HANDLE__ 指定 UART 句柄
  *         UART句柄选择USARTx或UARTy外设
  *         (USART,UART的可用性和x、y的值取决于设备)
  * @retval None
  */
#define __HAL_UART_CLEAR_PEFLAG(__HANDLE__)     
  do{                                           
    __IO uint32_t tmpreg = 0x00U;               
    tmpreg = (__HANDLE__)->Instance->SR;        
    tmpreg = (__HANDLE__)->Instance->DR;        
    UNUSED(tmpreg);                             
  } while(0U)

/** @brief  清除 UART FE 帧错误标志标志挂起
  * @param  __HANDLE__ 指定 UART 句柄
  *         UART句柄选择USARTx或UARTy外设
  *         (USART,UART的可用性和x、y的值取决于设备)
  * @retval None
  */
#define __HAL_UART_CLEAR_FEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__)

/** @brief  清除 UART NE 噪声错误标志挂起
  * @param  __HANDLE__ 指定 UART 句柄
  *         UART句柄选择USARTx或UARTy外设
  *         (USART,UART的可用性和x、y的值取决于设备)
  * @retval None
  */
#define __HAL_UART_CLEAR_NEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__)

/** @brief   清除 UART ORE 溢出错误标志挂起
  * @param  __HANDLE__ 指定 UART 句柄
  *         UART句柄选择USARTx或UARTy外设
  *         (USART,UART的可用性和x、y的值取决于设备)
  * @retval None
  */
#define __HAL_UART_CLEAR_OREFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__)

/** @brief  清除 UART IDLE 空闲标志挂起
  * @param  __HANDLE__ 指定 UART 句柄
  *         UART句柄选择USARTx或UARTy外设
  *         (USART,UART的可用性和x、y的值取决于设备)
  * @retval None
  */
#define __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__)

/** @brief  启用指定的 UART 中断
  * @param  __HANDLE__ 指定 UART 句柄
  *         UART句柄选择USARTx或UARTy外设
  *         (USART,UART的可用性和x、y的值取决于设备)
  * @param  __INTERRUPT__ 指定要开启的中断源
  *          这个参数可以是以下值之一:
  *            @arg UART_IT_CTS:  CTS 改变中断
  *            @arg UART_IT_LBD:  LIN断开检测中断
  *            @arg UART_IT_TXE:  发送数据寄存器空中断
  *            @arg UART_IT_TC:   发送完成中断
  *            @arg UART_IT_RXNE: 接收数据寄存器非空中断
  *            @arg UART_IT_IDLE: 总线空闲中断
  *            @arg UART_IT_PE:   奇偶校验错误中断
  *            @arg UART_IT_ERR:  错误中断(帧错误、噪声错误、溢出错误)
  * @retval None
  */
#define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)   ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__HANDLE__)->Instance->CR1 |= ((__INTERRUPT__) & UART_IT_MASK)): 
                                                           (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__HANDLE__)->Instance->CR2 |= ((__INTERRUPT__) & UART_IT_MASK)): 
                                                           ((__HANDLE__)->Instance->CR3 |= ((__INTERRUPT__) & UART_IT_MASK)))

/** @brief  禁用指定的 UART 中断
  * @param  __HANDLE__ 指定 UART 句柄
  *         UART句柄选择USARTx或UARTy外设
  *         (USART,UART的可用性和x、y的值取决于设备)
  * @param  __INTERRUPT__ 指定要关闭的中断
  *          这个参数可以是以下值之一:
  *            @arg UART_IT_CTS:  CTS 改变中断
  *            @arg UART_IT_LBD:  LIN断开检测中断
  *            @arg UART_IT_TXE:  发送数据寄存器空中断
  *            @arg UART_IT_TC:   发送完成中断
  *            @arg UART_IT_RXNE: 接收数据寄存器非空中断
  *            @arg UART_IT_IDLE: 总线空闲中断
  *            @arg UART_IT_PE:   奇偶校验错误中断
  *            @arg UART_IT_ERR:  错误中断(帧错误、噪声错误、溢出错误)
  * @retval None
  */
#define __HAL_UART_DISABLE_IT(__HANDLE__, __INTERRUPT__)  ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__HANDLE__)->Instance->CR1 &= ~((__INTERRUPT__) & UART_IT_MASK)): 
                                                           (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__HANDLE__)->Instance->CR2 &= ~((__INTERRUPT__) & UART_IT_MASK)): 
                                                           ((__HANDLE__)->Instance->CR3 &= ~ ((__INTERRUPT__) & UART_IT_MASK)))

/** @brief  检查指定的UART中断是否已发生
  * @param  __HANDLE__ 指定 UART 句柄
  *         UART句柄选择USARTx或UARTy外设
  *         (USART,UART的可用性和x、y的值取决于设备)
  * @param  __IT__ 指定要检查的中断
  *          这个参数可以是以下值之一:
  *            @arg UART_IT_CTS:  CTS 改变中断 (不可用于 UART4 和 UART5)
  *            @arg UART_IT_LBD:  LIN断开检测中断
  *            @arg UART_IT_TXE:  发送数据寄存器空中断
  *            @arg UART_IT_TC:   发送完成中断
  *            @arg UART_IT_RXNE: 接收数据寄存器非空中断
  *            @arg UART_IT_IDLE: 总线空闲中断
  *            @arg UART_IT_ERR:  错误中断
  * @retval __IT__ 状态 (TRUE 或 FALSE).
  */
#define __HAL_UART_GET_IT_SOURCE(__HANDLE__, __IT__) (((((__IT__) >> 28U) == UART_CR1_REG_INDEX)? (__HANDLE__)->Instance->CR1:(((((uint32_t)(__IT__)) >> 28U) == UART_CR2_REG_INDEX)? 
                                                       (__HANDLE__)->Instance->CR2 : (__HANDLE__)->Instance->CR3)) & (((uint32_t)(__IT__)) & UART_IT_MASK))

/** @brief  开启 CTS 流控
  * @note   这个宏允许为给定的UART实例启用CTS硬件流控制,而无需调用HAL_UART_Init()函数。
  *         由于涉及直接访问UART寄存器,因此使用该宏应该得到用户的完全支持。
  * @note   预计使用宏来修改CTS硬件流控制特性的激活,而无需进行USART实例的反初始化/初始化。调用宏的条件应满足以下要求:
  *           - UART实例应已经初始化(通过调用HAL_UART_Init()函数)。
  *           - 仅当相应的UART实例被禁用(即__HAL_UART_DISABLE(HANDLE))时,才能调用宏,并且应跟随一个启用宏(即__HAL_UART_ENABLE(HANDLE))。
  * @param  __HANDLE__ 指定 UART 句柄
  *         句柄实例可以是任何支持硬件流控制特性的USARTx。它用于选择USART外设(USART可用性和x值取决于设备)。
  * @retval None
  */
#define __HAL_UART_HWCONTROL_CTS_ENABLE(__HANDLE__)        
  do{                                                      
    ATOMIC_SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE);  
    (__HANDLE__)->Init.HwFlowCtl |= USART_CR3_CTSE;        
  } while(0U)

/** @brief  关闭 CTS 流控
  * @note   这个宏允许为给定的UART实例启用CTS硬件流控制,而无需调用HAL_UART_Init()函数。
  *         由于涉及直接访问UART寄存器,因此使用该宏应该得到用户的完全支持。
  * @note   预计使用宏来修改CTS硬件流控制特性的激活,而无需进行USART实例的反初始化/初始化。调用宏的条件应满足以下要求:
  *           - UART实例应已经初始化(通过调用HAL_UART_Init()函数)。
  *           - 仅当相应的UART实例被禁用(即__HAL_UART_DISABLE(HANDLE))时,才能调用宏,并且应跟随一个启用宏(即__HAL_UART_ENABLE(HANDLE))。
  * @param  __HANDLE__ 指定 UART 句柄
  *         句柄实例可以是任何支持硬件流控制特性的USARTx。它用于选择USART外设(USART可用性和x值取决于设备)。
  * @retval None
  */
#define __HAL_UART_HWCONTROL_CTS_DISABLE(__HANDLE__)        
  do{                                                       
    ATOMIC_CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE); 
    (__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_CTSE);      
  } while(0U)

/** @brief  开启 RTS 流控
  *         这个宏允许在不需要调用 HAL_UART_Init() 函数的情况下,禁用给定 UART 实例的 RTS 硬件流控制。
  *         由于涉及直接访问UART寄存器,因此使用该宏应该得到用户的完全支持。
  * @note   宏只能在相应的 UART 实例被禁用时调用(即 __HAL_UART_DISABLE(HANDLE)),并且应该在启用宏(即 __HAL_UART_ENABLE(HANDLE))之后调用。
  *           - UART实例应已经初始化(通过调用HAL_UART_Init()函数)。
  *           - 仅当相应的UART实例被禁用(即__HAL_UART_DISABLE(HANDLE))时,才能调用宏,并且应跟随一个启用宏(即__HAL_UART_ENABLE(HANDLE))。
  * @param  __HANDLE__ 指定 UART 句柄
  *         句柄实例可以是任何支持硬件流控制特性的USARTx。它用于选择USART外设(USART可用性和x值取决于设备)。
  * @retval None
  */
#define __HAL_UART_HWCONTROL_RTS_ENABLE(__HANDLE__)       
  do{                                                     
    ATOMIC_SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE); 
    (__HANDLE__)->Init.HwFlowCtl |= USART_CR3_RTSE;       
  } while(0U)

/** @brief  关闭 RTS 流控
  *         这个宏允许在不需要调用 HAL_UART_Init() 函数的情况下,禁用给定 UART 实例的 RTS 硬件流控制。
  *         由于涉及直接访问UART寄存器,因此使用该宏应该得到用户的完全支持。
  * @note   宏只能在相应的 UART 实例被禁用时调用(即 __HAL_UART_DISABLE(HANDLE)),并且应该在启用宏(即 __HAL_UART_ENABLE(HANDLE))之后调用。
  *           - UART实例应已经初始化(通过调用HAL_UART_Init()函数)。
  *           - 仅当相应的UART实例被禁用(即__HAL_UART_DISABLE(HANDLE))时,才能调用宏,并且应跟随一个启用宏(即__HAL_UART_ENABLE(HANDLE))。
  * @param  __HANDLE__ 指定 UART 句柄
  *         句柄实例可以是任何支持硬件流控制特性的USARTx。它用于选择USART外设(USART可用性和x值取决于设备)。
  * @retval None
  */
#define __HAL_UART_HWCONTROL_RTS_DISABLE(__HANDLE__)       
  do{                                                      
    ATOMIC_CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE);
    (__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_RTSE);     
  } while(0U)
#if defined(USART_CR3_ONEBIT)

/** @brief  启用UART的单比特采样方法
  * @param  __HANDLE__ 指定 UART 句柄
  * @retval None
  */
#define __HAL_UART_ONE_BIT_SAMPLE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3|= USART_CR3_ONEBIT)

/** @brief  禁用UART的单比特采样方法
  * @param  __HANDLE__ 指定 UART 句柄
  * @retval None
  */
#define __HAL_UART_ONE_BIT_SAMPLE_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3
                                                       &= (uint16_t)~((uint16_t)USART_CR3_ONEBIT))
#endif /* UART_ONE_BIT_SAMPLE_Feature */

/** @brief  启用 UART
  * @param  __HANDLE__ 指定 UART 句柄
  * @retval None
  */
#define __HAL_UART_ENABLE(__HANDLE__)               ((__HANDLE__)->Instance->CR1 |=  USART_CR1_UE)

/** @brief  禁用 UART
  * @param  __HANDLE__ 指定 UART 句柄
  * @retval None
  */
#define __HAL_UART_DISABLE(__HANDLE__)              ((__HANDLE__)->Instance->CR1 &=  ~USART_CR1_UE)
/**
  * @}
  */

/* 导出函数 --------------------------------------------------------*/
/** @addtogroup UART_Exported_Functions
  * @{
  */

/** @addtogroup UART_Exported_Functions_Group1 初始化和反初始化函数
  * @{
  */

/* 初始化和反初始化函数  **********************************/

HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength);
HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod);
HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart);
void HAL_UART_MspInit(UART_HandleTypeDef *huart);
void HAL_UART_MspDeInit(UART_HandleTypeDef *huart);

/* 注册/注销回调函数  ***********************************/

#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID,
                                            pUART_CallbackTypeDef pCallback);
HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID);

HAL_StatusTypeDef HAL_UART_RegisterRxEventCallback(UART_HandleTypeDef *huart, pUART_RxEventCallbackTypeDef pCallback);
HAL_StatusTypeDef HAL_UART_UnRegisterRxEventCallback(UART_HandleTypeDef *huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

/**
  * @}
  */

/** @addtogroup UART_Exported_Functions_Group2 IO 操作函数
  * @{
  */

/* IO 操作函数 *******************************************************/

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart);

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen,
                                           uint32_t Timeout);
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

HAL_UART_RxEventTypeTypeDef HAL_UARTEx_GetRxEventType(UART_HandleTypeDef *huart);

/* 传输中止函数 */

HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart);

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);
void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart);

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size);

/**
  * @}
  */

/** @addtogroup UART_Exported_Functions_Group3
  * @{
  */
/* 外设控制函数  ************************************************/

HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart);
/**
  * @}
  */

/** @addtogroup UART_Exported_Functions_Group4
  * @{
  */
/* 外设状态函数  **************************************************/

HAL_UART_StateTypeDef HAL_UART_GetState(const UART_HandleTypeDef *huart);
uint32_t              HAL_UART_GetError(const UART_HandleTypeDef *huart);
/**
  * @}
  */

/**
  * @}
  */
/* 私有类型 -------------------------------------------------------------*/
/* 私有变量 ---------------------------------------------------------*/
/* 私有常量 ---------------------------------------------------------*/
/** @defgroup UART_Private_Constants UART 私有常量
  * @{
  */
/** @brief UART 中断标志掩码
  *
  */
#define UART_IT_MASK                     0x0000FFFFU

#define UART_CR1_REG_INDEX               1U
#define UART_CR2_REG_INDEX               2U
#define UART_CR3_REG_INDEX               3U
/**
  * @}
  */

/* 私有宏 ------------------------------------------------------------*/
/** @defgroup UART_Private_Macros UART 私有宏
  * @{
  */
#define IS_UART_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B) || 
                                     ((LENGTH) == UART_WORDLENGTH_9B))
#define IS_UART_LIN_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B))
#define IS_UART_STOPBITS(STOPBITS) (((STOPBITS) == UART_STOPBITS_1) || 
                                    ((STOPBITS) == UART_STOPBITS_2))
#define IS_UART_PARITY(PARITY) (((PARITY) == UART_PARITY_NONE) || 
                                ((PARITY) == UART_PARITY_EVEN) || 
                                ((PARITY) == UART_PARITY_ODD))
#define IS_UART_HARDWARE_FLOW_CONTROL(CONTROL)
                              (((CONTROL) == UART_HWCONTROL_NONE) || 
                               ((CONTROL) == UART_HWCONTROL_RTS) || 
                               ((CONTROL) == UART_HWCONTROL_CTS) || 
                               ((CONTROL) == UART_HWCONTROL_RTS_CTS))
#define IS_UART_MODE(MODE) ((((MODE) & 0x0000FFF3U) == 0x00U) && ((MODE) != 0x00U))
#define IS_UART_STATE(STATE) (((STATE) == UART_STATE_DISABLE) || 
                              ((STATE) == UART_STATE_ENABLE))
#if defined(USART_CR1_OVER8)
#define IS_UART_OVERSAMPLING(SAMPLING) (((SAMPLING) == UART_OVERSAMPLING_16) || 
                                        ((SAMPLING) == UART_OVERSAMPLING_8))
#endif /* USART_CR1_OVER8 */
#define IS_UART_LIN_OVERSAMPLING(SAMPLING) (((SAMPLING) == UART_OVERSAMPLING_16))
#define IS_UART_LIN_BREAK_DETECT_LENGTH(LENGTH) (((LENGTH) == UART_LINBREAKDETECTLENGTH_10B) || 
                                                 ((LENGTH) == UART_LINBREAKDETECTLENGTH_11B))
#define IS_UART_WAKEUPMETHOD(WAKEUP) (((WAKEUP) == UART_WAKEUPMETHOD_IDLELINE) || 
                                      ((WAKEUP) == UART_WAKEUPMETHOD_ADDRESSMARK))
#define IS_UART_BAUDRATE(BAUDRATE) ((BAUDRATE) <= 4500000U)
#define IS_UART_ADDRESS(ADDRESS) ((ADDRESS) <= 0x0FU)

#define UART_DIV_SAMPLING16(_PCLK_, _BAUD_)            (((_PCLK_)*25U)/(4U*(_BAUD_)))
#define UART_DIVMANT_SAMPLING16(_PCLK_, _BAUD_)        (UART_DIV_SAMPLING16((_PCLK_), (_BAUD_))/100U)
#define UART_DIVFRAQ_SAMPLING16(_PCLK_, _BAUD_)        ((((UART_DIV_SAMPLING16((_PCLK_), (_BAUD_)) - (UART_DIVMANT_SAMPLING16((_PCLK_), (_BAUD_)) * 100U)) * 16U)
                                                         + 50U) / 100U)
/* UART BRR = mantissa + overflow + fraction
            = (UART DIVMANT << 4) + (UART DIVFRAQ & 0xF0) + (UART DIVFRAQ & 0x0FU) */
#define UART_BRR_SAMPLING16(_PCLK_, _BAUD_)            (((UART_DIVMANT_SAMPLING16((_PCLK_), (_BAUD_)) << 4U) + 
                                                         (UART_DIVFRAQ_SAMPLING16((_PCLK_), (_BAUD_)) & 0xF0U)) + 
                                                        (UART_DIVFRAQ_SAMPLING16((_PCLK_), (_BAUD_)) & 0x0FU))

#define UART_DIV_SAMPLING8(_PCLK_, _BAUD_)             (((_PCLK_)*25U)/(2U*(_BAUD_)))
#define UART_DIVMANT_SAMPLING8(_PCLK_, _BAUD_)         (UART_DIV_SAMPLING8((_PCLK_), (_BAUD_))/100U)
#define UART_DIVFRAQ_SAMPLING8(_PCLK_, _BAUD_)         ((((UART_DIV_SAMPLING8((_PCLK_), (_BAUD_)) - (UART_DIVMANT_SAMPLING8((_PCLK_), (_BAUD_)) * 100U)) * 8U)
                                                         + 50U) / 100U)
/* UART BRR = mantissa + overflow + fraction
            = (UART DIVMANT << 4) + ((UART DIVFRAQ & 0xF8) << 1) + (UART DIVFRAQ & 0x07U) */
#define UART_BRR_SAMPLING8(_PCLK_, _BAUD_)             (((UART_DIVMANT_SAMPLING8((_PCLK_), (_BAUD_)) << 4U) + 
                                                         ((UART_DIVFRAQ_SAMPLING8((_PCLK_), (_BAUD_)) & 0xF8U) << 1U)) + 
                                                        (UART_DIVFRAQ_SAMPLING8((_PCLK_), (_BAUD_)) & 0x07U))

/**
  * @}
  */

/* 私有函数 ---------------------------------------------------------*/
/** @defgroup UART_Private_Functions UART 私有函数
  * @{
  */

HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef UART_Start_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

/**
  * @}
  */

/**
  * @}
  */

/**
  * @}
  */

#ifdef __cplusplus
}
#endif

#endif /* __STM32F1xx_HAL_UART_H */