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);  
         
    }
}
相关推荐
List<String> error_P2 小时前
STM32 Systick定时器介绍
stm32·定时器·systick
小康小小涵3 小时前
STM32F103RCT6编写iNav1.7.3飞控固件底层开发
stm32·单片机·嵌入式硬件
小郭团队6 小时前
1_6_五段式SVPWM (传统算法反正切+DPWM2)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·matlab·dsp开发
小郭团队6 小时前
1_7_五段式SVPWM (传统算法反正切+DPWM3)算法理论与 MATLAB 实现详解
开发语言·嵌入式硬件·算法·matlab·dsp开发
爱潜水的小L6 小时前
自学嵌入式day49,arm led、蜂鸣器和bsp
arm开发·单片机·嵌入式硬件
物联网牛七七8 小时前
stm32内核寄存器和外设寄存器
stm32·单片机·嵌入式硬件
嗯嗯=8 小时前
STM32单片机学习篇3
stm32·单片机·学习
梁洪飞8 小时前
通过链接文件和Start.S学习armv7
linux·arm开发·嵌入式硬件·学习·arm
m0_5557629010 小时前
STM32H7 + VS Code + OpenOCD + STLink 完整配置教程
stm32·单片机·嵌入式硬件