STM32H7内存架构概览:Flash、SRAM、DTCM、ITCM、AXI SRAM的地址映射与总线连接

STM32H7系列(特别是双核H745/H747及单核H743/H750)之所以能在高性能MCU市场中占据重要地位,其复杂而精细的内存架构功不可没。与传统的STM32F1/F4系列相比,H7并非简单地将SRAM容量增大,而是引入了哈佛架构下的多总线并行访问机制,将物理内存划分为多个独立域:嵌入式Flash、通用AXI SRAM、紧耦合指令存储器(ITCM)、紧耦合数据存储器(DTCM)以及备份SRAM等。理解这些内存块的地址映射、总线主设备(如Cortex-M7内核、DMA、以太网MAC)与从设备(内存块)之间的连接关系,是进行高效内存分配、避免总线冲突和提升实时性的前提。本章将系统梳理H7的内存地图,重点剖析AXI SRAM与DTCM在总线拓扑中的位置差异,为后续章节的分配策略打下坚实基础。

STM32H7 内存架构与总线连接拓扑 Cortex-M7 内核 主频 480/550 MHz 双发射 乱序执行 I-Cache / D-Cache ITCM 接口 | DTCM 接口 ITCM RAM 0x0000 0000 - 0x0000 FFFF 64KB 指令紧耦合 DTCM RAM 0x2000 0000 - 0x2001 FFFF 128KB 数据紧耦合 AXI 总线矩阵 (互连) 多主多从 交叉开关 主设备: - M7 AXI 主接口 - DMA1/DMA2 - MDMA - 以太网 MAC - USB HS - 摄像头接口 DCMI - LCD-TFT 控制器 AXI SRAM 0x2400 0000 - 0x2407 FFFF 512KB (H743) 可配置为 3 个独立 SRAM 块 SRAM1/2/3 (D2域) 0x3000 0000 - 0x3003 FFFF 嵌入式 Flash 0x0800 0000 - 0x080F FFFF 1MB (H743) / 2MB (H750) 专用总线(无延迟) AXI 总线(高带宽) AXI 总线 紧耦合内存 (TCM) AXI SRAM / 外设 SRAM

上图展示了STM32H7内存架构的核心拓扑。Cortex-M7内核通过两组独立的接口访问内存:一组是专用的ITCM/DTCM接口,另一组是标准的AXI主接口。ITCM与DTCM直接挂载在内核的紧耦合总线上,访问延迟极低(零等待周期),而AXI SRAM、Flash以及外设SRAM则通过AXI总线矩阵与内核及其他总线主设备(如DMA、以太网)相连。这种设计使得内核可以同时从ITCM取指、从DTCM读写数据,并通过AXI接口访问外设或大容量SRAM,实现真正的并行执行。

2.1 内存块地址映射详解

STM32H7的内存映射遵循ARM Cortex-M7标准布局,但各厂商会在此基础上定义具体的SRAM和外设地址。对于H7而言,最关键的几个区域如下表所示:

内存区域起始地址结束地址容量 (H743)总线接口访问特性
ITCM RAM0x0000 00000x0000 FFFF64 KBITCM 专用总线零等待,仅内核可访问
DTCM RAM0x2000 00000x2001 FFFF128 KBDTCM 专用总线零等待,仅内核可访问
AXI SRAM0x2400 00000x2407 FFFF512 KBAXI 总线矩阵高带宽,支持多主访问
SRAM1 (D2域)0x3000 00000x3001 FFFF128 KBAXI 总线矩阵外设与DMA可访问
SRAM2 (D2域)0x3002 00000x3003 FFFF128 KBAXI 总线矩阵外设与DMA可访问
SRAM3 (D2域)0x3004 00000x3005 FFFF32 KBAXI 总线矩阵外设与DMA可访问
嵌入式 Flash0x0800 00000x080F FFFF1 MBAXI 总线矩阵指令/数据,带缓存

值得注意的是,ITCM和DTCM的地址空间在H7上被固定映射到0x00000000和0x20000000,这与Cortex-M7内核的设计一致。但H7的DTCM容量为128KB,而ITCM为64KB,这与M7内核最大支持16MB TCM的规格相比有所裁剪。此外,AXI SRAM虽然物理上是一个连续的512KB块,但在内部被划分为三个独立的SRAM子块(SRAM1/2/3),每个子块可以独立地被不同总线主设备访问,从而减少冲突。

核心原理:地址映射不仅仅是地址的简单排列,它决定了访问路径。例如,CPU访问DTCM时,地址直接通过DTCM总线发送到DTCM控制器,无需经过AXI总线矩阵,因此延迟极低。而访问AXI SRAM时,地址必须经过AXI总线矩阵的仲裁,如果此时DMA也在访问同一SRAM块,就会产生等待周期。

2.2 总线连接与主从设备矩阵

STM32H7的总线架构是一个多主多从的交叉矩阵。理解这个矩阵,是分析内存访问冲突的关键。主要的总线主设备包括:

  • Cortex-M7 AXI 主接口:内核通过此接口访问AXI SRAM、Flash、外设SRAM以及外部存储器(如SDRAM)。
  • Cortex-M7 ITCM/DTCM 接口:专用接口,仅连接ITCM和DTCM。
  • DMA1/DMA2:通用DMA控制器,可访问所有SRAM和外设。
  • MDMA:内存到内存DMA,支持大块数据传输,可访问全部内存空间。
  • 以太网MAC、USB HS、DCMI、LCD-TFT:这些外设通过AXI总线直接访问内存,实现高速数据搬运。

从设备(内存块)侧,AXI SRAM、SRAM1/2/3、Flash以及外部存储器控制器(FMC)都挂载在AXI总线上。总线矩阵的作用就是根据访问地址,将主设备的请求路由到对应的从设备。例如,当以太网MAC想要将接收到的数据包写入AXI SRAM时,它通过AXI总线矩阵直接访问0x24000000地址,无需CPU干预。

2.3 访问延迟与带宽对比

不同内存的访问性能差异巨大,这是内存分配策略的核心依据。下表对比了典型访问延迟(以CPU主频480MHz为例):

内存类型访问延迟 (周期)带宽 (字节/周期)典型应用场景
DTCM0 (零等待)8 (64位)实时变量、中断栈、关键数据
ITCM0 (零等待)8 (64位)实时中断服务程序、时间关键代码
AXI SRAM1-2 (无冲突时)8 (64位)大块数据缓冲、DMA目标、共享内存
SRAM1/2/32-3 (经总线矩阵)4 (32位)外设数据缓冲、DMA源/目标
Flash (指令)2-3 (命中缓存)8 (128位预取)程序存储、常量表

从表中可以看出,DTCM和ITCM的零等待特性使其成为实时性要求极高的数据(如电机控制环路的PID参数)和代码(如PWM中断处理函数)的首选。而AXI SRAM虽然延迟稍高,但其512KB的大容量和同时支持多主设备访问的特性,使其成为数据缓冲和DMA传输的理想选择。

经验提醒:在H7上,如果将一个频繁访问的全局变量定义在DTCM中,其访问速度比定义在AXI SRAM中快约2-3倍。但DTCM只有128KB,且无法被DMA访问。因此,需要将“CPU频繁访问且不需要DMA介入”的数据放在DTCM,而将“需要DMA搬运或数据量较大”的数据放在AXI SRAM。

2.4 实战场景:基于内存特性的任务划分

假设我们正在设计一个工业以太网伺服驱动器,需要处理以下数据流:

  1. 电流环控制:以10kHz频率运行,需要读取ADC采样值,执行PID计算,更新PWM比较寄存器。此任务对延迟极度敏感。
  2. 以太网通信:接收上位机指令,发送状态反馈。数据包大小约1KB,频率1kHz。
  3. 数据记录:将运行状态以100Hz频率存储到外部SDRAM。

根据内存特性,我们可以做如下分配:

  • DTCM:存放电流环的PID系数、ADC采样结果、PWM比较值。这些变量被CPU高频访问,且不需要DMA介入。
  • ITCM:将电流环中断服务函数(ISR)的代码复制到ITCM中执行。这样可以确保ISR的取指零等待,避免因Flash预取缓存未命中而导致的延迟抖动。
  • AXI SRAM:作为以太网DMA的描述符和数据缓冲区。以太网MAC通过AXI总线直接访问此区域,实现数据包的高速收发,无需CPU逐字节拷贝。
  • SRAM1/2/3:作为ADC的DMA目标缓冲区,或者作为LCD显示帧缓冲(如果使用)。

通过这种划分,电流环的ISR执行时间可以稳定在1.5μs以内(480MHz主频下),而以太网通信的吞吐量可以达到线速(100Mbps),且CPU占用率低于30%。

风险提示:在将代码复制到ITCM时,必须注意ITCM的容量限制(64KB)。如果代码超过此限制,需要仔细裁剪。此外,ITCM中的代码在MCU复位后不会自动加载,需要在启动代码中手动从Flash复制。如果复制过程被中断,可能导致程序跑飞,因此复制操作应放在系统初始化阶段,并关闭相关中断。

2.5 常见误区与总结复盘

在实际项目中,工程师常犯以下错误:

  • 误区一:将所有变量都放在DTCM中。DTCM容量有限,且无法被DMA访问。如果DMA需要访问这些数据,会导致总线错误或数据不一致。
  • 误区二:忽视AXI SRAM的块冲突。虽然AXI SRAM支持多主访问,但如果两个主设备同时访问同一个SRAM子块(如SRAM1),总线矩阵会插入等待周期。应尽量将不同主设备的数据放在不同的SRAM子块中。
  • 误区三:将大数组定义在DTCM中。例如,定义一个512KB的音频缓冲区在DTCM中是不可能的,编译器会报错。应使用AXI SRAM。
  • 误区四:混淆ITCM与Flash的地址。ITCM的地址是0x00000000,而Flash的地址是0x08000000。如果链接脚本配置错误,程序可能从ITCM启动(此时ITCM为空),导致硬件错误。

总结复盘:本章的核心在于理解“地址映射决定访问路径,访问路径决定性能”。STM32H7的内存架构通过将不同特性的内存映射到不同地址空间,并连接到不同的总线接口,实现了性能与容量的平衡。在实际开发中,应遵循以下原则:

  1. 实时性要求最高的代码和数据 → ITCM/DTCM。
  2. 大容量、需要DMA访问的数据 → AXI SRAM。
  3. 外设相关的缓冲 → SRAM1/2/3(D2域),以缩短外设到内存的路径。
  4. 程序主体 → Flash,利用I-Cache加速。