STM32 使用 DMA 与环形缓冲区接收不定长串口数据时,如何避免缓存覆盖与丢帧?

· 5 浏览

回答(4)

补充:建议在DMA缓冲区满时,丢弃旧数据而非新数据(如覆盖策略),并在应用层用时间戳或序号检测丢帧,便于调试。
硬件攻城狮 · 2026-09-02
补充:如果帧率很高,可考虑用空闲中断+DMA接收不定长,但空闲中断需配置正确,且要处理帧间间隔小于1字节时间的特殊情况。
码农小飞 · 2026-09-02
补充:用DMA的循环模式时,务必在HT/TC中断里清标志并记录当前写指针,防止CPU读指针与DMA写指针错位。可加一个原子变量保护读索引。
老周嵌入式 · 2026-09-02
核心思路是采用双缓冲或乒乓缓冲配合DMA半传输/传输完成中断,避免单环形缓冲区在DMA连续写入时被CPU读取覆盖。实操建议:1) 使用两个大小相等的缓冲区(如各256字节),DMA配置为循环模式,开启HT(半传输)和TC(传输完成)中断;当HT触发时CPU处理前半段,TC触发时处理后半段,确保CPU处理速度高于DMA写入速度。2) 在中断服务程序中,将数据快速拷贝到应用层环形队列(如使用memcpy),并置标志位,主循环解析,避免在中断内做耗时操作。3) 若数据帧较长,可结合空闲中断(IDLE)判断帧结束,但注意IDLE可能误触发,需加超时或帧头校验。4) 关键:确保DMA缓冲区大小大于最大帧长,且CPU处理逻辑无阻塞,否则仍会覆盖。建议先用逻辑分析仪实测吞吐率,再调整缓冲区尺寸。
mcuku 阿沐 · 2026-09-02

🧰 配套工具

🔗 波特率计算器