STM32G4针对串口通信异常的操作

问题来源:

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);  
         
    }
}
相关推荐
fie888918 小时前
基于51单片机的航模遥控器6通道接收机程序
单片机·嵌入式硬件·51单片机
bu_shuo18 小时前
嵌入式硬件工程师VS单板硬件工程师
嵌入式硬件·电子工程师·单板硬件
llilian_1618 小时前
选择北斗导航卫星信号模拟器注意事项总结 北斗导航卫星模拟器 北斗导航信号模拟器
功能测试·单片机·嵌入式硬件·测试工具·51单片机·硬件工程
Yyq1302086968218 小时前
MH2457,‌国产 32 位屏驱 MCU‌芯片,支持‌1080P 高清显示‌与‌以太网通信‌,广泛应用于两轮车仪表盘及工控屏等领域
单片机·嵌入式硬件
爱分享的阿Q19 小时前
STM32现代化AI开发环境搭建:从Keil到VSCode+AI的范式转移
人工智能·vscode·stm32
爱吃程序猿的喵19 小时前
南邮计科电工电子实验B《RLC串联谐振电路》实验报告
单片机·嵌入式硬件
独小乐19 小时前
009.中断实践之实现按键测试|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·驱动开发·笔记·嵌入式硬件·arm
XINVRY-FPGA20 小时前
XC7VX690T-2FFG1157I Xilinx AMD Virtex-7 FPGA
arm开发·人工智能·嵌入式硬件·深度学习·fpga开发·硬件工程·fpga
bubiyoushang88821 小时前
利用STM32实现Modbus通信(RTU从机方案)
stm32·单片机·嵌入式硬件
cmpxr_1 天前
【单片机】常用设计模式
单片机·嵌入式硬件·设计模式