理解STM32上的MPU和Cache (一)

本文主要介绍了STM32上的Memory Protection Unit(MPU)的作用、为何需要MPU,以及MPU的实战应用。内容涵盖MPU的目的、存储器类型、访问权限、MPU寄存器描述等,旨在帮助读者理解MPU如何增强嵌入式系统的鲁棒性和安全性。文章以Cortex-M7为例,结合官方文档和实例,解析MPU的配置和使用,为后续的Cache知识学习奠定基础。
摘要由CSDN通过智能技术生成

 一、目的

        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 Serieshttps://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

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32MPU6050是两种不同的设备。STM32是意法半导体公司(STMicroelectronics)推出的一系列32位微控制器产品,它具有高性能、低功耗和丰富的外设接口等特点,被广泛应用于各种嵌入式系统中。而MPU6050是一款六轴惯性传感器,可测量加速度和角速度,常用于姿态测量、运动控制和导航等应用。 在使用STM32MPU6050进行姿态测量时,需要进行一系列的初始化设置。首先,可以通过设置MPU6050的寄存器来复位设备、唤醒设备和选择传感器的工作模式。例如,将MPU_PWR_MGMT1_REG寄存器的DEVICE_RESET位设置为1来复位MPU6050,然后将SLEEP位设置为0来唤醒MPU6050。此外,还可以通过设置其他寄存器来控制陀螺仪和加速度传感器的开启与关闭,以及设置采样率分频等参数。 在读取MPU6050的数据时,可以使用相应的函数来获取温度值、陀螺仪值和加速度值。例如,通过读取MPU_TEMP_OUTH_REG寄存器和MPU_GYRO_XOUTH_REG、MPU_GYRO_YOUTH_REG、MPU_GYRO_ZOUTH_REG寄存器来获取温度值和陀螺仪值,再通过相应的计算公式将原始值转换为实际值。此外,还可以通过读取MPU_ACCEL_XOUTH_REG、MPU_ACCEL_YOUTH_REG、MPU_ACCEL_ZOUTH_REG寄存器来获取加速度值。 最后,对于MPU6050的灵敏度设置,可以通过设置相应的寄存器来选择陀螺仪和加速度传感器的量程。例如,通过设置MPU_Set_Gyro_Fsr函数来选择陀螺仪的量程,通过设置MPU_Set_Accel_Fsr函数来选择加速度传感器的量程。 综上所述,STM32MPU6050是两种不同的设备,可以通过设置寄存器和使用相应的函数来进行初始化设置和数据获取。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值