一、目的
MPU即Memory Protection Unit(存储器保护单元),此处的Memory不单单指SRAM,也包括ROM、FLASH、FMC等等,是地址空间的概念。
其实MPU在Cortex-M0/M3/M4/M33系列的STM32 MCU(F1/F4系列)就有,只是M0/M3/M4系列的MCU主频都偏低也没有Cache功能,并且我们一般也很少关心存储器类型、访问权限问题(MCU复位后默认工作在特权级线程模式),所以基本上大家都不会去使用它(默认的内存映射、属性配置、访问权限足够使用);但是当我们在使用Cortex-M7内核的MCU时(例如STM32H750),不好好的去学习一下MPU并进一步去理解Cache的相关知识,那么就可能会遇到奇奇怪怪的问题却无法定位解决。
我就是在使用Quad SPI DMA传输时遇到DMA读取然后CPU进行比较时发现数据不一致问题后纠结了好久(以为是自己哪边没有配置好导致的),并且也在网上找了很多别人所讲的各种教程,没有一个能讲清楚的,后来才知道是因为默认的Cache配置导致的问题(如果使能数据Cache的情形下不修改默认的Cache策略),解决办法是设置Quad SPI地址区间为Strongly-Ordered类型。
本篇的主要目的是介绍MPU到底能做些什么,为什么需要它,以及如何使用它;
下一篇中讲解Cache是什么,MPU如何和Cache配合提升系统性能以及使用注意点。
由于MPU涉及到的内容比较多,需要大家有一定的Cortex-M系列的知识,所以大家第一遍阅读的时候如果看不懂就多看几遍,英文好的直接看下面提供的链接。
先放几张图方便后面讲解
上图是STM32各个系列的MPU配置对比情况,我们可以看到每个Cortex-M内核最大可以有多少个Region,每个Region的大小设置范围,Region memory attributes是重点;需要注意的是M33区别较大,请自行查阅资料理解,其他相关内容我们下面都会一一讲解。
上图是MPU里面涉及的Region的重叠以及优先级概念(只要记住数字越大优先级越高)。
上图是M7的存储器地址映射,大家肯定再熟悉不过了,当时我们可能只关注了各个区的地址分布、大小以及基本类型,但是存储器地址映射中还有一个很重要的内容叫做Memory Types and Attributes(存储器类型和属性);之所以重要是因为存储器类型和属性决定了访问这块区域的行为。
上图是使用Cache时可能存在的数据一致性问题的一个经典示例。这类型情形一般发生在多主机访问时,例如CPU和DMA。
上面的几张示例图下面都会有详细的讲解,下面我们将开始正式的MPU知识学习之旅。
二、介绍
按照惯例我们先贴上官网提供的资料(有ARM官网的,有NXP的,也有ST的)
ARM Cortex-M7 Devices Generic User Guide r1p1https://developer.arm.com/documentation/dui0646/b/Cortex-M7-Peripherals/Optional-Memory-Protection-Unit 这个资料是ARM官网的关于M7架构的最权威资料,如果想对系统架构深入了解,这个是必须要看的,也是提升自己的最有效途径。
Managing memory protection unit in STM32 MCUs - Application notehttps://www.st.com/resource/en/application_note/dm00272912-managing-memory-protection-unit-in-stm32-mcus-stmicroelectronics.pdf#:~:text=The%20cache%20control%20is%20done%20globally%20by%20the,that%20provides%20up%20to%204%20Gbytes%20of%20addressablememory.Level 1 cache on STM32F7 Series and STM32H7 Series
https://www.st.com/resource/en/application_note/dm00272913-level-1-cache-on-stm32f7-series-and-stm32h7-series-stmicroelectronics.pdf
STM32F7 Series and STM32H7 Series Cortex®-M7 processor programming manualhttps://www.st.com/content/ccc/resource/technical/document/programming_manual/group0/78