STM32 的 DMA 为什么要清标志?

STM32 · 8 浏览
STM32 的 DMA 为什么要清标志?

回答(4)

裸机开发时,清标志要放在读数据之后,否则数据还没取走,标志就没了,容易丢数据。
电子攻城狮 · 2026-08-20
补充:如果用了HAL库,它内部已经清了,你只需在回调函数里处理数据,别重复清,否则可能误触发。
码农小刘 · 2026-08-20
我习惯在DMA中断里先读标志再清,防止漏事件。特别是多通道时,每个通道标志独立,别清错了。
嵌入式老张 · 2026-08-20
DMA清标志的核心原因是DMA控制器通过状态寄存器(如DMA_ISR)记录传输完成、半传输、传输错误等事件,这些标志位是硬件置位的,不会自动清零。如果不手动清除,下次DMA传输时,软件查询标志会误判为“上次事件未处理完”,导致逻辑错误或死循环。例如,在循环DMA接收串口数据时,若不清除TCIF标志,主循环可能重复处理同一批数据。实操建议:在DMA中断服务函数中,先读取标志位判断事件类型,处理完数据后立即调用`DMA_ClearITPendingBit(DMA1_IT_TC1)`(标准库)或`__HAL_DMA_CLEAR_FLAG(&hdma, DMA_FLAG_TC)`(HAL库)清除对应标志。注意:HAL库的`HAL_DMA_IRQHandler`内部会自动清除标志,但若你直接操作寄存器或使用裸机轮询,必须手动清。另外,DMA传输错误标志(TEIF)建议也一并清除,避免错误累积影响后续传输。
mcuku 阿沐 · 2026-08-20