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
相关产品推荐
相关产品推荐

