STM32H733 MPU、AXI、FMC学习

STM32H733 MPU、AXI、FMC学习

一、什么是MPU

MPU (Memory Protection Unit,内存保护单元):

它是Cortex-M7内核内部的一个可选组件,用于 " 定义内存的访问权限和属性 "。MPU可以将整个内存映射划分为最多16个区域,并为每个区域独立设置:

  • 访问权限:例如只读、只写、禁止执行 (XN) 等。
  • 内存类型:普通内存 (Normal) 或设备内存 (Device)或Strongly ordered。
  • 缓存策略:可缓存/不可缓存,以及回写 (Write-Back) 或透写 (Write-Through) 等。

二、MPU的三种内存类型

复制代码
     图1.通过寄存器配置内存模式     

MPU 可以配置的三种内存类型如下:

1. Normal memory

Normal 内存就是"正常的内存",用来存放代码和数据。CPU 认为这段地址背后是普通的存储单元,读写它不会产生副作用。

行为特点

  • 允许缓存:可以配置为可缓存或不可缓存。

  • 允许推测访问:CPU 可以提前读取,即使程序不一定用到。

  • 允许重排和合并:多个访问可以合并、乱序执行,以提高总线效率。

  • 弱排序:不保证严格的程序顺序,只要数据依赖正确即可。
    子类型

  • Non-cacheable(禁用Cache):每次访问都直接到内存,但 CPU 仍可能重排、合并。

  • Write-through(写透):写操作同时更新缓存和内存,读可缓存。

  • Write-back(写回):写操作只更新缓存,稍后再写回内存。性能最高,但需手动维护一致性。

  • Write allocate / No write allocate:写未命中时是否分配缓存行。

2. Device memory

它的核心设计目标是在保证外设访问顺序正确的前提下,尽可能地提升访问效率。与追求极致性能的 Normal 内存和追求绝对顺序的 Strongly-ordered 内存不同,Device 内存通过 G、R、E 三个子属性,在"顺序安全"与"性能"之间提供了多档可调的平衡点。

行为特点

  • 禁止缓存(禁用Cache):访问直接到外设。
  • 禁止推测访问:CPU 不会提前读取,避免误触发外设。
  • 顺序受限:访问顺序不能随意重排,但可以通过子属性放松。
  • 允许一定优化:通过 G、R、E 三个子属性控制。
    内存的行为完全由三个子属性决定,每个属性都可以开启或关闭(前缀 n 表示禁止)

子类型

  • G (Gathering,合并):是否允许将多个访问合并为一个总线事务。禁止时(nG),每次读写都会作为独立事务发送到外设,保证外设能感知到每一次独立的访问。
  • R (Reordering,重排):是否允许对同一设备的访问进行顺序重排。禁止时(nR),访问将严格按照程序代码的顺序执行。
  • E (Early Write Acknowledgement,提前写确认):是否允许写操作在真正到达外设之前就向 CPU 返回"完成"信号。允许时(E),写操作进入处理器的存储缓冲器(Store Buffer)后即可返回,CPU 无需等待其真正写入外设,从而提高了指令流水线效率。这也就是"可缓冲"特性的来源。
类型 合并 (G) 重排 ® 提前写确认 (E) 核心特点与典型用途
Device-nGnRnE 禁止 禁止 禁止 最严格。所有访问严格按程序顺序,且必须真正完成。相当于旧架构的 Strongly-ordered 内存。适用于对时序有绝对要求的关键外设寄存器(如中断控制器、DMA 寄存器)。
Device-nGnRE 禁止 禁止 允许 最常用。顺序严格保证,但写操作可被缓冲以提升性能。这正是 Cortex-M7 外设区域(0x40000000 - 0x5FFFFFFF)的默认类型。
Device-nGRE 禁止 允许 允许 允许重排,在保证无合并的前提下,为一些对顺序要求不高的外设提供更高效率。
Device-GRE 允许 允许 允许 最宽松。允许合并、重排和提前确认,限制最少,性能最高,但顺序保证最弱。
Strongly ordered memory

trongly-ordered 是最严格的内存类型,用于对顺序和时序要求极高的系统控制寄存器。它相当于 Device-nGnRnE 且总是非共享、非缓存。

行为特点

  • 严格按程序顺序访问:前面的访问不完成,后面的访问不会开始。
  • 禁止推测访问:绝不提前读取。
  • 禁止重排、合并:每个访问独立、按序。
  • 禁止早期写确认:写操作必须真正到达设备后才返回。
  • 非缓存、非共享。

三、CPU附近总线

图2.系统总线

由图中可以看到官方把系统的总线框架分成了3个域:D1(高性能核心区)、D2(通用外设区)、D3(低功耗备份区)。本次了解D1域中的部分内容

1. 多个接口
  • AHBS(AXI High-Speed Slave):用于高速外设访问(如 DMA、LCD 控制器等),是 AXI 总线的从端口。
  • AXIM(AXI Master Interface):作为 AXI 主设备发起对内存/外设的读写请求。
  • AHPB(AHB Peripheral Bus):连接低速外设或桥接器(连接到D2区域)。
2. 紧耦合存储器
名称 容量 用途说明
ITCM 64 KByte 指令紧耦合内存 ------ 存放最关键的中断服务程序、实时任务和性能敏感的算法
DTCM 192 KByte + 128 KByte = 320KB 数据紧耦合内存 ------ 存放高频变量、堆栈、DMA缓冲区等
I-Cache 32 KB 指令专用SRAM(可选配置)
D-Cache 32 KB 数据专用SRAM(可选配置)
3. AXI矩阵

图中D1下方那个大网格就是 AXI矩阵,它允许任意主设备(Master)访问任意从设备(Slave),实现并行通信,可以说是神经系统。

6 个主接口(ASIB):连接发起访问的主设备。

  • Cortex-M7 内核的 AXI 总线(AXIM)
  • D2 域到 D1 域的 AHB 互连总线(D2-to-D1 AHB)
  • SDMMC1(32位 AHB)
  • MDMA(主 DMA,64位 AXI)
  • LCD-TFT 控制器(LTDC,64位 AXI)
  • DMA2D 图形加速器(Chrom-ART,64位 AXI)
    7 个从接口(AMIB):连接被访问的从设备。
  • AHB3 总线(进一步连接 APB3 外设)
  • Flash 存储器接口 A 和 B
  • FMC 外部存储器控制器
  • QSPI 接口
  • AXI SRAM
  • 其他内部存储器或外设

这种设计运行多个主设备同时访问不同的从设备,比如:

  • 内核从Flash取指
  • DMA2D从AXI SRAM读取图像数据
  • SDMMC向QSPI Flash写入数据
    三者可并行发生,互不阻塞。我在一个视频处理项目中实测,合理利用这种并行性可使整体吞吐量提升40%。

AXI核心机制

当多个主设备同时请求访问同一个从设备时,AXI 矩阵内置的仲裁器会依据 QoS(服务质量) 机制来解决冲突。

  • QoS 寄存器:每个主接口(ASIB)都有独立的读通道和写通道 QoS 寄存器(如 AXI_INIx_READ_QOS 和 AXI_INIx_WRITE_QOS),可配置 0 到 15 的优先级值,数值越大优先级越高。
  • 仲裁规则:优先级高的主设备请求会优先得到处理。如果两个请求的 QoS 值相同,则采用 LRU(最近最少使用) 策略进行仲裁。
  • 典型应用:在图形显示场景中,可以为 LTDC 和 DMA2D 分配更高的 QoS 值,以确保屏幕刷新流畅,避免出现撕裂或卡顿。
    AXI内存映射与关键地址
    AXI SRAM 是 D1 域中最重要的高性能内存,直接挂载在 AXI 矩阵上,通常映射在 0x2400 0000 地址。其数据带宽为 64 位,可进行字节、半字、字或双字访问。除了 D3 域的 BDMA,系统内其他主设备均可访问该区域。相比之下,ITCM/DTCM 是紧耦合内存,直连内核,能以 CPU 全速运行,但不受 AXI 矩阵管理,且通常仅 CPU 和 MDMA(通过专用 AHB 端口)可访问。

四、本次FMC延迟问题判断

问题现象:在FMC通信的过程中偶发的延时现象,同时在开启的D1区域的设备有ETH(D2-to-D1 AHB) 和 OctoSPI

其实对于每个从接口都有各自的总线带宽。MPU 把 FMC 区域配成 Strongly-ordered 后,CPU 的写操作被禁止缓冲,必须同步等待 每一次写真正到达外部 RAM 并完成.在此期间,若是在此等待期间ETH(D2-to-D1 AHB) 和 OctoSPI 同时争用总线时,这个等待时间会被放大。

而配置为而 Device memory 允许写缓冲,CPU 写完即可继续。

Strongly-ordered模式的整体数据链条是这样的:

  1. CPU发出写操作 → 数据进入CPU的Store Buffer(被强制排空,无缓冲优势)。
  2. 写事务穿过AXI矩阵 → 到达FMC从接口的输出缓冲(有资料提到这个缓冲深度约为"3 writes")。
  3. FMC控制器将64位写事务拆分为多个窄位宽写操作,按外部RAM时序逐个发出。(每个接口的宽度不一致,则必须面临着数据宽度转换)
  4. CPU必须等到所有这些拆分后的写操作全部完成,才能继续执行。
    若是此时在第2步到第4步有其他接口需要处理发送 那么整体执行发送或接受的时间就会被拉长。
    配置为Device-nGnRE,允许放在缓冲区之后CPU直接返回,此时数据的传输CPU不再参与,由硬件完成。

引发的几个小疑问
  1. 配置为Device-nGnRE内存模式之后,虽然从代码层面上来说确实会快了,因为不需要等待所有执行完毕才返回,直接放在缓冲就返回,那么数据在下面真实的传输是否是有加快了?
    答:
    其实感官上的变快了是因为CPU的执行效率变高了,代码上的执行返回速度变快了。但是真实的数据其实在物理层面还和几个要素有关:
  • 外部 RAM 的时序:你配置的等待周期(Wait States)、建立/保持时间等。
  • FMC 控制器的时钟:HCLK 频率和分频系数。
  • 总线宽度转换:如前所述,FMC控制器将64位写事务拆分为多个窄位宽写操作,按外部RAM时序逐个发出。
  • AXI 矩阵的仲裁:ETH、OSPI 等主设备争用总线时的排队顺序(也就是上述数据链路的第1步)。
  1. 继续优化方向:建议适当调整QoS的优先级
  • 总线宽度转换:如前所述,FMC控制器将64位写事务拆分为多个窄位宽写操作,按外部RAM时序逐个发出。
  • AXI 矩阵的仲裁:ETH、OSPI 等主设备争用总线时的排队顺序(也就是上述数据链路的第1步)。
  1. 继续优化方向:建议适当调整QoS的优先级

  2. 继续优化方向:优化总线宽度转换的过程

相关推荐
深圳老胡1 小时前
STM32F4 OTA升级:单App与双App方案优缺点对比
笔记·stm32·单片机·代码规范
泡海椒1 小时前
JQuick-Excel 实战:用 STYLE 配置单元格与区域样式
开发语言·python·excel
CV工程师丁Sir3 小时前
ArkWeb 手记 04|DevTools 调试与缓存清理
java·spring·缓存·harmonyos
Sarvartha10 小时前
final 关键字
java·开发语言
2601_9520477910 小时前
单一策略深度教程:用轻易云把集成任务的报错实时推送到钉钉机器人
java·机器人·钉钉
Joy T10 小时前
Spring AI 项目中的 pom.xml、application.yml 与 Nacos:从依赖管理到运行配置
spring·nacos·pom.xml·profile·参数配置·application.yml
程序员Sunday10 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
数据狐(Datafox)10 小时前
淘宝图片搜索 API 落地实战:基于以图搜货搭建跨境电商选品系统
java·大数据·微服务