STM32H7-MPU的理解和配置
STM32H7-MPU
⼀、MPU的作⽤
防⽌不受信⽤的应⽤程序访问受保护的内存区域
防⽌⽤户应⽤程序破坏操作系统使⽤的数据
通过阻⽌任务访问其他任务的数据区
允许将内存区域定义为只读,以便保护重要数据。
检测意外的内存访问
简单来说,就是内存保护、外设保护和代码访问保护。
⼆、MPU的功能实现
MPU可以配置保护16个内存区域,每个区域都是独⽴配置的。每个区域的最⼩要求是32字节,同时每个区域还可以配置为8个⼦区域,通过寄存器对应的bit来使能。
MPU可配置的16个内存区的序号范围是0-15,还有⼀个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最⾼、背景区的优先级最低。例如下图,共有七个内存区:⼀个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执⾏;内存区5被完全包含在内存区3⾥⾯,则这部分内存区的配置按照内存区5的配置规则进⾏。
三、MPU常⽤的寄存器(RASR寄存器和控制寄存器)
XN位:表⽰是否使能指令的提取
XN=0:使能指令提取,即这块内存可以执⾏程序代码
XN=1:禁⽌指令提取,机这块内存禁⽌执⾏程序代码
AP位:设置指定区域的访问权限类型
TEX、C、B、S位:⽤于配置Cache的策略
C位:⽤于使能或者禁⽌Cache
B位:⽤于配合C位实现Cache下是否使⽤缓冲
S位:⽤于解决多总线或者多核访问的共享问题
read/write-through/back/allocate的区别:
⼀、CPU读Cache
1. Read through:直接从内存区读取数据
2. Read allocate:先把数据读取到Cache中,再从Cache中读取数据
⼆、CPU写Cache
若hit命中,有两种处理⽅式:
1. Write-through:在数据更新时,把数据同时写⼊Cache和存储区
1. 操作简单,但是写⼊速度慢
2. Write-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。
1. 写⼊速度快,但是⼀旦更新后的数据未被写⼊时出现断电,则数据⽆法回
若miss,有两种处理⽅式:
1. Write allocate:先把要写的数据载⼊到Cache中,写Cache,然后再通过flush的⽅式写⼊到内存中。
2. No-write allocate:并不将写⼊位置读⼊缓存,直接把要写的数据写⼊到内存中。
什么叫hit/miss:
⼀、读操作
如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache⾥⾯没有怎么办,这就是所谓的读Cache Miss。
⼆、写操作
如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache⾥⾯没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。
SRD位:⽤于控制内存区的⼦区域,⼀共有8bit,⼀个bit控制⼀个⼦区域,⼀般都开启
SIZE位:配置保护的内存的⼤⼩
四、MPU的HAL库配置函数
HAL_MPU_Disable:配置前要禁⽌MPU
HAL_MPU_Enable:使能
⼀般使⽤参数MPU_PRIVILEGED_DEFAULT
HAL_MPU_ConfigRegion:配置MPU
static void MPU_Config(void)
{
MPU_Region_InitTypeDef MPU_InitStruct;
/* 禁⽌ MPU */
HAL_MPU_Disable();
/* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate Write allocate */
//使能MPU
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
//指定MPU保护的内存起始地址,注意要和下⾯的⼤⼩进⾏对齐
MPU_InitStruct.BaseAddress =0x24000000;
//配置保护的内存⼤⼩
MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
/
/配置区域访问权限类型
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
//在开启Cache下是否使⽤缓冲
MPU_InitSt ruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
//是否开启Cache
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
//是否开启共享
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
//配置缓存的策略
MPU_InitStruct.TypeExtField = M PU_TEX_LEVEL1;
/
/是否开启⼦区域
MPU_InitStruct.SubRegionDisable =0x00;
//指定指令访问状态
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct);
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}cacheable

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。