|
|
发表于 2025-10-31 15:08:11
|
显示全部楼层
static int32_t serial_receiver_enable(Serial_Typedef *serial)
{
UART_HandleTypeDef *handle = &serial->handle;
__HAL_UART_CLEAR_IDLEFLAG(&serial->handle);
__HAL_UART_CLEAR_OREFLAG(&serial->handle);
__HAL_UART_ENABLE_IT(handle, UART_IT_ERR);
__HAL_UART_ENABLE_IT(handle, UART_IT_ORE);
if (handle->Instance != LPUART1)
{
HAL_UART_ReceiverTimeout_Config(handle, SERIAL_FRAME_TIMEOUT);
HAL_UART_EnableReceiverTimeout(handle);
__HAL_UART_ENABLE_IT(handle, UART_IT_RTO);
return HAL_UART_Receive_DMA(handle, serial->pRxBuff, serial->pRxBuffSize);
}
else
{
__HAL_UART_ENABLE_IT(handle, UART_IT_IDLE);
return HAL_UARTEx_ReceiveToIdle_DMA(handle, serial->pRxBuff, serial->pRxBuffSize);
}
}
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
Serial_Typedef *serial = GET_STRUCT_ENTRY(huart, Serial_Typedef, handle);
uint32_t error = HAL_UART_GetError(huart);
if (HAL_UART_ERROR_RTO & error)
{
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF);
HAL_UART_AbortReceive(huart);
/* 数据入队 */
serial_receive_to_ringbuffer(serial);
}
if (HAL_UART_ERROR_DMA & error)
{
}
if (HAL_UART_ERROR_ORE & error)
{
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
}
if (HAL_UART_ERROR_FE & error)
{
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
}
if (HAL_UART_ERROR_NE & error)
{
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF);
}
if (HAL_UART_ERROR_PE & error)
{
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF);
}
memset(serial->pRxBuff, 0, serial->pRxBuffSize);
if (huart->Instance != LPUART1)
{
HAL_UART_Receive_DMA(huart, serial->pRxBuff, serial->pRxBuffSize);
}
else
{
HAL_UARTEx_ReceiveToIdle_DMA(huart, serial->pRxBuff, serial->pRxBuffSize);
}
}
关键代码就这两段,你自己看吧 |
|