最近用Cube打算生成一些代码时候发现生成过程会提示是否启用MPU.
当启用后生成默认的配置.
可以看出除了设置了背景区(MPU在HardFault时关闭,默认特权模式全部可以访问),还额外设置了一个区,覆盖了差不多整个4GB.
而STM32本身配置是分开了8个大区域.
- 0x00000000 - 0x1FFFFFFF => 代码区
- 0x20000000 - 0x3FFFFFFF => RAM区
- 0x40000000 - 0x5FFFFFFF => 外设区
- 0x60000000 - 0x7FFFFFFF => FMC(NOR/PSRAM/SRAM)区
- 0x80000000 - 0x9FFFFFFF => FMC(NAND/QSPI)区
- 0xA0000000 - 0xBFFFFFFF => 外部设备(保留)区
- 0xC0000000 - 0xDFFFFFFF => 外部设备(SDRAM)区
- 0xE0000000 - 0xFFFFFFFF => 保留区
其中加粗的区域就是0x87覆盖的区域,他应用背景设置,其中代码区实际常用于写入就只有ITCM,策略是WT(写穿),而RAM区由于访问比较缓慢,默认是WB(写回,写分配)策略,这样保证每次访问时候都是最高性能,但是有缓存一致性问题,外社区不用想必然要写到做到,强顺序,而FMC和外部设备默认都是没有的,所所以这里用了一个默认策略覆盖,当然我们也可以自己定义,FMC(NOR/PSRAM/SRAM)区和片内SRAM策略一样,而NAND和QSPI通常不会怎么修改,因此默认策略和代码区一样,外部设备区和内部设备的配置一样.由于默认没这些设备,所以Cube默认配置不允许访问他们,这也算是保护不要乱放问到不该访问的地方吧,至于最后一个保留区为什么会被排除,在手册中也没找到所以然.