embedded
protocol_error
ai_generated
partial
UART:DMA 模式下检测到溢出错误(ORE),数据丢失
UART: overrun error (ORE) detected in DMA mode, data lost
ID: embedded/uart-overrun-error-dma-mode
80%修复率
82%置信度
1证据数
2023-11-20首次发现
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| STM32Cube_FW_F4 V1.27.0 | active | — | — | — |
| HAL V1.8.0 | active | — | — | — |
根因分析
UART 溢出因 DMA 传输速率不足以在下个字节到达前清空接收缓冲区而发生。
English
UART overrun occurred because DMA transfer rate insufficient to empty receive buffer before next byte arrives.
官方文档
https://www.st.com/resource/en/application_note/dm00110233.pdf解决方案
-
增加 DMA 缓冲区大小并使用循环模式以提供更多处理时间:`HAL_UART_Receive_DMA(&huart, buffer, BUFFER_SIZE);` 其中 BUFFER_SIZE >= 512。
-
使能 UART 硬件流控制(RTS/CTS)以限制发送端:设置 `huart.Init.HwFlowCtl = UART_HWCONTROL_RTS_CTS;`
-
降低 DMA 的中断优先级,提高 UART 全局中断优先级以更快处理 ORE 标志。
无效尝试
常见但无效的做法:
-
85% 失败
Increasing UART baud rate worsens overrun as data arrives faster.
-
60% 失败
Disabling DMA and using interrupt mode shifts bottleneck but does not fix root cause.