[STM32G0] USART在外部串口开始传输时停止接收

[复制链接]
501|16
地瓜patch 发表于 2025-9-26 22:17 | 显示全部楼层 |阅读模式
用STM32G0B1KC启动后外部串行数据开始传输时,代码运行正常并能解码USART1。但当外部传输(38400波特)在mcu启动过程中开始时,Rx中断在接收到第一个字符后便会挂起。

在接收器挂起后重启mcu,即使外部数据流仍在继续,通常也能恢复功能。

由于时序问题,调试起来很不顺利。整程序是用STMCubeIDE和HAL库开发。

如何解决这个问题?

公羊子丹 发表于 2025-9-27 07:26 | 显示全部楼层
听起来像是起始位对不上导致的,你可以试着在初始化完 USART 后丢弃一次接收缓冲里的内容。
周半梅 发表于 2025-9-27 07:27 | 显示全部楼层
我之前在 G0 上遇到过类似问题,开机时外部设备已经在发数据,MCU 初始化慢了一步。最后是加了 IDLE 中断来恢复。
帛灿灿 发表于 2025-9-27 07:28 | 显示全部楼层
要不要考虑在上电时给外部设备一个延时启动信号?避免 MCU 还没准备好就收数据。
童雨竹 发表于 2025-9-27 07:29 | 显示全部楼层
检查下是不是 RXNE 标志没清掉,导致后续中断被卡住了。
万图 发表于 2025-9-27 07:31 | 显示全部楼层
如果外设数据不可控,可以在初始化 USART 后手动 reset 一下接收器,比如先关再开 UE 位。
Wordsworth 发表于 2025-9-27 07:32 | 显示全部楼层
CubeIDE 生成的 HAL 有时候对错误中断处理不完整,你看下 ORE/FE/NE 这些错误标志是不是被忽略了。
Bblythe 发表于 2025-9-27 07:33 | 显示全部楼层
我用裸寄存器写过,在外部数据流持续的时候,需要先清一次 ORE 错误才能继续接收。
Pulitzer 发表于 2025-9-27 07:34 | 显示全部楼层
也可以考虑 DMA 接收,用环形缓冲方式就不会因为起步时丢字节而挂死。
Uriah 发表于 2025-9-27 07:35 | 显示全部楼层
调试的时候最好用逻辑分析仪抓一下 RXD 和中断触发点,看是卡在第一帧还是错误中断。
Clyde011 发表于 2025-9-27 07:36 | 显示全部楼层
实在不行,可以在系统启动时人为丢弃前几个字节,等 MCU 和外设“同步”后再进入正式接收。
powerantone 发表于 2025-9-29 12:20 | 显示全部楼层
ORE标志位未清除后续数据无法接收。
probedog 发表于 2025-9-29 13:21 | 显示全部楼层
可能是中断优先级与时序冲突
stormwind123 发表于 2025-9-29 14:21 | 显示全部楼层
启动过程中系统时钟、外设时钟未完全稳定,若中断优先级配置不当,可能导致接收中断被高优先级任务抢占,引发时序错乱。
七毛钱 发表于 2025-9-29 15:22 | 显示全部楼层
HAL库的HAL_UART_RxCpltCallback需等待RxXferCount归零才触发,若数据连续到来,可能因回调延迟导致缓冲区溢出。
内政奇才 发表于 2025-9-29 12:22 | 显示全部楼层
在USART初始化后,手动开启错误中断并清除ORE标志位
海滨消消 发表于 2025-9-29 16:22 | 显示全部楼层
强制清除ORE标志位
豌豆爹 发表于 2025-9-29 17:29 | 显示全部楼层
优化中断处理函数,直接在中断服务函数中处理数据,避免依赖HAL库回调。
classroom 发表于 2025-9-29 19:23 | 显示全部楼层
调整中断优先级。
cr315 发表于 2025-9-29 20:28 | 显示全部楼层
在main()函数中,延迟启动USART接收以稳定系统时钟。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1929

主题

15216

帖子

31

粉丝
快速回复 在线客服 返回列表 返回顶部