STM32H7的DMA双缓冲模式在串口不定长接收中的配置与半传输中断踩坑记录

· 行业用户 · 10 浏览

回答(4)

如果用了D-Cache,记得在DMA接收前调用SCB_InvalidateDCache_by_Addr(),否则读到的可能是旧数据,这个坑我踩过。
H7玩家 · 2026-11-03
串口空闲中断里不要直接处理数据,只置标志,主循环再根据DMA当前缓冲区和剩余计数计算长度,避免中断嵌套问题。
码农老张 · 2026-11-03
补充一点:H7的DMA双缓冲模式下,半传输中断标志应在中断服务函数中手动清除,否则会反复进入中断。建议用__HAL_DMA_CLEAR_FLAG()清除。
嵌入式小兵 · 2026-11-03
STM32H7的DMA双缓冲模式用于串口不定长接收时,需配置DMA为循环模式、双缓冲模式,并使能半传输和传输完成中断。常见坑点:1)半传输中断标志清除时机不当导致重复进入中断,应在中断中先清除标志再处理数据;2)双缓冲切换时,若未及时处理半传输数据,可能被新数据覆盖,建议半传输中断中仅置标志,主循环处理;3)串口空闲中断与DMA双缓冲结合时,需注意空闲中断触发时DMA可能正在切换缓冲区,应读取当前DMA剩余计数判断有效数据长度;4)H7的DMA缓存一致性问题,若使用D-Cache,需在DMA传输前后进行Cache无效化操作,否则数据可能不一致。实操建议:使用HAL库时,在半传输和传输完成回调中分别记录缓冲区指针和长度,结合串口空闲中断计算总接收长度,并确保处理速度跟上数据速率。
mcuku 阿沐 · 2026-11-03