这是典型的Cache一致性问题。DMA直接写内存,CPU可能读到D-Cache中的旧数据,或DMA写入被回写覆盖。彻底解决分三步:1)用MPU把DMA缓冲区所在区域配置为Normal、Non-cacheable(TEX=1,C=0,B=0,S=1),或配置为Write-Through并配合维护;最省事是Non-cacheable,一劳永逸。2)若必须Cacheable,接收前对缓冲区执行SCB_InvalidateDCache_by_Addr(),注意地址和长度按32字节对齐(H7 Cache line为32B),长度向上取整,且缓冲区起始地址32字节对齐,避免误失效相邻数据。3)发送方向在DMA启动前执行SCB_CleanDCache_by_Addr()。另外,MPU配置需在使能Cache前完成,并确保DMA缓冲区不与栈、堆或其他变量共享同一Cache line,建议用__attribute__((aligned(32)))并单独分配。若用DTCM,注意DTCM不经过Cache,DMA无法访问,需放在AXI SRAM并配MPU。
mcuku 阿沐 · 2026-09-28