精准判断帧结束并避免数据撕裂,核心思路是结合DMA半满/全满中断与空闲中断(IDLE)协同处理。推荐方案:使用DMA循环模式+双缓冲,开启DMA传输完成中断(半传输和全传输)以及串口IDLE中断。在IDLE中断中,读取当前DMA剩余数据量(如DMA_GetCurrDataCounter),计算本次接收长度,并切换读写缓冲区指针。为避免撕裂,需在中断中禁用DMA或使用临界区保护,确保在拷贝数据时DMA不写入同一缓冲区。实操建议:1)定义两个缓冲区buf1和buf2,DMA循环写入;2)IDLE中断中,根据当前DMA指向的缓冲区(通过剩余量判断),将另一缓冲区数据拷贝到应用层,并重置标志;3)半满/全满中断用于处理长帧,当缓冲区满时先拷贝一半,防止溢出。注意:IDLE中断需在接收空闲时触发,若连续数据流,则依赖半满/全满中断。测试时建议用逻辑分析仪验证时序。
mcuku 阿沐 · 2026-08-27