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

EFM32G890F128开发板USART1接收异常:仅触发一次中断且数据为0x0

看起来你在EFM32G890F128的USART接收上踩了个常见的坑,我之前调试Silicon Labs MCU的USART时也遇到过类似问题,给你几个针对性的排查方向,应该能解决:

排查方向1:中断标志与ISR处理是否正确

这是最常见的原因——很多时候不是中断没触发,而是你没正确清除外设级的中断标志,或者忽略了错误状态导致接收被阻塞。

  • 首先检查你的中断服务函数(ISR):是不是只读取了RXDATA,但没明确清除RXDATAV(接收数据有效)标志?EFM32的USART中断标志不会自动清除,必须手动调用USART_IntClear()或者通过读取RXDATA清除部分标志,但保险起见还是显式清除更可靠。
  • 另外,一定要检查是否存在接收错误(溢出、帧错误、奇偶校验错误):这些错误会锁死接收通路,导致后续中断不再触发。你需要在ISR里检测这些错误标志,先读取RXDATA清除错误状态,再清除错误标志。
    示例代码参考:
void USART0_IRQHandler(void)
{
  uint32_t intFlags = USART_IntGet(USART0);

  // 处理接收数据有效中断
  if (intFlags & USART_IF_RXDATAV)
  {
    uint8_t rxData = USART_Rx(USART0);
    // 这里添加你的数据处理逻辑
    
    // 显式清除接收中断标志
    USART_IntClear(USART0, USART_IF_RXDATAV);
  }

  // 处理接收错误(如果开启了错误中断)
  if (intFlags & (USART_IF_RXOF | USART_IF_FERR | USART_IF_PERR))
  {
    // 先读取RXDATA解锁接收通路
    (void)USART_Rx(USART0);
    // 清除错误标志
    USART_IntClear(USART0, USART_IF_RXOF | USART_IF_FERR | USART_IF_PERR);
  }
}
排查方向2:硬件连接与引脚配置

虽然发送正常,但接收的硬件链路可能有隐性问题:

  • 确认引脚交叉连接:EFM32的RX引脚必须接USB转串口模块的TX,TX接模块的RX,地线一定要接!没接地会导致电平不稳定,接收不到正确数据。
  • 检查引脚复用配置:你是不是把USART_RX引脚正确配置成了USART功能?比如EFM32G890的USART0_RX默认是PA0,需要用GPIO_PinModeSet设置为USART模式,同时要开启引脚路由:
// 配置RX/TX引脚为USART功能
GPIO_PinModeSet(gpioPortA, 0, gpioModeInput, 0); // RX
GPIO_PinModeSet(gpioPortA, 1, gpioModePushPull, 1); // TX
// 开启引脚路由
USART0->ROUTE |= USART_ROUTE_RXPEN | USART_ROUTE_TXPEN | USART_ROUTE_LOCATION_LOC0;
排查方向3:USART初始化配置遗漏

检查初始化代码里的关键配置:

  • 有没有开启接收使能?很多人会漏加usartEnableRx:
USART_Enable(USART0, usartEnableRx | usartEnableTx);
  • 确认波特率、数据位、停止位、奇偶校验和电脑端完全一致:比如电脑端是8N1(8数据位、无校验、1停止位),你的代码里也要对应配置:
USART_InitAsync_TypeDef init = USART_INITASYNC_DEFAULT;
init.databits = usartDatabits8;
init.parity = usartNoParity;
init.stopbits = usartStopbits1;
USART_InitAsync(USART0, &init);
  • 检查中断使能是否正确:除了外设端的USART_IntEnable(USART0, USART_IF_RXDATAV),还要在NVIC里开启对应中断:
NVIC_EnableIRQ(USART0_IRQn);
NVIC_SetPriority(USART0_IRQn, 3); // 优先级根据需求调整
排查方向4:时钟源配置是否正确

USART的时钟源错误会导致波特率计算偏差,进而引发接收异常:

  • 确认你用的USART时钟源(HFCLK/LFCLK)频率和初始化时的配置匹配。比如如果用HFCLK(比如48MHz),要确保CMU_ClockEnable(cmuClock_USART0, true)已经开启,并且波特率计算正确。

先从这几个方向排查,尤其是中断标志和错误处理那块,大概率是这里出了问题。如果还是不行,可以把你的初始化代码和ISR贴出来,再进一步分析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:15:19