HAL_UART_Init、HAL_UART_Receive_IT、HAL_UART_IRQHandler说明

以下内容来自正点原子的“STM32F103 MINI开发指南V1.3.pdf”这个文件的”17.3.1 USART 的 HAL 库驱动“

1. HAL_UART_Init 函数

要使用一个外设首先要对它进行初始化,所以先看串口的初始化函数,其声明如下:

HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);

⚫ 函数描述:
用于初始化异步模式的收发器。
⚫ 函数形参:
形参 1 是串口的句柄,结构体类型是 UART_HandleTypeDef,其定义如下:

typedef struct
{
    
    
	USART_TypeDef *Instance; /* UART 寄存器基地址 */
	UART_InitTypeDef Init; /* UART 通信参数 */
	uint8_t *pTxBuffPtr; /* 指向 UART 发送缓冲区 */
	uint16_t TxXferSize; /* UART 发送数据的大小 */
	__IO uint16_t TxXferCount; /* UART 发送数据的个数 */
	uint8_t *pRxBuffPtr; /* 指向 UART 接收缓冲区 */
	uint16_t RxXferSize; /* UART 接收数据大小 */
	__IO uint16_t RxXferCount; /* UART 接收数据的个数 */
	DMA_HandleTypeDef *hdmatx; /* UART 发送参数设置(DMA) */
	DMA_HandleTypeDef *hdmarx; /* UART 接收参数设置(DMA) */
	HAL_LockTypeDef Lock; /* 锁定对象 */
	__IO HAL_UART_StateTypeDef gState; /* UART 发送状态结构体 */
	__IO HAL_UART_StateTypeDef RxState; /* UART 接收状态结构体 */
	__IO uint32_t ErrorCode; /* UART 操作错误信息 */
}UART_HandleTypeDef;

1) Instance:指向 UART 寄存器基地址。 实际上这个基地址 HAL 库已经定义好了, 可以选择范围: USART1~ USART3、 UART4、 UART5。
2) Init: UART 初始化结构体,用于配置通讯参数,如波特率、数据位数、停止位等等。下面我们再详细讲解这个结构体。
3) pTxBuffPtr, TxXferSize, TxXferCount:分别是指向发送数据缓冲区的指针,发送数据的大小,发送数据的个数。
4) pRxBuffPtr, RxXferSize, RxXferCount:分别是指向接收数据缓冲区的指针,接受数据的大小,接收数据的个数;
5) hdmatx, hdmarx:配置串口发送接收数据的 DMA 具体参数。
6) Lock:对资源操作增加操作锁保护功能,可选 HAL_UNLOCKED 或者 HAL_LOCKED 两个参数。如果 gState 的值等于 HAL_UART_STATE_RESET,则可认为串口未被初始化,此时,分配锁资源,并且调用 HAL_UART_MspInit 函数来对串口的 GPIO 和时钟进行初始化。
7) gState, RxState:分别是 UART 的发送状态、工作状态的结构体和 UART 接受状态的结构体。 HAL_UART_StateTypeDef 是一个枚举类型,列出串口在工作过程中的状态值,有些值只适用于 gState,如 HAL_UART_STATE_BUSY。
8) ErrorCode:串口错误操作信息。主要用于存放串口操作的错误信息。
下面,我们来了解 UART_InitTypeDef 这个结构体类型,该结构体用于配置 UART 的各个通
信参数, 包括波特率,停止位等,具体说明如下:

typedef struct
{
    
    
	uint32_t BaudRate; /* 波特率 */
	uint32_t WordLength; /* 字长 */
	uint32_t StopBits; /* 停止位 */
	uint32_t Parity; /* 校验位 */
	uint32_t Mode; /* UART 模式 */
	uint32_t HwFlowCtl; /* 硬件流设置 */
	uint32_t OverSampling; /* 过采样设置 */
}UART_InitTypeDef;

1) BaudRate:波特率设置。一般设置为 2400、 9600、 19200、 115200。
2) WordLength:数据帧字长,可选 8 位或 9 位。 这里我们设置为 8 位字长数据格式。
3) StopBits:停止位设置,可选 0.5 个、 1 个、 1.5 个和 2 个停止位,一般我们选择 1 个停止位。
4) Parity:奇偶校验控制选择, 我们设定为无奇偶校验位。
5) Mode: UART 模式选择, 可以设置为只收模式,只发模式,或者收发模式。这里我们设置为全双工收发模式。
6) HwFlowCtl:硬件流控制选择, 我们设置为无硬件流控制。
7) OverSampling:过采样选择,选择 8 倍过采样或者 16 过采样,一般选择 16 过采样。
⚫ 函数返回值:
HAL_StatusTypeDef 枚举类型的值,有 4 个,分别是 HAL_OK 表示成功, HAL_ERROR 表示错误, HAL_BUSY 表示忙碌, HAL_TIMEOUT 超时。后续遇到该结构体也是一样的。

2. HAL_UART_Receive_IT 函数

HAL_UART_Receive_IT 函数是开启串口接收中断函数。其声明如下:

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

⚫ 函数描述:
用于开启以中断的方式接收指定字节。数据接收在中断处理函数里面实现。
⚫ 函数形参:
形参 1 是 UART_HandleTypeDef 结构体指针类型的串口句柄。
形参 2 是要接收的数据地址。
形参 3 是要接收的数据大小,以字节为单位。
⚫ 函数返回值:
HAL_StatusTypeDef 枚举类型的值。

3. HAL_UART_IRQHandler 函数

HAL_UART_IRQHandler 函数是 HAL 库中断处理公共函数。其声明如下:

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);

⚫ 函数描述:
该函数是 HAL 库中断处理公共函数,在串口中断服务函数中被调用。
⚫ 函数形参:
形参 1 是 UART_HandleTypeDef 结构体指针类型的串口句柄。
⚫ 函数返回值:

⚫ 注意事项:
该函数是 HAL 库已经定义好,用户一般不能随意修改。如果用户要在中断中实现自己的逻辑代码,可以直接在函数 HAL_UART_IRQHandler 的前面或者后面添加新代码,也可以直接在HAL_UART_IRQHandler 调用的各种回调函数里面执行,这些回调都是弱定义的,方便用户直接在其它文件里面重定义。串口回调函数主要有下面几个:

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

本实验我们用到的是接收回调函数 HAL_UART_RxCpltCallback,就是在接收回调函数里面编写我们的接收逻辑代码,具体请参考实验源码。

猜你喜欢

转载自blog.csdn.net/quxuexi/article/details/131218042