STM32H7的MPU学习和应用示例

news2024/9/22 23:21:32

STM32H7的MPU学习记录

  • 什么是MPU?
    • MPU的三种内存类型
    • 内存映射
    • MPU保护区域以及优先级
  • MPU的寄存器
    • XN位
    • AP位
    • TEX、C、B、S位
    • SRD 位
    • SIZE 位
    • CTRL 寄存器的各个位
  • 示例
  • 总结

什么是MPU?

MPU(Memory Protection Unit,内存保护单元),早在 STM32F1 和 F4 芯片上面也是有这个功能的,但是基本用不上。但是到了 H7 就得用上了,因为要设置 Cache。
MPU 可以将 memory map 内存映射区分为多个具有一定访问规则的区域,通过这些规则可以实现
如下功能:
◆ 防止不受信任的应用程序访问受保护的内存区域。
◆ 防止用户应用程序破坏操作系统使用的数据。
◆ 通过阻止任务访问其它任务的数据区。
◆ 允许将内存区域定义为只读,以便保护重要数据。
◆ 检测意外的内存访问。
简单的说就是内存保护、外设保护和代码访问保护。

MPU的三种内存类型

MPU 可以配置的三种内存类型如下:
Normal memory
CPU 以最高效的方式加载和存储字节、半字和字,对于这种内存区,CPU 的加载或存储不一定要按照程序列出的顺序执行。
Device memory
对于这种类型的内存区,加载和存储要严格按照次序进行,这样是为了确保寄存器按照正确顺序设置。
Strongly ordered memory
程序完全按照代码顺序执行,CPU 需要等待当前的加载/存储指令执行完毕后才执行下一条指令。这样会导致性能下降。

内存映射

内存映射就是 32 位的 CM7 内核整体可以寻址的 0 到 2^32 -1 共计 4GB 的寻址空间。通过这些地址可以访问 RAM、Flash、外设等。下面是内存映射的轮廓图,IC 厂家使用时,再做细分,添加相应的硬件功能。
在这里插入图片描述

MPU保护区域以及优先级

MPU 可以配置保护 16 个内存区域(这 16 个内存域是独立配置的),每个区域最小要求 256 字节,每个区域还可以配置为 8 个子区域。由于子区域一般都相同大小,这样每个子区域的大小就是 32 字节,正好跟 Cache 的 Cache Line 大小一样。
MPU 可以配置的 16 个内存区的序号范围是 0 到 15,还有默认区 default region,也叫作背景区,序号-1。由于这些内存区可以嵌套和重叠,所以这些区域在嵌套或者重叠的时候有个优先级的问题。序号15 的优先级最高,以此递减,序号-1,即背景区的优先级最低。这些优先级是固定的
下面通过一个具体的实例帮助大家理解。如下所示共有 7 个区,背景区和序号 0-5 的区。内存区 4 跟内存区 0 和 1 有重叠部分,那么重叠部分将按照内存区 4 的配置规则执行;内存区 5 被完全包含在内存区3 里面,那么这部分内存区将按照内存区 5 的配置规则执行。
在这里插入图片描述

MPU的寄存器

这里重点讲解寄存器MPU_RASR 和控制寄存器,此寄存器的定义如下:
在这里插入图片描述

XN位

XN=0 表示使能指令提取,即这块内存区可以执行程序代码,XN=1 表示禁止指令提取,即这块内存
区禁止执行程序代码。
对应的 HAL 库 MPU 参数如下:

#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00)
#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01)

AP位

AP 的具体定义如下:
在这里插入图片描述

#define MPU_REGION_NO_ACCESS ((uint8_t)0x00)
#define MPU_REGION_PRIV_RW ((uint8_t)0x01)
#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02)
#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03)
#define MPU_REGION_PRIV_RO ((uint8_t)0x05)
#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06)

TEX、C、B、S位

TEX,C,B 和 S 的定义如下,这仅关注 TEX = 0b000 和 0b001,其它的 TEX 配置基本用不到。
在这里插入图片描述
TEX 用于配置 Cache 策略,支持如下四种情况,需要配合 C 和 B 位的配置才能实现。
在这里插入图片描述
TEX 对应的 HAL 库 MPU 参数给了三个,实际应用中仅用到前两个 MPU_TEX_LEVEL0 和MPU_TEX_LEVEL1

#define MPU_TEX_LEVEL0 ((uint8_t)0x00)
#define MPU_TEX_LEVEL1 ((uint8_t)0x01)
#define MPU_TEX_LEVEL2 ((uint8_t)0x02)

C 位对应的 HAL 库 MPU 参数如下,用于使能或者禁止 Cache。

#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01)
#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00)

B 位对应的 HAL 库 MPU 参数如下,用于配合 C 位实现 Cache 模式下是否使用缓冲。

#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01)
#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00)

S 位对应的 HAL 库 MPU 参数如下,用于解决多总线或者多核访问的共享问题。

#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01)
#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00)

SRD 位

这个位用于控制内存区的子区域,使用的是 bit[15:8],共计 8 个 bit,一个 bit 控制一个子区域,0
表示使能此子区域,1 表示禁止此子区域。
一般情况,基本不使用子区域的禁止功能,所以配置 HAL 库的 SubRegionDisable 参数时,直接取
值 0x00 即可,表示 8 个子区域均使能。

SIZE 位

SIZE 位使用的是 bit[5:1],共计 5 个 bit,可以表示 2^5 = 32 种大小。 对应的 HAL 库给出了可以配置的 28 个参数。

#define MPU_REGION_SIZE_32B ((uint8_t)0x04)
#define MPU_REGION_SIZE_64B ((uint8_t)0x05)
#define MPU_REGION_SIZE_128B ((uint8_t)0x06)
#define MPU_REGION_SIZE_256B ((uint8_t)0x07)
#define MPU_REGION_SIZE_512B ((uint8_t)0x08)
#define MPU_REGION_SIZE_1KB ((uint8_t)0x09)
#define MPU_REGION_SIZE_2KB ((uint8_t)0x0A)
#define MPU_REGION_SIZE_4KB ((uint8_t)0x0B)
#define MPU_REGION_SIZE_8KB ((uint8_t)0x0C)
#define MPU_REGION_SIZE_16KB ((uint8_t)0x0D)
#define MPU_REGION_SIZE_32KB ((uint8_t)0x0E)
#define MPU_REGION_SIZE_64KB ((uint8_t)0x0F)
#define MPU_REGION_SIZE_128KB ((uint8_t)0x10)
#define MPU_REGION_SIZE_256KB ((uint8_t)0x11)
#define MPU_REGION_SIZE_512KB ((uint8_t)0x12)
#define MPU_REGION_SIZE_1MB ((uint8_t)0x13)
#define MPU_REGION_SIZE_2MB ((uint8_t)0x14)
#define MPU_REGION_SIZE_4MB ((uint8_t)0x15)
#define MPU_REGION_SIZE_8MB ((uint8_t)0x16)
#define MPU_REGION_SIZE_16MB ((uint8_t)0x17)
#define MPU_REGION_SIZE_32MB ((uint8_t)0x18)
#define MPU_REGION_SIZE_64MB ((uint8_t)0x19)
#define MPU_REGION_SIZE_128MB ((uint8_t)0x1A)
#define MPU_REGION_SIZE_256MB ((uint8_t)0x1B)
#define MPU_REGION_SIZE_512MB ((uint8_t)0x1C)
#define MPU_REGION_SIZE_1GB ((uint8_t)0x1D)
#define MPU_REGION_SIZE_2GB ((uint8_t)0x1E)
#define MPU_REGION_SIZE_4GB ((uint8_t)0x1F)

CTRL 寄存器的各个位

在这里插入图片描述

示例

static void MPU_Config( void )
{
	MPU_Region_InitTypeDef MPU_InitStruct;
	/* 禁止 MPU */
	HAL_MPU_Disable();
	/* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate,Write allocate */
	MPU_InitStruct.Enable = MPU_REGION_ENABLE;
	MPU_InitStruct.BaseAddress = 0x24000000;
	MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
	MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
	MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
	MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
	MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
	MPU_InitStruct.Number = MPU_REGION_NUMBER0;
	MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
	MPU_InitStruct.SubRegionDisable = 0x00;
	MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
	HAL_MPU_ConfigRegion(&MPU_InitStruct);
	/* 配置 FMC 扩展 IO 的 MPU 属性为 Device 或者 Strongly Ordered */
	MPU_InitStruct.Enable = MPU_REGION_ENABLE;
	MPU_InitStruct.BaseAddress = 0x60000000;
	MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_64KB;
	MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
	MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
	MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
	MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
	MPU_InitStruct.Number = MPU_REGION_NUMBER1;
	MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
	MPU_InitStruct.SubRegionDisable = 0x00;
	MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
	HAL_MPU_ConfigRegion(&MPU_InitStruct);
	/*使能 MPU */
	HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

总结

本文章对MPU基本功能和寄存器进行了概述,并放入了一个示例,仅供个人学习用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1596595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker安装并跑通跑通QQ机器人实践(1)-前言及展示

随着大模型技术的迅猛发展,行业应用日益丰富且专业化。为了有效利用大模型的强大功能,建立与之紧密互动的应用接口至关重要。在此背景下,QQ、微信、钉钉等主流即时通讯工具凭借其广泛的用户覆盖和便捷的通信特性,成为连接用户与大…

动画渲染多少钱一秒?云渲染一分钟动画费用

动画渲染的费用因其复杂度和技术要求而异,云渲染服务则提供了一种高效的解决方案。一般而言,渲染一分钟动画的费用可能从几百到几千元不等,具体取决于使用的资源和渲染质量。下面来看看相关费用吧。 动画渲染多少钱一秒? 参考:…

更改android 安装的sdk版本

打开sdk manager 勾选show details 就可以选择了。

找不到msvcr120.dll要怎么解决?一键修复msvcr120.dll的详细解决方法

操作Windows系统的用户有时会遇到一个错误提示,显示“找不到msvcr120.dll”,通常被描述为“msvcr120.dll文件丢失”。解决这一问题其实有多种方式,且操作起来相对简单。以下是解决"msvcr120.dll丢失"问题的详细方法。 一.msvcr120…

每日一VUE——组件的生命周期

文章目录 VUE组件的生命周期生命周期钩子函数实例创建Teleport VUE组件的生命周期 组件生命周期 组件从创建到挂载、更新、到销毁的一系列过程被称为组件的生命周期。 生命周期函数 在组件的各个生命周期节点执行的函数,为生命周期钩子函数。 生命周期钩子函数…

最新版IntelliJ IDEA 2024.1安装和配置教程 详细图文解说版安装教程

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版 文章目录 IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版前言 第一步: IntelliJ IDEA 2024.1安装教程第 0 步&…

一款功能齐全的iOS混淆工具介绍及功能详解

机缘巧合偶遇iOS马甲包业务,前期也使用过目前市面上其他得工具,实际效果不太理想。经过大量实践,开发出一款功能齐全的混淆工具。工具的主要功能OC、C、Swift已封装成Mac应用,其他功能还在封装中,敬请期待。 马甲包的本…

网站添加PWA支持,仅需三步,无视框架的类型

总结起来,网站配置PWA简单步骤为: 编写 manifest.json;编写 serviceWorker.js;在 index.html 引入上述两个文件;把上述三个文件放在网站根目录(或者同一目录下);网站需要部署在https环境才能触发&#xff…

[C++][算法基础]求最小生成树(Kruskal)

给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。 求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible。 给定一张边带权的无向图 G(V,E),其中 V 表示图中点的集合,E 表示图…

JavaScript代码获取浏览器的可视高、文档滚动高和滚动距离

获取浏览器可视高度 var clientHeight 0; if (document.body.clientHeight && document.documentElement.clientHeight) {// 如果同时存在 document.body.clientHeight 和 document.documentElement.clientHeightclientHeight Math.min(document.body.clientHeight,…

【wu-framework-parent】官网介绍

官网地址 介绍 springboot 版本3.2.1 wu-framework-parent 是一款由Java语言开发的框架,目标不写代码但是却能完成功能。 框架涵盖无赖ORM( wu-framework-lazy-orm-spring-starter)、仿生组件 、easy框架系列【Easy-Excel、easy-listener、easy-upsert】 授权框架…

Postgresql源码(125)游标恢复执行的原理分析

问题 为什么每次fetch游标能从上一次的位置继续?后面用一个简单用例分析原理。 【速查】 恢复扫描需要知道当前页面、上一次扫描到的偏移位置、当前页面一共有几条: 当前页面:HeapScanDesc结构中记录了扫到的页面(scan->rs_cb…

如何安装Windows版VRTE2.1.0开发环境并进行开发

前言&#xff08;Abstract&#xff09; 本文档记录了如何安装Windows版VRTE2.1.0开发环境并进行开发&#xff0c;并且总结了当部署在安装了比较陈旧版本Linux内核&#xff08;如<4.5&#xff09;和库的板子上所遭遇的困难&#xff0c;如S32V234EVB。 Definitions and Abbre…

自动化测试selenium(2)

目录 WebDriver介绍 WebDriver使用 使用WebDriver驱动操作浏览器(打开一个百度) WebDriver 相关API 定位元素 操作元素 上一篇主要介绍了自动化测试的概念以及selenium的基本原理, 这里我们来讲一下如何利用selenium来写测试用的脚本. WebDriver介绍 Selenium是一个用于…

Zookeeper(从入门到掌握)看完这一篇就够了

文章目录 一、初识 Zookeeper1.Zookeeper 概念2.Zookeeper 数据模型3.Zookeeper 服务端常用命令4.Zookeeper 客户端常用命令 二、ZooKeeper JavaAPI 操作1.Curator 介绍1.Curator API 常用操作&#xff08;1&#xff09;建立连接&#xff08;2&#xff09;添加节点&#xff08;…

对链表的进一步认识

********以下内容均是个人理解&#xff0c;个人语言&#xff0c;仅代表个人观点&#xff0c;希望能对你有所帮助*************** 1.对链表的进一步深入理解分析 &#xff08;1&#xff09;逻辑结构&#xff1a;想象出来的&#xff0c;并不是真实存在的&#xff0c;例如里面的…

idm线程越多越好吗 idm线程数多少合适

IDM&#xff08;Internet Download Manager&#xff09;是一款流行的下载管理软件&#xff0c;它支持多线程下载&#xff0c;这意味着它可以同时建立多个连接来下载文件的不同部分&#xff0c;从而提高下载速度。我们在使用IDM的时候总是有很多疑问&#xff0c;今天我们学习IDM…

HIT The Wiorld,HIT世界官网地址+配置要求+测试时间+加速器分享

HIT The Wiorld&#xff0c;HIT世界官网地址配置要求测试时间加速器分享 NEXON新游《HIT&#xff1a;世界&#xff08;HIT&#xff1a;The World&#xff09;》将在4月17日上线&#xff0c;目前已在官网开启事前预约预创建角色。Hit :the world&#xff08;HIT:世界&#xff…

鸿蒙 Failed :entry:default@CompileResource...

Failed :entry:defaultCompileResource... media 文件夹下有文件夹或者图片名称包含中文字符 rawfile 文件夹下文件名称、图片名称不能包含中文字符

说说你对链表的理解?常见的操作有哪些?

一、是什么 链表&#xff08;Linked List&#xff09;是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的&#xff0c;由一系列结点&#xff08;链表中每一个元素称为结点&#xff09;组成 每个结点包括两个部分&…