文章目录
- 前言
- 综述
- 函数介绍
- HAL_UART_Init
- HAL_HalfDuplex_Init
- HAL_LIN_Init
- HAL_MultiProcessor_Init
- HAL_UART_DeInit
- HAL_UART_MspInit
- HAL_UART_MspDeInit
- HAL_UART_Transmit
- HAL_UART_Receive
- HAL_UART_Transmit_IT
- HAL_UART_Receive_IT
- HAL_UART_Transmit_DMA
- HAL_UART_Receive_DMA
- HAL_UART_DMAPause
- HAL_UART_DMAResume
- HAL_UART_DMAStop
- HAL_UART_IRQHandler
- HAL_UART_TxCpltCallback
- HAL_UART_TxHalfCpltCallback
- HAL_UART_RxCpltCallback
- HAL_UART_RxHalfCpltCallback
- HAL_UART_ErrorCallback
- HAL_LIN_SendBreak
- HAL_MultiProcessor_EnterMuteMode
- HAL_MultiProcessor_ExitMuteMode
- HAL_HalfDuplex_EnableTransmitter
- HAL_HalfDuplex_EnableReceiver
- HAL_UART_GetState
- HAL_UART_GetError
- 结构体
前言
本篇文章主要介绍STM32F429的HAL库中UART的用法。主要参考资料为:
- Description of STM32F4 HAL and low-layer drivers
本文中将枚举类型归入到结构体中介绍,严格说是不严谨的。但是为了方便,姑且如此操作。
综述
用法
- 声明一个UART_HandleTypeDef句柄结构体(UART_HandleTypeDef huart)。
- 通过重定义函数HAL_UART_MspInit()初始化UART底层资源。
- 使能 UARTx接口时钟。
- UART管脚配置
- 使能对应GPIO的时钟。
- 配置UART管脚,并且配置成上拉。
- 如果需要使用中断,需要配置NVIC。(HAL_UART_Transmit_IT(,HAL_UART_Receive_IT() 以及 HAL_UART_TransmitReceive_IT())
- 配置 UARTx的中断优先级。
- 使能NVIC UART IRQ。
- 如果你需要使用DMA功能,则进行DMA配置。(HAL_UART_Transmit_DMA(),HAL_UART_Receive_DMA() 以及HAL_UART_TransmitReceive_DMA())。
- 声明一个发送/接收流的DMA句柄结构体。
- 使能DMAx接口时钟。
- 通过所需的参数配置已被声明的DMA句柄结构体。
- 配置DMA发送/接收流。
- 将已被初始化的DMA句柄与UART DMA 收发句柄连接。
- 配置优先级,使能DMA传输完成。
- 配置UARTx中断优先级并启用NVIC UART IRQ句柄(用于DMA非循环模式下的最后一个字节发送完成检测)。
- 在初始化结构体huart中,配置波特率,字长,停止位,奇偶校验,流控制等。
- 通过调用 HAL_UART_Init()函数初始化UART寄存器。
1.将会调用HAL_UART_MspInit()初始化UART底层资源。
三种模式
轮询模式
- 通过使用HAL_UART_Transmit()阻塞模式发送大量数据。
- 通过使用HAL_UART_Receive()阻塞模式接收大量数据。
中断模式
- 使用HAL_UART_Transmit_IT()函数非阻塞模式发送大量数据。
- 在发送数据之后,HAL_UART_TxHalfCpltCallback函数会被自动调用。用户可以自定义该函数。
- 使用HAL_UART_Receive_IT()函数非阻塞模式接收大量数据。
- 在接收数据之后,HAL_UART_RxCpltCallback函数会被自动调用。用户可以自定义该函数。
- 若出现传输错误,HAL_UART_ErrorCallback()函数将会被调用。
DMA模式
- 使用HAL_UART_Transmit_DMA()函数以非阻塞的方式发送大量数据。
- 在半传输发送完成后,函数HAL_UART_TxHalfCpltCallback会被调用,用户可自定义其内容。
- 在传输发送完成后,函数HAL_UART_TxCpltCallback会被调用,用户可自定义其内容。
- 使用HAL_UART_Receive_DMA()函数以非阻塞的方式接收大量数据。
- 在半传输接收完成后,函数HAL_UART_RxHalfCpltCallback会被调用,用户可自定义其内容。
- 在传输接收完成后,函数HAL_UART_RxCpltCallback会被调用,用户可自定义其内容。
- 若传输过程中出现错误,函数HAL_UART_ErrorCallback()会被调用,用户可以自定义其内容。
- HAL_UART_DMAPause()暂停传输
- HAL_UART_DMAResume()继续传输
- HAL_UART_DMAStop()停止传输
宏列表
- __HAL_UART_ENABLE: 使能UART
- __HAL_UART_DISABLE: 禁用UART
- __HAL_UART_GET_FLAG : 检测标志位
- __HAL_UART_CLEAR_FLAG : 清除标志位
- __HAL_UART_ENABLE_IT: 使能中断
- __HAL_UART_DISABLE_IT: 禁止中断
注意: 还有更多的宏定义参考<stm32f4xx_hal_UART.h>
函数介绍
HAL_UART_Init
函数原型
HAL_StatusTypeDef HAL_UART_Init (UART_HandleTypeDef * huart)
根据结构体 UART_HandleTypeDef中指定的参数初始化UART模式。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
HAL_HalfDuplex_Init
函数原型
HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart)
初始化串口半双工模式。根据结构体UART_InitTypeDef指定其参数,并且创界句柄huart。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
HAL_LIN_Init
函数原型
HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength)
根据结构体UART_InitTypeDef中指定的参数,创建对应的句柄huart,从而初始化LIN模式。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
- BreakDetectLength:指定LIN中断检测长度。该参数可以取值为:
/** @defgroup UART_LIN_Break_Detection_Length UART LIN Break Detection Length
* @{
*/
#define UART_LINBREAKDETECTLENGTH_10B ((uint32_t)0x00000000)
#define UART_LINBREAKDETECTLENGTH_11B ((uint32_t)0x00000020)
/**
* @}
*/
返回类型
HAL_MultiProcessor_Init
函数原型
HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod)
根据huart提供的参数初始化多处理器模式。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
- Address:串口地址
- WakeUpMethod:指定串口唤醒方法。该参数可以取值为:
/** @defgroup UART_WakeUp_functions UART Wakeup Functions
* @{
*/
#define UART_WAKEUPMETHOD_IDLELINE ((uint32_t)0x00000000)
#define UART_WAKEUPMETHOD_ADDRESSMARK ((uint32_t)0x00000800)
/**
* @}
*/
返回类型
HAL_UART_DeInit
函数原型
HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart)
注销串口UART外设。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
HAL_UART_MspInit
函数原型
__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart)
串口MSP初始化。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
- 无
HAL_UART_MspDeInit
函数原型
__weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart)
注销串口MSP初始化。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
- 无
HAL_UART_Transmit
函数原型
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
以阻塞的方式单工发送大量数据。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
- pData: 发送缓存数组的指针。
- Size: 发送缓存数组的长度。
- Timeout:超时时间。
返回类型
HAL_UART_Receive
函数原型
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
以阻塞的方式,接收大量的数据。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
- pData: 发送缓存数组的指针。
- Size: 发送缓存数组的长度。
- Timeout:超时时间。
返回类型
HAL_UART_Transmit_IT
函数原型
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
以非阻塞的方式发送大量数据。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
- pData: 发送缓存数组的指针。
- Size: 发送缓存数组的长度。
返回类型
HAL_UART_Receive_IT
以非阻塞的方式接收大量数据。
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
- pData: 发送缓存数组的指针。
- Size: 发送缓存数组的长度。
返回类型
HAL_UART_Transmit_DMA
函数原型
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)```
以非阻塞的方式发送大量数据。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
- pData: 发送缓存数组的指针。
- Size: 发送缓存数组的长度。
返回类型
HAL_UART_Receive_DMA
函数模型
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
以非阻塞的方式接收大量数据。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
- pData: 发送缓存数组的指针。
- Size: 发送缓存数组的长度。
返回类型
注意
- 当奇偶校验使能时(PCE=1),接收数据包含校验位。
HAL_UART_DMAPause
函数原型
HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart)```
DMA传输停止
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
HAL_UART_DMAResume
函数模型
HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart)
DMA传输恢复
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
HAL_UART_DMAStop
函数原型
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
DMA传输停止
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
HAL_UART_IRQHandler
函数原型
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
该函数处理串口中断请求。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
- 无
HAL_UART_TxCpltCallback
函数原型
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
TX传输完成回调函数。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
- 无
HAL_UART_TxHalfCpltCallback
__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
Tx半传输完成回调。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
- 无
HAL_UART_RxCpltCallback
函数原型
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
接收完成回调
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
- 无
HAL_UART_RxHalfCpltCallback
函数原型
__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
接收半传输完成回调
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
- 无
HAL_UART_ErrorCallback
函数原型
__weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
- 无
HAL_LIN_SendBreak
函数模型
HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart)
传输中断字符。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
HAL_MultiProcessor_EnterMuteMode
函数模型
HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart)
进入沉默模式。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
HAL_MultiProcessor_ExitMuteMode
函数模型
HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart)
退出沉默模式
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
HAL_HalfDuplex_EnableTransmitter
函数模型
HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart)
使能发送,禁用接收。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
HAL_HalfDuplex_EnableReceiver
函数模型
HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart)
使能接收,禁用发送
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
HAL_UART_GetState
函数模型
HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart)
返回串口状态。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
HAL_UART_GetError
函数模型
uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart)
返回串口错误代码。
参数
- huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
返回类型
结构体
HAL_StatusTypeDef
/**
* @brief HAL Status structures definition
*/
typedef enum
{
HAL_OK = 0x00,
HAL_ERROR = 0x01,
HAL_BUSY = 0x02,
HAL_TIMEOUT = 0x03
} HAL_StatusTypeDef;
UART_HandleTypeDef
/**
* @brief UART handle Structure definition
*/
typedef struct
{
USART_TypeDef *Instance; /* UART registers base address */
UART_InitTypeDef Init; /* UART communication parameters */
uint8_t *pTxBuffPtr; /* Pointer to UART Tx transfer Buffer */
uint16_t TxXferSize; /* UART Tx Transfer size */
__IO uint16_t TxXferCount; /* UART Tx Transfer Counter */
uint8_t *pRxBuffPtr; /* Pointer to UART Rx transfer Buffer */
uint16_t RxXferSize; /* UART Rx Transfer size */
__IO uint16_t RxXferCount; /* UART Rx Transfer Counter */
DMA_HandleTypeDef *hdmatx; /* UART Tx DMA Handle parameters */
DMA_HandleTypeDef *hdmarx; /* UART Rx DMA Handle parameters */
HAL_LockTypeDef Lock; /* Locking object */
__IO HAL_UART_StateTypeDef gState; /* UART communication state */
__IO uint32_t ErrorCode; /* UART Error code */
}UART_HandleTypeDef;
/**
* @}
*/
Instance(UART寄存器基地址)
结构体UART_TypeDef 的指针,一般取值为:
#define USART1 ((UART_TypeDef *) UART1_BASE)
#define USART2 ((UART_TypeDef *) UART2_BASE)
#define USART3 ((UART_TypeDef *) UART3_BASE)
#define UART4 ((UART_TypeDef *) UART4_BASE)
#define UART5 ((UART_TypeDef *) UART5_BASE)
#define USART6 ((UART_TypeDef *) UART6_BASE)
#define UART7 ((USART_TypeDef *) UART7_BASE)
#define UART8 ((USART_TypeDef *) UART8_BASE)
在F429中,共有8路串口。
Init(UART通信参数)
结构体UART_InitTypeDef 的指针。在该指针中包含串口通信的最重要参数,波特率,校验位等。
pTxBuffPtr(发送端缓存指针)
发送端缓存数组的指针。
TxXferSize(发送缓存长度)
发送端缓存数组的长度。
TxXferCount(发送端缓存计数器)
发送端缓存数组计数器。
pRxBuffPtr(接收端缓存指针)
接收端缓存数组指针。
RxXferSize(接收端缓存长度)
接收端缓存数组的长度。
RxXferCount(接收端缓存计数器)
接收端缓存数组的计数器。
hdmatx(发送端DMA句柄)
串口发送端DMA句柄参数。关于这部分信息,在DMA中详细展开,此处不再详细展开。
hdmarx(接收端DMA句柄)
串口接收端DMA句柄。
Lock(锁)
枚举类型 HAL_LockTypeDef的变量。用于锁定资源,以防止意外访问,改变数据。关于该结构体的用法,此处不再详细展开。
typedef enum
{
HAL_UNLOCKED = 0x00,
HAL_LOCKED = 0x01
} HAL_LockTypeDef;
State(状态)
串口状态,为枚举类型HAL_UART_StateTypeDef变量,可以取值为:
/**
* @brief HAL State structures definition
*/
typedef enum
{
HAL_UART_STATE_RESET = 0x00, /*!< Peripheral is not yet Initialized */
HAL_UART_STATE_READY = 0x01, /*!< Peripheral Initialized and ready for use */
HAL_UART_STATE_BUSY = 0x02, /*!< an internal process is ongoing */
HAL_UART_STATE_BUSY_TX = 0x12, /*!< Data Transmission process is ongoing */
HAL_UART_STATE_BUSY_RX = 0x22, /*!< Data Reception process is ongoing */
HAL_UART_STATE_BUSY_TX_RX = 0x32, /*!< Data Transmission Reception process is ongoing */
HAL_UART_STATE_TIMEOUT = 0x03, /*!< Timeout state */
HAL_UART_STATE_ERROR = 0x04 /*!< Error */
}HAL_UART_StateTypeDef;
ErrorCode(错误代码)
串口错误代码。
UART_InitTypeDef
/**
* @brief UART Init Structure definition
*/
typedef struct
{
uint32_t BaudRate; /*!< This member configures the UART communication baud rate.
The baud rate is computed using the following formula:
- IntegerDivider = ((PCLKx) / (8 * (OVR8+1) * (huart->Init.BaudRate)))
- FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 8 * (OVR8+1)) + 0.5
Where OVR8 is the "oversampling by 8 mode" configuration bit in the CR1 register. */
uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received in a frame.
This parameter can be a value of @ref UART_Word_Length */
uint32_t StopBits; /*!< Specifies the number of stop bits transmitted.
This parameter can be a value of @ref UART_Stop_Bits */
uint32_t Parity; /*!< Specifies the parity mode.
This parameter can be a value of @ref UART_Parity
@note When parity is enabled, the computed parity is inserted
at the MSB position of the transmitted data (9th bit when
the word length is set to 9 data bits; 8th bit when the
word length is set to 8 data bits). */
uint32_t Mode; /*!< Specifies whether the Receive or Transmit mode is enabled or disabled.
This parameter can be a value of @ref UART_Mode */
uint32_t HwFlowCtl; /*!< Specifies whether the hardware flow control mode is enabled
or disabled.
This parameter can be a value of @ref UART_Hardware_Flow_Control */
uint32_t OverSampling; /*!< Specifies whether the Over sampling 8 is enabled or disabled, to achieve higher speed (up to fPCLK/8).
This parameter can be a value of @ref UART_Over_Sampling */
}UART_InitTypeDef;
BaudRate(波特率)
该参数配置UART通信的波特率。可以通过以下公式计算分频数。
- IntegerDivider = ((PCLKx) / (8 * (huart->Init.BaudRate)))
- FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 8) + 0.5
WordLength(字长)
该参数可以定义为以下参数:
/** @defgroup UART_Word_Length UART Word Length
* @{
*/
#define UART_WORDLENGTH_8B ((uint32_t)0x00000000)
#define UART_WORDLENGTH_9B ((uint32_t)USART_CR1_M)
/**
* @}
*/
注意:ARM对于字长支持和标准串口不太一致。
StopBits(停止位)
该参数可以取值以下:
/** @defgroup UART_Stop_Bits UART Number of Stop Bits
* @{
*/
#define UART_STOPBITS_1 ((uint32_t)0x00000000)
#define UART_STOPBITS_2 ((uint32_t)USART_CR2_STOP_1)
/**
* @}
*/
Parity(校验位)
/** @defgroup UART_Parity UART Parity
* @{
*/
#define UART_PARITY_NONE ((uint32_t)0x00000000)
#define UART_PARITY_EVEN ((uint32_t)USART_CR1_PCE)
#define UART_PARITY_ODD ((uint32_t)(USART_CR1_PCE | USART_CR1_PS))
/**
* @}
*/
注意:
M bit | PCE bit | UART frame |
---|---|---|
0 | 0 | SB -8 bit data - STB |
0 | 1 | SB -7 bit data - PB -STB |
1 | 0 | SB -9 bit data - STB |
1 | 1 | SB -8 bit data - PB - STB |
其中:
- SB:起始位
- PB:校验位
- STB:停止位
Mode(收发模式)
配置串口通信的收发模式,参数可以选择如下:
/** @defgroup UART_Mode UART Transfer Mode
* @{
*/
#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))
/**
* @}
*/
HwFlowCtl(流控制)
硬件流控制选项,可以选择一下内容:
/** @defgroup UART_Hardware_Flow_Control UART Hardware Flow Control
* @{
*/
#define UART_HWCONTROL_NONE ((uint32_t)0x00000000)
#define UART_HWCONTROL_RTS ((uint32_t)USART_CR3_RTSE)
#define UART_HWCONTROL_CTS ((uint32_t)USART_CR3_CTSE)
#define UART_HWCONTROL_RTS_CTS ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE))
/**
* @}
*/
OverSampling(过采样)
该位确定串口的过采样数为8还是16。具体参数如下:
/** @defgroup UART_Over_Sampling UART Over Sampling
* @{
*/
#define UART_OVERSAMPLING_16 ((uint32_t)0x00000000)
#define UART_OVERSAMPLING_8 ((uint32_t)USART_CR1_OVER8)
/**
* @}
*/
当采用过采样为8时,串口最高的波特率为PCLK/8。而采用过采样为16时,串口最高的波特率为PCLK/16。所以,过采样为8时,串口的通信频率更快。然而,过采样频率为16时,获取信号更加精确。所以,具体选择需要视情况而定。