核心方案是确保DMA传输的字节宽度与数据缓冲区对齐。若使用半字(16位)模式,必须保证缓冲区起始地址按2字节对齐,且接收长度设为偶数;若数据可能为奇数长度,应改用字节(8位)模式,并配合空闲中断在DMA停止后读取剩余字节。实操建议:1) 定义缓冲区时使用__attribute__((aligned(2)))或直接使用uint16_t数组;2) 在空闲中断中先读取DMA->CNDTR判断剩余计数,再根据奇偶性调整读取长度;3) 若必须半字模式,可在DMA传输完成后用memcpy按字节拷贝到用户缓冲区,避免直接指针操作。另外,启用DMA的FIFO模式并设置阈值(如半满/全满)可减少总线竞争导致的错位风险。
mcuku 阿沐 · 2026-08-27