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);  
         
    }
}
相关推荐
m0_377108143 小时前
小智ai,esp32
单片机
是摆烂第一名呀3 小时前
RK3576+GMSL摄像头底层适配与调试
linux·arm开发·驱动开发·嵌入式硬件·数码相机
Mr-pn-junction12 小时前
clk_gate
单片机·嵌入式硬件·fpga开发
尼喃17 小时前
662K和65Z5三脚稳压芯片PW6566,附引脚定义与典型电路图
嵌入式硬件
李永奉20 小时前
杰理可视化SDK开发-【BUG】配置“TWS两边同时按消息使能”功能后,按键单击功能无效失灵
开发语言·单片机·嵌入式硬件·物联网·bug
执迷不悟82321 小时前
51单片机--中断/定时/PWM
单片机·嵌入式硬件·51单片机
A小调的码农1 天前
OPENOCD+MSYS+VSCODE:从“灯不亮“到“终于亮了“
ide·vscode·stm32·单片机·编辑器
AI的探索之旅1 天前
让 Claude Code 直接操刀画原理图和 PCB:VSCode 插件接外部 API 全流程
linux·ide·vscode·嵌入式硬件·编辑器
Dlrb12111 天前
单片机通信协议---串口及串口通信
单片机·嵌入式硬件·串口·uart·modbus·波特率·主机从机
嵌入式-老费1 天前
esp32开发与应用(用好ttl转485模块)
stm32·单片机·嵌入式硬件