本想着直接打包上传到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库https://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 */