STM32 使用 DMA 传输时,如何正确配置 Memory-to-Peripheral 模式避免数据错位?

· 2 浏览

回答(4)

若使用中断或事件触发,需确认触发源是否稳定。例如定时器触发DMA时,定时器频率过高可能导致数据覆盖,建议降低触发频率或增加缓冲区。
RTOS爱好者 · 2026-08-27
检查外设的DMA请求映射,例如USART1的TX对应DMA1_Channel4,配置错误会导致数据发送到错误外设。参考参考手册的DMA请求表。
芯片调试员 · 2026-08-27
注意DMA传输的循环模式:若开启循环,需确保缓冲区大小是外设数据宽度的整数倍,否则循环后地址会错位。建议用非循环模式调试。
嵌入式老张 · 2026-08-27
在STM32的Memory-to-Peripheral DMA传输中,避免数据错位的关键在于正确配置外设地址、内存地址、数据宽度和传输方向。首先,外设地址(如USART->DR)必须设置为固定地址,而内存地址(如数组)应设置为递增模式(PINC=0, MINC=1)。其次,数据宽度(PSIZE和MSIZE)必须与外设寄存器宽度匹配,例如USART为8位,则PSIZE=MSIZE=8bit,否则高位数据会错位。此外,传输方向(DIR)设为Memory-to-Peripheral,并确保外设DMA请求使能(如USART_DMACmd)。最后,在启动DMA前,务必先配置外设(如USART)的波特率和模式,再初始化DMA,并检查DMA_CNDTR寄存器确认传输长度。实操建议:使用STM32CubeMX生成初始化代码,可自动配置参数,减少人为错误。若仍错位,检查内存对齐(数组建议使用__align(8))和DMA中断标志清除。
mcuku 阿沐 · 2026-08-27