排查D-Cache与DMA数据不一致,核心是理解Cache一致性(Cache Coherency)问题。首先,确认DMA描述符和缓冲区地址是否满足32字节对齐(STM32F4的Cache line大小通常为32字节)。若未对齐,DMA写入可能跨越两个Cache line,导致部分数据被Cache覆盖。实操建议:1)使用`__ALIGN_BEGIN`或`__attribute__((aligned(32)))`声明描述符和缓冲区;2)在DMA传输前调用`SCB_CleanDCache_by_Addr`(若CPU写数据给DMA)或`SCB_InvalidateDCache_by_Addr`(若DMA写数据给CPU),且地址和长度需按32字节对齐(可向上取整);3)若使用HAL库,检查是否启用了`D-Cache`(`SCB_EnableDCache()`),并确保DMA配置为`DMA_MemoryDataWidth_Byte`等,避免半字/字节访问导致部分更新。排查步骤:先关闭D-Cache测试是否复现,若复现则问题在DMA配置;若不复现则确认Cache操作。建议在DMA完成中断中,先Invalidate再读取数据,并确保描述符本身不被DMA修改(若修改需Clean)。
mcuku 阿沐 · 2026-08-27