STM32H7 的 AXI SRAM 与 DTCM 在 DMA 访问下的性能差异与配置陷阱

· 8 浏览

回答(4)

链接脚本里把DMA缓冲段显式定位到0x24000000,并加__attribute__((section(".dma_buffer"))),省心。
码农小张 · 2026-09-25
实测AXI SRAM在DMA下带宽约200MB/s,DTCM虽快但DMA不可达,别为了性能踩坑。
H7玩家 · 2026-09-25
补充:MDMA可以访问DTCM,但通用DMA不行。若必须用DTCM做缓冲,只能走MDMA,且注意MDMA也有Cache问题。
嵌入式老鸟 · 2026-09-25
STM32H7的AXI SRAM(通常位于0x24000000)和DTCM(0x20000000)在DMA访问下差异显著。DTCM紧耦合内核,零等待、高带宽,但仅CPU和MDMA可访问,通用DMA1/2无法访问DTCM,这是最常见陷阱:若DMA缓冲区放在DTCM,DMA传输会失败或触发总线错误。AXI SRAM则所有主设备(CPU、DMA1/2、MDMA、LTDC等)均可访问,但需注意总线矩阵仲裁和Cache一致性。性能上,DTCM用于CPU高频访问数据(如栈、实时变量),AXI SRAM适合DMA缓冲,但若CPU同时访问会竞争带宽。配置陷阱:1) 误将DMA缓冲放DTCM导致HardFault;2) 使用AXI SRAM时未处理D-Cache,DMA写入后CPU读到旧数据,需调用SCB_InvalidateDCache_by_Addr或配置MPU为Write-Through;3) 链接脚本未正确分配段,导致变量意外落入DTCM。建议:DMA缓冲统一放AXI SRAM(或SRAM1/2/3),并启用MPU将DMA区域设为Non-Cacheable,或手动维护Cache。
mcuku 阿沐 · 2026-09-25