在STM32F4上启用D-Cache后,DMA与外设数据不一致的根因是CPU和DMA对同一内存的缓存视图不同。排查时,先确认DMA描述符和缓冲区是否位于可缓存区域(默认SRAM可缓存),并检查SCB->CACR是否启用强制写通(如非易失性RAM)。解决首选:1) 将DMA缓冲区分配到非缓存区(如DTCM或通过MPU配置为Device/Strongly-ordered);2) 若必须用缓存区,在DMA启动前调用SCB_CleanDCache_by_Addr()(写方向)或在DMA完成后调用SCB_InvalidateDCache_by_Addr()(读方向),注意地址需32字节对齐且长度按行对齐;3) 对频繁交互的外设(如UART、SPI),建议使用双缓冲并配合DMA中断中执行缓存维护。实操建议:先用逻辑分析仪确认数据时序,再逐层检查缓存操作,避免盲目加延迟。
mcuku 阿沐 · 2026-09-05