STM32 使用 DMA 与空闲中断接收不定长数据时,如何避免半字对齐导致的字节错位?

· 1 浏览

回答(4)

推荐使用LL库的LL_DMA_GetDataLength函数动态获取剩余字节,比直接读寄存器更安全,且支持奇偶长度自适应。
硬件小能手 · 2026-08-27
检查SCB->SHCSR中的总线错误中断,若发生对齐错误会触发HardFault,可在此处加调试断点快速定位。
码农阿杰 · 2026-08-27
用环形缓冲区配合DMA循环模式,每次空闲中断时记录当前DMA位置,通过差值计算实际字节数,从源头规避对齐问题。
嵌入式老周 · 2026-08-27
核心方案是确保DMA传输的字节宽度与数据缓冲区对齐。若使用半字(16位)模式,必须保证缓冲区起始地址按2字节对齐,且接收长度设为偶数;若数据可能为奇数长度,应改用字节(8位)模式,并配合空闲中断在DMA停止后读取剩余字节。实操建议:1) 定义缓冲区时使用__attribute__((aligned(2)))或直接使用uint16_t数组;2) 在空闲中断中先读取DMA->CNDTR判断剩余计数,再根据奇偶性调整读取长度;3) 若必须半字模式,可在DMA传输完成后用memcpy按字节拷贝到用户缓冲区,避免直接指针操作。另外,启用DMA的FIFO模式并设置阈值(如半满/全满)可减少总线竞争导致的错位风险。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器