STM32 使用 DMA 传输时,如何精确处理半传输中断与传输完成中断的边界数据?

· 1 浏览

回答(4)

若数据量小,可关闭HT,只用TC,配合空闲中断(IDLE)处理不定长,边界更简单。但吞吐量要求高时,HT必须用。
硬件工程师阿强 · 2026-08-27
边界处理时,用CNDTR判断剩余字节数,若HT触发但CNDTR未到半值,说明有延迟,需等待或重读。可加状态机管理。
码农小刘 · 2026-08-27
建议用双缓冲(DMA双缓冲模式),HT切到缓冲A,TC切到缓冲B,交替处理,避免边界冲突。注意在切换前禁用DMA,防止数据撕裂。
嵌入式老张 · 2026-08-27
在STM32 DMA半传输中断(HT)与传输完成中断(TC)中处理边界数据,核心是确保数据一致性,避免重复或丢失。实操建议:1)配置DMA为循环模式或正常模式,并启用HT和TC中断;2)在HT中断中处理缓冲区前半部分(如地址0到size/2-1),在TC中断中处理后半部分(size/2到size-1),但需注意:若使用循环模式,TC后DMA自动回绕,此时应使用双缓冲或手动切换缓冲区指针;3)关键点:在中断服务程序中,先读取DMA的CNDTR寄存器(剩余传输计数)确认实际传输位置,再处理数据,防止因中断延迟导致边界错位;4)对于非2的幂次大小,建议将缓冲区大小设为2的幂次,或使用DMA的FIFO和突发模式对齐;5)若需精确到字节,可结合定时器或外部触发同步,但通常HT/TC足够。推荐使用STM32CubeMX生成代码,并开启DMA的“Half Transfer”和“Transfer Complete”回调,在回调中加临界区保护(如关中断)处理数据。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器