You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F091 UART接收异常:中断停止触发,请求排查恢复方案

STM32F091 UART接收异常恢复方案

问题根源分析

你遇到的问题是UART出现帧错误(FE)和起始位噪声(NF)后,HAL库未触发HAL_UART_ErrorCallback,同时接收器使能位(RE)被清零,导致接收中断无法持续触发,最终接收停滞。这是因为STM32 HAL库默认的UART中断处理函数对部分错误场景的处理不完整,既没有将错误传递到回调函数,也没有自动恢复接收器状态。

解决方案

1. 重写UART中断处理函数,手动检测错误

替换工程中默认的USART2_IRQHandler,加入错误检测逻辑,确保错误被及时捕获:

void USART2_IRQHandler(void)
{
  uint32_t isrflags = READ_REG(huart2.Instance->ISR);
  uint32_t errorflags = isrflags & (USART_ISR_FE | USART_ISR_NF | USART_ISR_ORE | USART_ISR_PE);

  // 检测并处理错误标志
  if (errorflags != 0x00U)
  {
    // 清除错误标志
    __HAL_UART_CLEAR_FLAG(&huart2, errorflags);
    
    // 调用错误回调(可选)
    HAL_UART_ErrorCallback(&huart2);
    
    // 执行接收恢复逻辑
    UART_Recovery(&huart2);
    return;
  }

  // 正常处理HAL的中断流程
  HAL_UART_IRQHandler(&huart2);
}

2. 实现UART接收恢复函数

编写恢复函数,重新开启接收器并重启接收中断:

void UART_Recovery(UART_HandleTypeDef *huart)
{
  // 重新使能接收器
  __HAL_UART_ENABLE_RECEIVER(huart);
  
  // 重置HAL库的接收状态变量
  huart->RxState = HAL_UART_STATE_READY;
  huart->RxXferCount = 0;
  
  // 重启字节接收中断
  HAL_UART_Receive_IT(huart, &cdr2, 1);
}

3. 实现HAL错误回调(可选)

如果需要在错误发生时做日志、LED提示等操作,重写错误回调函数:

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
  if (huart->Instance == USART2)
  {
    // 这里可添加错误日志、LED闪烁等自定义逻辑
    // 示例:HAL_GPIO_TogglePin(ERROR_LED_GPIO_Port, ERROR_LED_Pin);
  }
}

4. 优化RS485切换时序

RS485的DE/RE切换时机不当,可能导致发送尾帧干扰接收,引发噪声或帧错误。建议调整切换时序:
修改发送触发代码:

DE_RS485_HIGH;
// 延迟1ms确保RS485芯片切换到发送模式(根据芯片手册调整)
HAL_Delay(1); 
HAL_UART_Transmit_IT(&huart2, tx2, packet_lenght);

修改TX回调函数:

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
  if (UartHandle->Instance == USART2)
  {
    // 等待最后一位发送完成(38400波特下1位约26us,留余量)
    HAL_Delay(1);
    DE_RS485_LOW;
  }
}

关键说明

  • 手动检测错误标志是因为HAL库默认中断处理中,FE、NF这类错误可能被忽略,无法触发错误回调。
  • 恢复函数必须重新使能接收器(RE位)并重置HAL状态变量,否则无法重启接收中断。
  • RS485时序优化能从根源减少发送对接收的干扰,降低错误发生概率。

内容的提问来源于stack exchange,提问作者NicoCaldo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:23:36