打印
[STM32MP1]

STM32H7-MPU的理解和配置

[复制链接]
3171|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kxsi|  楼主 | 2021-8-10 10:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、MPU的作用
  • 防止不受信用的应用程序访问受保护的内存区域
  • 防止用户应用程序破坏操作系统使用的数据
  • 通过阻止任务访问其他任务的数据区
  • 允许将内存区域定义为只读,以便保护重要数据。
  • 检测意外的内存访问

简单来说,就是内存保护、外设保护和代码访问保护。


二、MPU的功能实现

​ MPU可以配置保护16个内存区域,每个区域都是立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。


​ MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。


使用特权

评论回复
沙发
kxsi|  楼主 | 2021-8-10 10:45 | 只看该作者
三、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

Read through:直接从内存区读取数据
Read allocate:先把数据读取到Cache中,再从Cache中读取数据
二、CPU写Cache

若hit命中,有两种处理方式:

Write-through:在数据更新时,把数据同时写入Cache和存储区
操作简单,但是写入速度慢
Write-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。
写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回
若miss,有两种处理方式:

Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。
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位:配置保护的内存的大小




使用特权

评论回复
板凳
kxsi|  楼主 | 2021-8-10 10:47 | 只看该作者
四、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);
}



使用特权

评论回复
地板
yiyigirl2014| | 2022-8-4 17:13 | 只看该作者
很详细

使用特权

评论回复
5
Uriah| | 2022-10-1 14:22 | 只看该作者

我们从以前就有了 DefineGender 方法,要求提供的输入值必须始终为 0 或 1。

使用特权

评论回复
6
Bblythe| | 2022-10-1 17:21 | 只看该作者

需要加上一定的工作电压

使用特权

评论回复
7
Wordsworth| | 2023-1-20 07:21 | 只看该作者

让该端口输出高电平的语句

使用特权

评论回复
8
公羊子丹| | 2023-1-20 08:24 | 只看该作者

你懂其原理才能让你在行业中走的更远

使用特权

评论回复
9
公羊子丹| | 2023-1-20 09:17 | 只看该作者

只有一块PCB,其上有一个12MHz的晶体

使用特权

评论回复
10
Wordsworth| | 2023-1-20 10:20 | 只看该作者

GPIO口被复用为AD输入脚做相关AD检测

使用特权

评论回复
11
Uriah| | 2023-1-20 11:23 | 只看该作者

脚本猛于老虎

使用特权

评论回复
12
万图| | 2023-1-20 13:19 | 只看该作者

核心模块被封装成了一个函数

使用特权

评论回复
13
Uriah| | 2023-1-20 14:22 | 只看该作者

Git 是程序员学习和工作都离不开发工具

使用特权

评论回复
14
帛灿灿| | 2023-1-20 16:18 | 只看该作者

时钟信号推动单片机内各个部分执行相应的指令

使用特权

评论回复
15
Bblythe| | 2023-1-20 17:21 | 只看该作者

If-Else 通常是一个糟糕的选择

使用特权

评论回复
16
童雨竹| | 2023-1-20 19:17 | 只看该作者

A直接通过B声明的函数调用即可

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

3309

帖子

2

粉丝