应用笔记 | MPU 子区话题

发布者:快乐飞翔最新更新时间:2024-02-19 来源: elecfans关键字:MPU  STM32 手机看文章 扫描二维码
随时随地手机看文章

1. 问题起因

有人询问STM32F7 和STM32H7 系列库例程中有关MPU 配置中的下面这句加绿色下划线的代码的意思是什么?有何用?


d85e3af0-2ace-11ee-a368-dac502259ad0.png

图1、芯片存储空间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 寄存器的描述截图:



dab35e70-2ace-11ee-a368-dac502259ad0.png

图2、MPU_RASR寄存器


不妨举例说一下。假设我们选择了某64MB区域进行MPU设置,属性配置如下:


daf455ba-2ace-11ee-a368-dac502259ad0.png

图3、某特定内存MPU配置代码


基于上面配置,该64MB空间配置为不共享、可缓存、可执行程序的MPU存储属性【细节可以核对下图4,其中C表示Cacheable,B表示Bufferable,S表示Shareable】



db959592-2ace-11ee-a368-dac502259ad0.png

图4、MPU配置属性对应表


这里有针对个别子区做了MPU属性排除操作,就是靠下面这句代码实现的:MPU_InitStruct.SubRegionDisable = 0x28;//即二进制00101000


前面说过了,我们可以将大于256B的存储区等分为8个子区并做MPU属性排除配置。这里的0x28对应的8位2进制数表示各个子区针对当前MPU配置是否被排除在外的情况,若某位为0时表示相应子区适用当前MPU配置属性,为1则不适用当前MPU的配置。


结合前面寄存器描述和上面配置代码,被排除在外的即不适用当前MPU配置的子区就是下图5中的两个地址空间【标红色1的地方】:


dbc1f862-2ace-11ee-a368-dac502259ad0.png

图5、某特定内存MPU子区配置布局


若把上面图形左转90°即可看明白刚才那个SRD字段的配置值0x28的由来以及地址空间对应关系,SRD的高位对应高地址子区。基于上面配置,有2个8MB空间是不适用当前的MPU配置,即被排除在外了。


我们不妨再看看另一个关于MPU子区的示例【来自ARM M7内核技术手册】。


dbdea714-2ace-11ee-a368-dac502259ad0.png

图6、带内存重叠的MPU配置


根据上面信息我们可以得知,MPU配置了2个存储区【Region】,其中Region1的地址空间与Region2部分地址空间是重叠的。在Region2中使用到子区【subregion】,其中与Region1重叠的两个子区做了MPU排除处理,即Region2中头2个子区的MPU属性不适用于Region2的MPU配置,这2个子区的MPU属性取决于Region1的配置。换言之,Region2的配置对头2个子区的MPU属性沿用了Region1的。


对MPU的区[Region]及子区[Subregion]介绍得差不多了,我们继续回到最开始那个问题。整个空间4GB被等分为8个子区,每个子区500MB。现在子区【Subregion】的MPU设置是这样的:

MPU_InitStruct.SubRegionDisable = 0x87;//10000111B


即有4个子区做了MPU属性排除处理【上面红色1注释标示的】,其它4个子区【绿色0标示出来的】适用Strongly ordered 存储属性。我们可以结合手册具体看看各个子区的分布情况。


dc510ca0-2ace-11ee-a368-dac502259ad0.png

图7、4G空间的MPU子区划分图


上图中红色区域并不适用当前配置的Strongly ordered 存储属性,只有其它绿色区域适用,他们集中在外部设备存储区。看到这里,有人或许发现这个MPU配置只是个粗线条的配置,重点对外部存储区域做了大致的初始背景配置,即配置为Strongly Ordered属性。


在实际应用中,开发者往往会根据实际情况针对外部存储器做进一步的MPU配置。当我们阅读STM32F7或 STM32H7系例相关应用代码时,我们会发现,除了看到开篇提到的的针对整个4G空间的MPU初始配置外,还有诸多针对外部存储区的特定MPU配置,比方下面这些就有针对外部SDRAM、QSPI、FMC控制的存储设备的MPU配置。主要就Region编号、起始地址、空间大小、Cacheable、Bufferable、Shareable等属性进行配置。【下图中打红色三角形的是针对整个4GB空间的MPU初始配置,其它打勾的是针对特定存储空间的MPU配置,该区间的MPU属性与4GB空间中重合部分的初始配置不一致时以新配置为准。】


dc85aef6-2ace-11ee-a368-dac502259ad0.png

图8、STM32H7产品的MPU配置代码示例


显然,上面SDRAMQSPIFMC的存储区都落在图7中的绿色区域空间,因为此时的特定配置所用MPU区编号都要高于那个粗线条配置的区编号0。对于MPU配置而言,重叠区域的MPU配置以更大区编号的配置为准。以图8中64KB的SDRAM配置来看,此时从0xC0000000开始的64KB区域不再适用Strongly Ordered存储属性,而适用Cacheable 、Write Through存储属性。


或许有人会问,既然具体应用时我们会针对所用存储设备做更合适的MPU配置,为什么要事先基于整个4G空间做粗线条配置,对外部存储空间做Strongly Ordered属性的初始配置呢?那个粗线条的MPU初始配置岂不多余?


要解释这个问题,就涉及到另外一个话题,即Cortex M7内核的试探性访问【关于试探性访问,这里不做过多解读,有兴趣查看相关内核手册】。当内核处理器因发生试探性访问去访问一个不存在的存储设备时往往会导致访问死锁,显然这不是我们所希望的。


不过,试探性访问可以被阻止,即当相应存储空间配置为Device或Strongly Ordered属性时,是不会发生试探性访问的。


我们依然以上面提到的64KB的外部SDRAM来看,显然它往往并没有占据整个External Device空间,只是使用了有限的空间。如果说SDRAM所占区域以外的空间的属性不是Device或Strongly Ordered,若访问SDRAM时发生试探性访问跳到SDRAM实际容量以外的区域,此时因无实际存储设备就可能出现死锁之类的异常。为了防止这个问题发生,就有了上面的事先针对4G空间做了粗线条的MPU配置,并特地将整个外部存储设备所对应的空间都配置为Strongly Order属性。


结合下图看看,黄色区域为用户根据实际SDRAM容量更新过的MPU配置,绿色部分为事先配置的Strongly Order属性,以阻止处理器针对绿色区域进行试探性访问。


dcb0903a-2ace-11ee-a368-dac502259ad0.png

图9、粗线条初始配置结合用户更新的MPU配置


换句话说,事先针对整个4G空间做MPU配置,正是为了明确那些没有做特定MPU配置的外部存储空间的存储属性,Strongly ordered 属性配置恰好可以很好地防止M7处理器对并不存在实际存储设备的空间进行试探性访问而导致异常。这也就正好解释了开头提到的那句注释“将未定义区域配置为Strongly ordered属性”。


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



3. 问题小结


本篇内容主要涉及内核MPU配置方面的东西,重点针对客户的疑问做了些解答,对MPU配置中的子区概念做了较为详细的解读,以供参考。


关键字:MPU  STM32 引用地址:应用笔记 | MPU 子区话题

上一篇:应用笔记 | 关闭SPI会导致WRPERR错误的问题分析
下一篇:如何用外设复位修改只读寄存器

推荐阅读最新更新时间:2024-11-22 18:27

STM32 I2C配置
首先配置 I2C 1. 通过 APB 复位 I2C, 使能 I2C 时钟 2. 使能 GPIO 时钟, 配置 GPIO 在 AF OD 模式 3. 使能 I2C ( PE= 1 ) 4. 设置速度参数 FREQ CCR F/S DUTY TRISE A : CR2.FREQR = 期望的I2C时钟, 一般设置为最大的时钟 36 MHz 确定了 Tck = 1 / FREQ -- 类似于 CANBus 的时间片 Tq B : PE= 0 , 设置适当的 CCR F/S DUTY 以及 TRISE, PE= 1 标准模式 Tlow : Thigh = 1 : 1 快速模式 Tlow : Thigh = 2 : 1 ( D
[单片机]
STM32单片机IO中断实现步骤
STM32推出了全新的HAL驱动源码,本文给出GPIO中断代码实现的步骤: 步骤1)类似下方初始化用GPIO_InitStruct结构体初始化需要的GPIO,注意Mode参数和NVIC的中断使能: GPIO_InitTypeDef GPIO_InitStruct; /* Configure GPIO pins : PB6 */ __GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_6;// GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // interrupt mode , rising GPIO_Ini
[单片机]
stm32入门之通用定时器(TIM2~TIM5)
在stm32的开发中我们经常会用到定时器,因此在学习stm32的过程中定时器是必须要学的,而定时主要又分为三大类分别为: 高级控制定时器(TIM1与TIM8) 通用定时器(TIM2~TIM5) 基本定时器(TIM6与TIM7) 今天我只要想给大家介绍的是第二种通用定时器(TIM2~TIM5),还是老样子我先以文字给大家简单概述,在通过视频详细为大家分析细节。 精通定时间的老油条勿喷!!! 首先我们先来了解一下TIM2~TIM5定时器基本功能 (1)16位向上、向下、向上/向下自动装载计数器 (2)16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 (3)4个独立通道: ─ 输入捕获 ─ 输
[单片机]
<font color='red'>stm32</font>入门之通用定时器(TIM2~TIM5)
STM32开发系列之寄存器(一)按键控制LED灯
入门学习STM32开发,首先要选择一种开发方式。STM32的开发方式主要有标准库开发、寄存器开发和HAL库开发(这个我没使用过,不太了解)。比较多的人选择的开发方式是库开发,使用这两种方式比较方便,但因经过函数封装,对底层的理解不足。由于我入门也是由标准库开发入门的,所以这里想专门写一下寄存器开发,边写边学习,欢迎一起探讨。 1、一般写法 注:采用的STM32F103ZET6芯片 ST官方提供了stm32f10x.h的头文件,里面有各个寄存器的地址定义,因此可以直接操作寄存器来对IO口进行配置,下面就以案件控制LED灯为例。 在stm32f10x.h头文件里有以下的IO口的宏定义及结构体 ①假设LED灯接在GPIOB5
[单片机]
<font color='red'>STM32</font>开发系列之寄存器(一)按键控制LED灯
STM32 抗锯齿中文显示另类方案分享
最近在玩车载液晶仪表,之前用Arduino+USART液晶,后来发现Arduino性能不够,就转向STM32。由于需要在液晶屏上显示手机信息,先是采用了普通点阵字库方案,个人感觉效果惨不忍睹,满屏的锯齿。翻遍网络,没发现比较合适的方案。 需要说明的是,我用的STM32板很简单:STM32+FSMC+TFT5寸屏+SDIO,没有扩展SDRAM,但是有个好处,可以用大容量TF卡,这也是这个方案可以实现的主要因素。啰嗦了一大堆,先上图: 字体看起来非常舒服,没有难看的锯齿。 方案其实也比较土: 1、在PC上写个字库提取工具,和其他工具不一样,这个工具提取的字模包含了抗锯齿信息(其实就是灰度信息),每个像素需要1个字节来存储,32*
[单片机]
<font color='red'>STM32</font> 抗锯齿中文显示另类方案分享
STM32串口使用偶校验时初始化
/* USART 1 配置 如果需要使用奇数校验或者偶数校验,需要把数据长度定位9bit */ USART_InitStructure.USART_BaudRate = COM1BAUD; USART_InitStructure.USART_WordLength = USART_WordLength_9b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_Even; USART_InitStructure.USART_HardwareFlowContr
[单片机]
【话说定时器系列】之六:STM32定时器输入捕获话题
STM32定时器 是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍。去年,电堂推出了 《STM32 TIMER基础及常规应用介绍》 ,为大家梳理了 STM32 TIMER 的庞大内容,涵盖 TIMER 的基本应用原理、常规应用等。现在将课程内容整理为文章,针对STM32定时器有基本了解的用户,分享具体的应用实现环节及常见问题解决。 STM32定时器除了基本计数定时功能外,还对外拓展了输入、输出通道,从而实现输入捕捉、比较输出功能。 输入捕获【Input Capture】基本原理 : 定时器针对外部输入信号或内部触发信号实行边沿捕捉;产生捕捉事件,并可以触发中断或DMA请求,同时记录捕捉时刻计数器的值。基
[单片机]
基于Cortex-M3的STM32微控制器处理先进电机控制方法
变频器的问世和先进的电机控制方法让三相无刷电机(交流感应电机或永磁同步电机)曾经在调速应用领域取得巨大成功。这些高性能的电机驱动器过去主要用于工厂自动化系统和机器人。十年来,电子元器件的大幅降价使得这些电机驱动器能够进入对成本敏感的市场,例如:家电、空调或个人医疗设备。本文将探讨基于ARM的标准微控制器如何在一个被DSP和FPGA长期垄断的市场上打破复杂的控制模式,我们将以意法半导体的基于Cortex-M3 内核的STM32系列微控制器为例论述这个过程。 图 3 : STM32: 强固的增长基础 首先,我们回顾一下电机控制的基本原理。在电机控制系统内,为什么处理器非常重要?我们为什么需要非常好的计算性能?毕竟,
[单片机]
基于Cortex-M3的<font color='red'>STM32</font>微控制器处理先进电机控制方法
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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