STM32H750串口一直进IRQ问题解决

问题: void USART2_IRQHandler(void) { UART2_XSP26A_IRQ();

},就是我如果打过断点,那么程序就一直仅在这个IRQ函数里面里面运行,不打断点就可以一直在外部运行,为什么?
解决: UART 中断里不要用 HAL_UART_Receive(),改成直接读寄存器

RDR,中断里只做"收字节、置标志、清标志",解析放主循环。这样断点调试会稳定很多。 主要是"非阻塞接收"修复的。 之前的问题核心是:

HAL_UART_Receive(&huart2_xsp26a, ..., 1U, 1000U);

这个函数是阻塞式的,放在中断里不合适。你打断点后,串口硬件继续跑,等继续运行时中断标志、接收状态、超时状态容易堆在一起,表现成一直进

IRQ。 现在改成: uint8_t rx_data = (uint8_t)(huart2_xsp26a.Instance->RDR &

0xFFU); 读 RDR 是立即完成的,不等待、不超时、不走 HAL 的接收状态机,所以中断很快退出,之前"卡在 IRQ

里"的问题就没了。 ORE/FE/NE 清除是辅助修复: 防止已经产生的错误标志一直挂着。 防止溢出/噪声/帧错误导致中断反复进入。

对调试断点场景尤其有帮助。 所以结论: 主要原因:中断里用了阻塞式 HAL_UART_Receive() 主要修复:改成中断里直接读 RDR

辅助修复:清除 ORE/FE/NE 错误标志 如果只清 ORE/FE/NE,但继续在 IRQ 里用

HAL_UART_Receive(),问题大概率还会出现。

c 复制代码
/*ORE:Overrun Error,溢出错误。新字节来了,但上一个字节还没及时从 RDR 读走,硬件接收寄存器被覆盖或丢数据。
FE:Framing Error,帧格式错误。常见原因是波特率不匹配、停止位异常、线被干扰。
NE:Noise Error,噪声错误。RX 线上有干扰,采样不稳定。 */
void UART2_XSP26A_IRQ(void)
{
  if (__HAL_UART_GET_IT(&huart2_xsp26a, UART_IT_RXNE) != RESET)
  {
    uint8_t rx_data = (uint8_t)(huart2_xsp26a.Instance->RDR & 0xFFU);

    if ((uart2_xsp26a_tr.uart_rx.recv_flag == 0U) &&
        (uart2_xsp26a_tr.uart_rx.rx_len < RX_SIZE))
    {
      uart2_xsp26a_tr.uart_rx.rx_buffer[uart2_xsp26a_tr.uart_rx.rx_len] = rx_data;
      uart2_xsp26a_tr.uart_rx.rx_len++;
    }
    else
    {
      (void)rx_data;
      uart2_xsp26a_tr.uart_rx.rx_len = 0U;
      uart2_xsp26a_tr.uart_rx.recv_flag = 0U;
    }
  }

  if (__HAL_UART_GET_IT(&huart2_xsp26a, UART_IT_IDLE) != RESET)
  {
    __HAL_UART_CLEAR_IDLEFLAG(&huart2_xsp26a);
    if ((uart2_xsp26a_tr.uart_rx.rx_len > 0U) &&
        (uart2_xsp26a_tr.uart_rx.recv_flag == 0U))
    {
      uart2_xsp26a_tr.uart_rx.recv_flag = 1U;
    }
  }

  if (__HAL_UART_GET_FLAG(&huart2_xsp26a, UART_FLAG_ORE) != RESET)
  {
    __HAL_UART_CLEAR_OREFLAG(&huart2_xsp26a);
  }
  if (__HAL_UART_GET_FLAG(&huart2_xsp26a, UART_FLAG_FE) != RESET)
  {
    __HAL_UART_CLEAR_FEFLAG(&huart2_xsp26a);
  }
  if (__HAL_UART_GET_FLAG(&huart2_xsp26a, UART_FLAG_NE) != RESET)
  {
    __HAL_UART_CLEAR_NEFLAG(&huart2_xsp26a);
  }
}
相关推荐
糖糖单片机设计5 小时前
基于 STM32 的小型鸟类宠物繁殖系统
stm32·嵌入式硬件·宠物
电子元器件选型哥6 小时前
一文讲清LLC谐振电路工作原理
单片机·嵌入式硬件·硬件工程师·电子元器件·器件选型
HUI-4747 小时前
EG1162|SOP‑16 高压同步整流降压控制器,最高 600V 输入,大电流 5V 输出优选
嵌入式硬件·硬件工程
POMAGTOR7 小时前
【5G 通讯 POGOPIN 弹簧顶针连接器解决方案】
网络·嵌入式硬件·5g
ZLG_zhiyuan8 小时前
测试方案 | 从“000”到“111”,高效完成100BASE-TX以太网眼图测试
单片机·嵌入式硬件
恒锐丰科技林技术员8 小时前
EG1198:120V 宽压内置 MOS 降压 DC‑DC 电源芯片解析
经验分享·嵌入式硬件·硬件工程
数字新视界9 小时前
能耗管理系统的综合方案与优化实战解析
嵌入式硬件·物联网·数据中心·数据中心基础设施管理·dcim管理系统
深圳市恒锐丰科技杨生9 小时前
EG3525S 推挽 / 半桥 PWM 控制器|屹晶 EGmicro
嵌入式硬件·硬件工程
H_oRIZoN_9 小时前
Linux入门DAY39(51 单片机入门笔记|最小系统、位运算、处理器、数码管基础梳理)
单片机·嵌入式硬件
12.=0.9 小时前
【电学基础】
单片机·嵌入式硬件