HAL_UART_Receive_IT代码解析
时间: 2023-07-23 19:20:41 浏览: 94
Hal_BT.zip_HAL DMA_hal uart_hal uart_hal 串口_stm32 串口 hal
下面是HAL_UART_Receive_IT函数的代码解析:
```c
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
/* Check that a Rx process is not already ongoing */
if (huart->RxState == HAL_UART_STATE_READY)
{
if ((pData == NULL) || (Size == 0U))
{
return HAL_ERROR;
}
/* Process Locked */
__HAL_LOCK(huart);
huart->pRxBuffPtr = pData;
huart->RxXferSize = Size;
huart->RxXferCount = Size;
huart->ErrorCode = HAL_UART_ERROR_NONE;
huart->RxState = HAL_UART_STATE_BUSY_RX;
/* Enable the UART Parity Error Interrupt */
__HAL_UART_ENABLE_IT(huart, UART_IT_PE);
/* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
__HAL_UART_ENABLE_IT(huart, UART_IT_ERR);
/* Enable the UART Data Register not empty Interrupt */
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
/* Process Unlocked */
__HAL_UNLOCK(huart);
return HAL_OK;
}
else
{
return HAL_BUSY;
}
}
```
该函数的作用是启用UART的中断接收模式,当接收到数据时,会触发中断并调用相应的中断服务函数进行数据处理。函数参数说明如下:
- huart:UART句柄,指向UART相关的结构体。
- pData:接收缓冲区的指针。
- Size:接收缓冲区的大小。
函数的具体实现如下:
1. 检查是否已经有一个接收进程正在进行中。
```c
if (huart->RxState == HAL_UART_STATE_READY)
```
2. 检查接收缓冲区指针和大小是否合法。
```c
if ((pData == NULL) || (Size == 0U))
{
return HAL_ERROR;
}
```
3. 锁定UART句柄,防止其他任务同时访问UART。
```c
/* Process Locked */
__HAL_LOCK(huart);
```
4. 初始化接收缓冲区指针、大小和计数器,并将接收状态设置为“忙碌”。
```c
huart->pRxBuffPtr = pData;
huart->RxXferSize = Size;
huart->RxXferCount = Size;
huart->ErrorCode = HAL_UART_ERROR_NONE;
huart->RxState = HAL_UART_STATE_BUSY_RX;
```
5. 启用UART的中断模式,包括奇偶校验错误中断、帧错误中断、噪声错误中断、溢出错误中断和接收数据寄存器非空中断。
```c
/* Enable the UART Parity Error Interrupt */
__HAL_UART_ENABLE_IT(huart, UART_IT_PE);
/* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
__HAL_UART_ENABLE_IT(huart, UART_IT_ERR);
/* Enable the UART Data Register not empty Interrupt */
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
```
6. 解锁UART句柄,允许其他任务访问UART。
```c
/* Process Unlocked */
__HAL_UNLOCK(huart);
```
7. 返回操作结果。
```c
return HAL_OK;
```
如果在函数执行过程中发现接收进程已经在进行中,则返回“忙”状态。
```c
else
{
return HAL_BUSY;
}
```
阅读全文