问题来源:
1,串口在通信中拔掉 (热拔插)
2,MCU先通电 串口工具后上电的情况
都会导致MCU串口接收异常,DMA 收发异常
仿真的话串口会报错误出来
比如:
HAL库串口FE帧错误
HAL_UART_ERROR_ORE错误
uart_dma abort onerror
解决办法:
1,
串口初始化时先清一下错误标志
c
__HAL_UART_CLEAR_FLAG(&huart1, UART_CLEAR_FEF | UART_CLEAR_OREF | UART_CLEAR_NEF);
2,在串口中断里面,停止DMA接收,恢复错误中断使能
c
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_FE) != RESET)
{
// 停止 DMA 接收
HAL_UART_DMAStop(&huart1);
// 恢复错误中断使能
LL_USART_EnableIT_ERROR(USART1);//2
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
3,添加错误回调函数并重新初始化DMA
c
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
/**/
if (huart->Instance == USART1)
{
if (huart->ErrorCode & HAL_UART_ERROR_FE)
{
// 清除帧错误标志
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
// 重置接收状态
huart->RxState = HAL_UART_STATE_READY;
// 重新启用空闲中断
__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
}
// 重新启动 DMA 接收
// HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rxdata3, sizeof(rxdata3));
HAL_UART_Receive_DMA(&huart1, RxBuffer, RX_CNDTR);
}
}