MPU,即内存保护单元,可以设置不同存储区域的存储器访问特性(用户级、特权访问、全访问)和存储器属性(如可缓存、可缓冲、可共享),对存储器(主要是内存和外设)提供保护,从而提高系统可靠性。
存储器访问特性
权限类型 特权模式(内核) 用户任务 典型用途 特权只读(PRIV_RO) 可读 不可访问 (触发故障) 保护只读内核代码/常量 特权读写(PRIV_RW) 可读写 不可访问 (触发故障) 内核数据结构、关键寄存器 全访问(FULL_ACCESS) 可读写 可读写 用户堆栈、共享内存 存储器属性
存储器属性 硬件行为 数据一致性 典型用途 可缓存 读写经过Cache 需软件维护(Clean/Invalidate) 单核私有高性能数据 可缓冲 写入通过Write Buffer异步完成 可能导致顺序重排 低速外设寄存器 可共享 允许多主设备访问 硬件强制同步或禁用缓存 DMA缓冲区、多核共享内存 作用
阻止用户应用程序破坏操作系统使用的数据;
阻止一个任务访问其他任务的数据区,从而隔离任务;
把关键数据区域设置为只读从根本上解决被破切的可能;
检测意外的存储访问,如堆栈溢出、数组越界等;
将SRAM或RAM空间定义为不可执行,防止注入攻击;
STM32的MPU保护单元配置
在STM32H743(Cortex-M7内核)中,MPU可配置保护16个内存保护区域,每个区域最小要求256字节,且每一个区域还可配置为8个子域(大小一样)。
一、MPU控制模式
MPU(Memory Protection Unit)控制模式决定了在默认状态或异常处理期间MPU的行为及其对内存访问的影响。
控制模式 | 背景区域行为 | 异常期间MPU状态 | 安全性 | 典型用途 |
---|---|---|---|---|
NOT USED | 无,所有内存开放 | 无效 | 无 | 调试/无保护需求 |
BR禁访+MPU异常禁用 | 不可访问 | 禁用 | 中 | 通用RTOS |
BR禁访+MPU异常启用 | 不可访问 | 启用 | 高 | 高安全固件 |
BR特权+MPU异常禁用 | 仅特权访问 | 禁用 | 中-高 | 特权分离系统(如Linux内核空间) |
BR特权+MPU异常启用 | 仅特权访问 | 启用 | 最高 | 安全认证产品(ISO 26262 ASIL-D) |
二、三种内存类型
- Normal memory:CPU以最高效的方式加载和存储字节、半字和字,CPU对于这种内存区的加载或存储不一定要按照程序代码的顺序执行;
- Device memory:加载和存储要严格按照次序进行,硕确保寄存器按照正确顺序执行;
- Strongly ordered memory:程序完全按照代码顺序执行,CPU会等待当前加载存储执行完毕后才执行下一条指令,导致性能下降。
内存类型 | 适用对象 | 性能 |
---|---|---|
Normal memory | ROM、FLASH、SRAM | 高 |
Device memory | 外设 | 中 |
Strongly ordered memory | 强序 | 低 |

三、Cache介绍
Cache(高级缓存)是提升STM32性能的关键一步。M7内核芯片做了一级Cache支持,Cache分为数据缓存D-Cache和指令缓存I-Cache。
Cache支持4种基本操作:(使能、清空、禁止、无效化)。

数据缓存D-Cache是解决CPU加速访问SRAM,MPU能够指定区域的Cache策略
1、Cache写操作
写命中(Cache hit):CPU要写的SRAM区数据在Cache中已经开辟了对应的区域;
处理方式 说明 write through 直接写到内存并并同时放到cache里面,内存和cache同步更新 write back 数据更新时只写入cache,只有数据替换时被修改的cache数据才写到内存 写不命中(Cache Miss):Cache里面没有开辟对应的区域;
处理方式 说明 write allocate 把要写的数据载入到cache,对cache写后更新到内存 no write allocate 直接写入内存
2、Cache读操作
读命中(Cache hit):CPU要读取的SRAM区数据在Cache中已经加载好;
处理方式 说明 Cache read 直接从cache中读出数据即可(不能保证数据一致性) 读不命中(Cache Miss):Cache里面没有需要读的数据;
处理方式 说明 read through 直接从内存中读出,不用cache read allocate 把数据从内存加载到cache,再从cache读取
2、数据一致性解决
设置共享属性
Cache相当于没有开启。
软件维护
操作 函数 说明 clean清空 SCB_CleanDCache() 当Cache已变化,内存没有更新时,DMA搬运之前进行此操作,将Cache同步到内存 invalidata无效化 SCB_InvalidataDCache() 当SRAM数据已变化,Cache未更新时,DMA搬运数据后,将SRAM数据同步到Cache中
二、区域设置
配置项 | 说明 |
---|---|
MPU Region | 参数类型:Enable/Disable,是否启用区域MPU区域保护 |
MPU Region Base Address | 定义Region 0的起始地址(地址必须按区域大小对齐) |
MPU Region Size | 设置Region 0覆盖的内存大小。 |
MPU TEX field level | 扩展内存类型(用于细化内存属性和缓存策略) |
MPU Shareability Permission | 参数类型:Enable/Disable,是否共享 |
MPU Cacheable Permissionn | 参数类型:Enable/Disable,是否缓存 |
MPU Bufferable Permissionn | 参数类型:Enable/Disable,是否缓冲 |
MPU Instruction Access | 参数类型:Enable/Disable,是否使能从该区域执行指令。 |
MPU Access Permission | 见下表 |
TEX是内存的“身份证”,告诉硬件它属于哪一类(普通RAM、设备寄存器还是特殊内存),而C/B是它的“行为指南”(如何读写)。两者协作但职责分离。

MPU设置内存的访问权限(MPU Access Permission)
参数 执行(x) 读(R) 写(W) 典型用途 ALL ACCESS NOT PERMITTED
❌ ❌ ❌ 内存隔离/非法访问检测 Privileged READS
❌ ✔️ ❌ 只读配置表(仅内核可访问) Privileged READS + Unprivileged READS
❌ ✔️ ❌ 全局只读数据 Privileged READ/WRITE
❌ ✔️ ✔️ 内核数据结构 / 外设寄存器 Privileged READ/WRITE + Unprivileged READS
❌ ✔️ ❌ 安全日志(用户只读,内核可写) ALL ACCESS PERMITTED
✔️ ✔️ ✔️ 完全开放区域(调试/启动阶段)
三、建议配(MPU_TEX_LEVEL0)(注意考虑数据一致性问题)
设备 | 基地址 | 区域大小 | 指令访问 | 访问权限 | 共享、Cache、缓冲 |
---|---|---|---|---|---|
DTCM | 0x2000 0000 | 128K | 允许 | 全访问 | 不共享、cache、缓冲 |
AXI SRAM | 0x2400 0000 | 512K | 允许 | 全访问 | 不共享、cache、缓冲 |
SRAM1~3 | 0x3000 0000 | 512K | 允许 | 全访问 | 不共享、cache、缓冲 |
SRAM4 | 0x3800 0000 | 64K | 允许 | 全访问 | 不共享、cache、缓冲 |
FMC | 0x6000 0000 | 64M | 允许 | 全访问 | 不共享、不cache、不缓冲 |
SDRAM | OxC000 0000 | 64M | 允许 | 全访问 | 不共享、cache、缓冲 |
NAND | 0x8000 0000 | 256M | 不允许 | 全访问 | 不共享、不cache、不缓冲 |
SPI FLASH | 0x9000 0000 | 8M | 允许 | 全访问 | 不共享、cache、缓冲 |