一段有关MPU配置代码的几个小疑问

发布者:bettylove最新更新时间:2024-01-09 来源: elecfans关键字:MPU  配置代码  STM32F7 手机看文章 扫描二维码
随时随地手机看文章

当我们阅读一些STM32F7或STM32H7系列芯片例程,或者基于这两类芯片通过cubeMx进行配置并用到MPU功能时,往往会在代码里看到下面这段MPU配置。

ab382200-73bf-11ed-8abf-dac502259ad0.png

对这段代码可能有人有些疑问,这里重点一起聊聊其中的3个,供参考。

第一个疑问,那行做赋值0x87的代码是什么意思?

第二个疑问,这段代码的注释【绿色】是说将未定义的区域配置为StronglyOrdered存储属性,这个未定义到底如何理解?从代码看,这里清晰地对从0开始的整个4G空间做了配置,未定义区域到底指的哪里?

第三个疑问,这段代码往往并不是开发者自己配置的。如果使用CubeMx进行配置它会自动给我们加上这段,为什么要加这段?很多时候经测试,即使没这段代码似乎也没有什么问题。

这几个问题,涉及到MPU和CortexM7内核芯片试探性访问的知识。我尽量通俗地加以介绍,知晓怎么回事即可。

我们知道,通过MPU可以配置特定地址空间的存储属性,给CPU约定访问权限。我们在对某块地址空间做MPU配置时,通常需要设置起始地址、空间大小、Cacheable、Bufferable、Shareable、子区属性、区块编号等。这里的地址空间,英文用Region来特指,后面都使用该词。

实际应用中我们往往会针对不同的Region做MPU配置,在做不同Region的MPU设置时,可能出现地址空间重叠的情况。比方像下面64KB空间内做了3个不同Region的MPU配置,而且发生了不同Region的地址重叠。

ab702c86-73bf-11ed-8abf-dac502259ad0.png

这个时候,对于地址重叠空间的MPU属性由Region编号大的决定。结合上图,N+2编号Region的MPU属性优先级最高,Region N的最低。

刚才我在前面提到了子区,它是什么意思呢?

子区也是个特定概念,英文用SubRegion。所谓Subregion,当我们对某地址空间不小于256B的Region进行MPU配置时,可以把该Region等分为8个子区【Subregion】,并把当前Region的MPU属性针对部分子区进行排除性或说例外性设置。啥意思呢?比方说,本来当前Region经MPU配置后为WriteThough支持共享的存储属性,同时呢,又将其中的2个子区做排除性设置,即这2个子区不适用当前的MPU配置。好比当前举国抗疫防新冠,要求全面强制核酸,但同时又可以做例外说明,那些基本足不出户的老人或小孩不适用该要求。

在MPU配置寄存器MPU_RASR里有个8位字段SRD专门用来配置子区的排除属性。每1位对应一个子区,高位对应高地址子区,低位对应低地址子区。某位为0表示该子区使用当前MPU配置,为1表示该子区不适用当前配置,即被排除在外。【更多细节可以参考下图】

ab85f160-73bf-11ed-8abf-dac502259ad0.png

不妨举例说一下,假设我们选择了某64KB区域进行MPU设置,其中有2个SubRegion被做了MPU排除处理,即其中2个8KB空间不适用当前的MPU配置。如下图所示:

aba3363a-73bf-11ed-8abf-dac502259ad0.png

此时,对应到MPU配置寄存器MPU_RASR里的SRD字段的内容就是0x48。

聊到这里,我们就可以回答开篇的部分疑问了。

ab382200-73bf-11ed-8abf-dac502259ad0.png

从上面这段代码不难看出,首先将从0开始的4GB空间做了MPU配置,Region编号为0,最终被配置为Strongly Ordered存储属性。那句赋值0x87的代码则是进一步针对当前Region里的SubRegion做属性排除设置。这里的0x87就是给前面提到的给SRD字段的赋值。【这里每个子区空间大小为512MB】

abdfde78-73bf-11ed-8abf-dac502259ad0.png

也就是说,这4GB空间中有4个子区不适用目前配置的MPU属性,即下图中几个红色方框内区域。

abf4c16c-73bf-11ed-8abf-dac502259ad0.png

换句话说,这里并没有真正针对整个4GB空间做MPU配置,实际上只对上图中的绿色区域做了StronglyOrder的存储属性设置。然而,代码的注释又说是针对未定义区域做MPU配置,怎么理解未定义区域呢?

这里说的未定义区域到底是上图中红色区域还是绿色区域呢?

显然不是指红色区域,因为这里特意对红色区域做了MPU属性排除处理,即当前MPU配置根本就不适用它。那是指绿色区域?似乎也不对!因为绿色区域的MPU配置不是很清晰吗?Region编号、地址空间、访问属性等一应俱全。何来未定义呢?

我们可以进一步了解到,上图中绿色区域对应的是外部存储设备的地址空间。如果我们需要用到外部存储设备的话,往往还会针对外扩的存储单元再做MPU配置。比方我们基于STM32H7芯片外扩了一个32MB的SDRAM,然后做了如下的MPU配置。

ac12dcec-73bf-11ed-8abf-dac502259ad0.png

照样,先对整个4GB空间做了MPU初始配置,即前面一直在解说的内容。然后针对外扩的32MB的SDRAM做了特定MPU配置,此时的Region标号为1,访问属性为Write Through。此块Region空间属于前面初始配置中外部存储空间的一部分,即出现不同Region地址重叠,所以这块SDRAM所在Region的MPU访问属性就是Write Through,而不再是一开始配置的Strongly Ordered属性了。见下图中绿色区域中那部分黄色方块。

ac4f7c10-73bf-11ed-8abf-dac502259ad0.png

当然,如果说你还外扩了其它的存储单元,比方扩个QSPI什么的,如果MPU属性依然不同于Strongly Ordered、且Region编号大于0,更多绿色区域将被新的黄色区域替换。比方变成下面图示的样子。

ac7a9fd0-73bf-11ed-8abf-dac502259ad0.png

也就是说,注释代码里提到的未定义区域,是指初始定义出来的绿色区域中没有被用户的实际外部存储器所占用的剩余空间。即上面图中抠除黄色区域以后剩下的绿色区域。

这里又衍生个问题,为什么要这样做呢?

这个问题又涉及到M7内核芯片的试探性访问特性。试探性访问可以提升芯片的性能,但有时可能也会导致些问题。比方,由于试探性访问,在CPU访问外部存储器时,可能发生越界访问。如果说它访问到一个本不存在存储设备的地址时,可能发生锁死异常。结合上面图形,黄色地址区域是实实在在的外部存储器件所占用的空间,如果因为试探性访问可能越界访问不存在物理存储单元的绿色区域而导致麻烦。

不过,由于CPU不会针对配置为Device 或Strongly Ordered存储属性的地址空间进行试探性访问。为了防止上面提到的问题,于是就有了前面谈到的一上来就把所有用于外部访问的存储空间配置为StronglyOrdered属性,显然这个配置是个粗框架性的。用户具体使用时根据实际存储器的特性、容量等再配置特定的MPU属性并覆盖原来初始设置,其它未用区域依然保持StronglyOrdered属性,正是为了防止在没有放置实际存储器的地方发生试探性访问。

最后一个问题,有人发现即使不要那段针对4GB空间的MPU初始代码,似乎也没遇到啥问题。

这也正常。因为你即使外扩了存储单元,并非一定会因为试探性访问导致异常。比方你外扩了32MB的存储单元,未必就一定会要用到最后一个位置,说不定还剩余很多,远不至于读到最后边界而让CPU试探到不存在存储器的空间。但是事先做那段初始配置,对系统是一个很好的未雨绸缪。就好像河边安置防护栏一样,没有,也不至于天天怎么样;有,肯定要安全保险得多。


关键字:MPU  配置代码  STM32F7 引用地址:一段有关MPU配置代码的几个小疑问

上一篇:如何创建硬件在环工程
下一篇:DMAMUX模块的大致原理及基本框架

推荐阅读最新更新时间:2024-10-26 17:56

一段有关MPU配置代码的几个小疑问
当我们阅读一些STM32F7或STM32H7系列芯片例程,或者基于这两类芯片通过cubeMx进行配置并用到MPU功能时,往往会在代码里看到下面这段MPU配置。 对这段代码可能有人有些疑问,这里重点一起聊聊其中的3个,供参考。 第一个疑问,那行做赋值0x87的代码是什么意思? 第二个疑问,这段代码的注释【绿色】是说将未定义的区域配置为StronglyOrdered存储属性,这个未定义到底如何理解?从代码看,这里清晰地对从0开始的整个4G空间做了配置,未定义区域到底指的哪里? 第三个疑问,这段代码往往并不是开发者自己配置的。如果使用CubeMx进行配置它会自动给我们加上这段,为什么要加这段?很多时候经测试,即使没这段代码似乎也没有
[单片机]
一段有关<font color='red'>MPU</font><font color='red'>配置</font><font color='red'>代码</font>的几个小疑问
STM32F7系统配置控制器(SYSCFG)及复位和时钟控制(RCC)
这篇文章带大家看一下 STM32F7的系统配置控制器 。系统配置控制器主要用于: 1、 选择以太网PHY接口; 2、 交换FMC SDRAM存储区域与NOR/PSRAM存储区域; 3、 管理GPIO外部中断线连接; 在系统控制寄存器里有一个bit位来选择使用哪个选项字定义的启动基地址来启动。 复位类型 一共有三种复位类型,系统复位、电源复位和备份域复位。 系统复位在VDD保持正常工作电压的前提下,有五种事件可以产生复位,分别是低功耗管理复位、软件复位、独立看门狗计数器溢出、窗口看门狗计数器溢出和NRST引脚上的低电平。这里低功耗管理复位指的是MCU执行低功耗模式进入序列的时候是产生复位还是停止待机模式,这个是可以通过选
[单片机]
STM32F7系列时钟相关问题一:HSE模式配置
老实说,用过很多的芯片,但是都没有太仔细的研究过芯片的细节,只要做的工作还是停留在调用函数的层面,但是要想更深入的学习一款芯片不了解细节是不行的。于是,我就拿阿波罗来班门弄斧了。粗略看了阿波罗的时钟体系,做一些笔记,记录下来(如果说的有错误,希望大家积极指正,我将不胜感激):从时钟源的角度,分为两类外部时钟(E)和内部时钟(I)。 从时钟速率的角度,分为两类高速时钟(HS)和低速时钟(LS)。 而把它们组合起来就有四种时钟:HSE、HIS、LSE、LSI。至于为什么会有这么复杂的时钟配置,主要是考虑到系统的性能和功耗两个方面的因素吧。单一时钟的话可能会导致性能过剩并且功耗过高。多个时钟的话可以平衡功耗和性能之间的平衡。
[单片机]
<font color='red'>STM32F7</font>系列时钟相关问题一:HSE模式<font color='red'>配置</font>
应用笔记|STM32MP1 系列 MPU 的 DDR 配置
本文档描述在 STM32MP1 系列 MPU 产品上配置 DDR 子系统(DDRSS)所需的流程和步骤。 设定 DDR 控制器(DDRCTRL)、PHY 接口(DDRPHYC)和 SDRAM 模式寄存器的多个参数以及设置完成 DDRSS 配置。 根据 DDR 类型、DDR 大小、DRAM 拓扑、运行时间频率和 SDRAM 器件数据手册参数确定这些参数。所有这些参数必须在初始化序列期间设定。 STM32CubeMX DDR 测试套件使用直观的面板和菜单隐藏了与确定正确参数和初始化启动相关的复杂性(请参考 )。为了快速设置要运行的 DDRSS,用户只需提供很少几个输入参数即可完成配置。可以使用一些高级用户模式和特殊功能(当
[单片机]
应用笔记|STM32MP1 系列 <font color='red'>MPU</font> 的 DDR <font color='red'>配置</font>
通过stm32cubemax配置mpu6050通信兵读取数据,将数据串口打印
通过stm32cubemax完成配置,与mpu6050通信并读取数据,将数据通过串口打印出来 单片机源程序如下: /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include main.h #include i2c.h #include stm32f4xx_hal.h #include usart.h #include gpio.h #include stdio.h /* Private includes -----------------
[单片机]
使用STM32CubeIDE更轻松地从编写代码切换到配置实用程序
ST发布的STM32 Finder移动应用程序和STM32CubeIDE的新视频功能。因此,新版本为使用 STM32 微控制器或使用 STM32 微控制器的每个人创造了更全面的体验。STM32CubeMX还将继续获得改进,以优化开发人员的工作流程。由于几乎所有依赖 STM32 的项目都使用其中一种或多种工具,因此确保所有人都可以使用它们来解决产品开发和项目管理固有的挑战至关重要,无论他们的角色和经验如何。今天的更新还提供了即将发生的事情的味道。 STM32CubeIDE 的显着特点之一是它集成了 STM32CubeMX。开发人员可以在配置管脚和时钟树后选择他们的开发板或微控制器并启动项目。因此,开发人员可以更轻松地从编写代码切
[单片机]
TMC4671驱动步进电机之tmc4671配置代码与TMC4671模拟编码器设置
ADI TMC4671是一款完全集成的伺服控制器,可为BLDC/PMSM和两相步进电机以及直流电机和音圈提供磁场定向控制(FOC)。所有控制功能都在硬件中实现。TMC4671可以为直流无刷电机、永磁同步电机、2相步进电机、直流有刷电机和音圈电机提供磁场定向控制。 此外TMC4671还集成 ADC、位置传感器接口、位置插值器,为广泛的伺服应用提供功能齐全的伺服控制器。 TMC4671硬件集成的电机控制算法及三环控制算法使得开发电机不需要编写一行代码即可完成。 而且TMC4671具有高达100kHz的开关频率和控制器更新速率,并具有滤波和插值功能,如数字霍尔信号插值,以实现更顺畅的操作。该集成电路可以与各类编码器协同工作:
[嵌入式]
TMC4671驱动步进电机之tmc4671<font color='red'>配置</font><font color='red'>代码</font>与TMC4671模拟编码器设置
机智云代码工程移植/采集数据上发/控制数据下拉/配置入网
前言 本项目主要通过使用STM32F103C8T6作为主控MCU,ESP8266作为数据透传模块,接入机智云AIoT云平台,通过在线智能产品,实现了远程联网、温湿度监测、APP控制等功能。 上文介绍了“创建云端产品,烧录Gagent”,“DHT11驱动的编写”。本文主要介绍,机智云代码工程移植、采集数据上发、控制数据下拉、配置入网。 机智云代码工程移植 前面我们有说到,在机智云平台创建产品完成后,生成了一个 MCU 的工程,这个工程是 CubeMX 所创建的,为了保持一致性,我们选择使用 HAL 库进行开发。 1、创建一个新的 CubeMX 工程。 芯片选型为:STM32F103RCTx 2、配置相关外设 2.1
[单片机]
机智云<font color='red'>代码</font>工程移植/采集数据上发/控制数据下拉/<font color='red'>配置</font>入网
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved