
1 、问题起因 有人询问 STM32F7 和 STM32H7 系列库例程中有关 MPU 配置中的下面这句加绿色下划线的代码的意思是什么?有何用? ![]() 从上面截图中的红色框内代码我们不难看出,这里进行 MPU 设置就是将从 0 开始的 4G 空间,即整个STM32 可寻址空间定义为 Strongly Ordered 存储属性。且此时 MPU Region 编号为 0。可代码注释上又说只是将未定义的区域配置为 Strongly Ordered,这未定义区域到底啥意思,该如何理解?难道跟绿色下划线标示的那行代码有关系。 那么,这句代码 MPU_InitStruct.SubRegionDisable = 0x87; 又是什么意思呢? 要理解这行代码的意思,我们就有必要了解 MPU 的子区概念【Subregion】。 2 、问题解析 所谓子区【Subregion】,当我们对任一存储空间不小于 256B 的区域【Region】进行 MPU 配置时,往往可以把该区【region】等分为 8 个子区【Subregion】,并可以把当前 MPU 配置选择性地针对各个子区进行排除性设置。在内核里有个关于 MPU 配置的寄存器 MPU_RASR,其中有个 8 位字段 SRD 就是用来设置各个子区的 MPU 排除性设置或者说例外性配置。如果某位为 0,表示该子区适用当前 MPU 配置;如果某位为 1,表示该位所对应子区不适用当前 MPU 配置,即不受当前 MPU 配置约束。下图是 MPU_RASR 寄存器的描述截图: ![]() 不妨举例说一下。假设我们选择了某 64MB 区域进行 MPU 设置,属性配置如下: ![]() 基于上面配置,该 64MB 空间配置为不共享、可缓存、可执行程序的 MPU 存储属性【细节可以核对下图4,其中 C 表示 Cacheable,B 表示 Bufferable,S 表示 Shareable】 ![]() 这里有针对个别子区做了 MPU 属性排除操作,就是下面靠这句代码实现的:MPU_InitStruct.SubRegionDisable = 0x28;//即二进制 00101000 前面说过了,我们可以将大于 256B 的存储区等分为 8 个子区并做 MPU 属性排除配置。这里的 0x28 对应的8 位 2 进制数表示各个子区针对当前 MPU 配置是否被排除在外的情况,若某位为 0 时表示相应子区适用当前 MPU 配置属性,为 1 则不适用当前 MPU 的配置。 结合前面寄存器描述和上面配置代码,被排除在外的即不适用当前 MPU 配置的子区就是下图 5 中的两个地址空间【标红色 1 的地方】: ![]() 若把上面图形左转 90°即可看明白刚才那个 SRD 字段的配置值 0x28 的由来以及地址空间对应关系,SRD 的高位对应高地址子区。基于上面配置,有 2 个 8KB 空间是不适用当前的 MPU 配置,即被排除在外了。 完整版请查看:附件 ![]() |
STM32 GUI LTDC 最大像素时钟评估方法
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南