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);  
         
    }
}
相关推荐
芯片设计-曾工7 小时前
当精准脉冲遇上清晰视界——CH2205E模块与YL1621的“黄金搭档“
驱动开发·stm32·单片机·51单片机·硬件工程
LCG元13 小时前
STM32 硬件 SPI + DMA 驱动 OLED 显示屏(SSD1306):从原理到 112fps 高速刷新全流程
stm32·单片机·嵌入式硬件
天吾cc14 小时前
RTT-ADC
单片机·嵌入式硬件·学习
qq_4480111614 小时前
C语言中的野指针和空指针
c语言·开发语言·单片机
210Brian14 小时前
STM32学习笔记(五)EXTI外部中断(上)
笔记·stm32·学习
崇山峻岭之间15 小时前
STM32F407的FOC驱动01
stm32·单片机·嵌入式硬件
Lzh编程小栈20 小时前
【嵌入式硬核精讲】I2C通信协议万字详解(时序帧格式、同步半双工、重复起始、一对多挂载、寄存器、面试必考)
stm32·单片机·嵌入式硬件·面试
十月的皮皮20 小时前
STM32从零到量产开发:四路继电器工业控制模块开发 -上位机 Program.cs 应用程序入口设计说明
c语言·stm32·单片机·stm32cubemx·hal库
LCG元20 小时前
STM32F103+MPU6050互补滤波姿态解算与OLED实时显示实战(附完整工程代码)
stm32·单片机·嵌入式硬件
求知喻20 小时前
FM33L023D外部中断
单片机·嵌入式硬件