STM32H7系列MPU与CACHE以及RAM

一、启用cache

启用cache很简单,就是这两句,分别打开I-Cache和D-Cache,但是如果只使用这两句,再操作DMA和FLASH时就很有可能遇到问题,后面会具体说明。

    SCB_EnableICache();//使能I-CacheSCB_EnableDCache();//使能D-Cache

二、使用MPU

这里是一个RAM的MPU保护配置。

    /* Disables the MPU */HAL_MPU_Disable();/** Initializes and configures the Region and the memory to be protected*/MPU_InitStruct.Enable = MPU_REGION_ENABLE;MPU_InitStruct.Number = MPU_REGION_NUMBER0;MPU_InitStruct.BaseAddress = D1_AXISRAM_BASE;MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;MPU_InitStruct.SubRegionDisable = 0x0;MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;HAL_MPU_ConfigRegion(&MPU_InitStruct);/* Enables the MPU */HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

首先是配置MPU时需要先关闭MPU,HAL_MPU_Disable();启用HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);其中的参数是MPU的控制策略

//默认区域(default region)不允许访问,并且在硬故障,NMI和FAULTMASK处理程序期间禁用MPU
#define  MPU_HFNMI_PRIVDEF_NONE      ((uint32_t)0x00000000)    
//默认区域(default region)不允许访问,并且在硬故障,NMI和FAULTMASK处理程序期间启用MPU
#define  MPU_HARDFAULT_NMI           ((uint32_t)0x00000002)
//默认区域(default region)仅允许特权访问,并且在硬故障,NMI和FAULTMASK处理程序期间禁用MPU
#define  MPU_PRIVILEGED_DEFAULT      ((uint32_t)0x00000004)
//默认区域(default region)仅允许特权访问,并且在硬故障,NMI和FAULTMASK处理程序期间启用MPU
#define  MPU_HFNMI_PRIVDEF           ((uint32_t)0x00000006)

第一个配置参数MPU_InitStruct.Enable,可以赋值是为MPU_REGION_ENABLE、MPU_REGION_DISABLE,分别代表这个区域的MPU是否启用。

第二个配置参数MPU_InitStruct.Number,可以赋值MPU_REGION_NUMBER0、MPU_REGION_NUMBER1、MPU_REGION_NUMBER2...一共是8个,代表所配置保护内存区域的编号。

第三个配置参数MPU_InitStruct.BaseAddress,可以赋值的就是各个内存块的首地址,这里的D1_AXISRAM_BASE是0x24000000,是一个512K的RAM。

第四个配置参数MPU_InitStruct.Size,就是所保护内存的大小,MPU_REGION_SIZE_512KB就是要保护区域的大小,还有其他大小可选,具体可以看宏定义中所定义的大小。

第五个配置参数MPU_InitStruct.SubRegionDisable,是配置子区域,每个MPU配置的内存区域都被分为了8个子区域,数值从0~255,每一个bit对应着一个子区域的禁用(1)或者启用(0)。最高位(控制最后一个子区域,最低位控制第一个子区域,最后注意的是大于128字节才可以使用子区域。

第六个配置参数MPU_InitStruct.AccessPermission是配置RAM的读写权限。

/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes* @{*/
#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)    //特权和用户模式下都只读

第七个配置参数MPU_InitStruct.DisableExec,表示代码是否在RAM中可执行,MPU_INSTRUCTION_ACCESS_ENABLE代表可执行。

最后的4个参数需要一起看,

MPU_InitStruct.TypeExtField;MPU_InitStruct.IsShareable;MPU_InitStruct.IsCacheable;MPU_InitStruct.IsBufferable

TypeExtField

IsCacheableIsBufferableIsShareablecache功能
MPU_TEX_LEVEL010xWrite through, no write allocate
MPU_TEX_LEVEL011xWrite back, no write allocate
MPU_TEX_LEVEL100xNon-cacheable
MPU_TEX_LEVEL111xWrite back, write and read allocate

1.Write through, no write allocate(透写)

(1)写入策略:如果cache命中,则同时向cache和对应的内存区域中写入;如果未命中,则只写入对应的内存区域,不开辟新的cache。
(2)读取策略:如果cache命中,则直接从cache中读取,不再读取对应的内存区域,如果cache未命中,则开辟对应的cache区域,并从对应的内存区域中将数据同步至cache,并读取cache。

2.Write back, write and read allocate

(1)写入策略:如果cache命中,则只写入cache,不再写入到对应的内存区域;如果未命中,则开辟对应的cache,并同时向cache和对应的内存区域写入。
(2)读取策略:如果cache命中,则直接从cache中读取,不再读取对应的内存区域,如果cache未命中,则开辟对应的cache区域,并从对应的内存区域中将数据同步至cache,并读取cache。

3.Write back, no write allocate

(1)写入策略:如果cache命中,则只写入cache,不再写入到对应的内存区域;如果未命中,则只写入对应的内存区域,不开辟新的cache。
(2)读取策略:如果cache命中,则直接从cache中读取,不再读取对应的内存区域,如果cache未命中,则开辟对应的cache区域,并从对应的内存区域中将数据同步至cache,并读取cache。

通过上面介绍的特性,可以看到,使用的时候最好使用Write through, no write allocate这种模式,因为cache命中,则同时向cache和对应的内存区域中写入,不用担心数据的不统一。H7系列使用cache代码的执行速度提高两倍以上,当然这个两倍只是我大概试了一下。

三、RAM

1.TCM区

速度地址总线大小
ITCM400MHz0x0000 000064bit64KB
DTCM400MHz0x2000 000064bit128KB

2.AXI SRAM区

速度地址总线大小
AXI SRAM200MHz0x2400 000064bit512KB

3.SRAM1、SRAM2、SRAM3区

速度地址总线大小
SRAM1200MHz0x3000 000032bit128KB
SRAM2200MHz0x3002 000032bit128KB
SRAM3200MHz0x3004 000032bit32KB

4.SRAM4区

速度地址总线大小
SRAM4200MHz0x3800 000032bit64KB

5.Backup SRAM区

速度地址总线大小
Backup SRAM200MHz0x3880 000032bit4KB

结合这张图,可以看出ITCM、DTCM、AXI SRAM是不可以使用DMA的。

如果使用了可以使用DMA的SRAM,需要注意,如果开启了CACHE,记得要配置MPU,否则DMA数据很有可能是不更新的。再操作flash的时候,也要注意清除D-CACHE,否则写入会有问题。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android studio “Layout Inspector“工具在Android14 userdebug设备无法正常使用

背景描述 做rom开发的都知道,“Layout Inspector”和“Attach Debugger to Android Process”是studio里很好用的工具,可以用来查看布局、调试系统进程(比如setting、launcher、systemui)。 问题描述 最进刚开始一个Android 14…

现代数据架构-湖仓一体

当前的数据架构已经从数据库、数据仓库,发展到了数据湖、湖仓一体架构,本篇文章从头梳理了一下数据行业发展的脉络。 上世纪,最早出现了关系型数据库,也就是DBMS,有商业的Oracle、 IBM的DB2、Sybase、Informix、 微软…

【数据结构初阶】六、线性表中的队列(链式结构实现队列)

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【数据结构初阶】五、线性表中的栈(顺序表实现栈)_高高的胖子的博客-CSDN博客 1 . 队列(Queue) 队列的概念和结构: 队列…

PSINS工具箱学习(一)下载安装初始化、SINS-GPS组合导航仿真、习惯约定与常用变量符号、数据导入转换、绘图显示

原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、前言二、相关资源三、下载安装初始化1、下载PSINSyymmdd.rar工具箱文件2、解压文件3、初始化4、启动工具箱导览 四、习惯约定与常用变量符号1…

数据集笔记:2015上海地铁一卡通数据

数据地址:上海地铁数据_免费高速下载|百度网盘-分享无限制 (baidu.com) 数据介绍 上海2015年几天的地铁一卡通出入站信息 卡号、交易日期、交易时间、公交线路/地铁站点中文名称、行业名称(公交、地铁、出租、轮渡、PR停车场)、交易金额、交易性质(非优惠、优惠、…

No139.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

RNN模型与NLP应用(1/9):数据处理基础Data Processing Basics

文章目录 处理分类特征把分类特征转化为数值特征应用one-hot编码indice要从1开始而不能从0开始数据处理为什么使用one-hot向量 处理文本数据Step1:将文本分割成单词Step2:计算单词的频度按频度递减的方式排序 Step3:One-Hot编码 处理分类特征…

UE5 ChaosVehicles载具研究

一、基本组成 载具Actor类名称:WheeledVehiclePawn Actor最原始的结构 官方增加了两个摇臂相机,可以像驾驶游戏那样切换多机位、旋转观察 选择骨骼网格体、动画蓝图类、开启物理模拟 二、SportsCar_Pawn 角阻尼:物体旋转的阻力。数值越大…

前端架构师之02_ES6_高级

1 类和继承 1.1 class类 JavaScript 语言中,生成实例对象的传统方法是通过构造函数。 // ES5 创建对象 // 创建一个类,用户名 密码 function User(name,pass){// 添加属性this.name name;this.pass pass; } // 用 原型 添加方法 User.prototype.sho…

Docker下如何构建包含延迟插件的RabbitMQ镜像

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

FIPS 140简介

FIPS 140(Federal Information Processing Standards Publication 140)是美国联邦政府颁布的一系列密码学标准,用于评估和验证安全模块(如加密模块)的安全性。FIPS 140标准制定了一系列安全要求,以确保加密模块能够提供足够的安全性,以保护敏感数据。 与AES的关系是,A…

UE5 虚幻引擎 如何使用构造脚本(Construction Script)? 构造脚本的奥秘!

目录 1 构造脚本(Construction Script)1.1 介绍1.2 案例1:利用样条组件程序化生成树木1.2 案例2:利用样条组件和样条网格体组件程序化生成道路 1 构造脚本(Construction Script) 1.1 介绍 问题&#xff1a…

3D孪生场景搭建:模型阵列摆放

阵列摆放概念 阵列摆放是指将物体、设备或元件按照一定的规则和间距排列组合的方式。在工程和科学领域中,阵列式摆放常常用于优化空间利用、提高效率或增强性能。 阵列摆放通常需要考虑间距、角度、方向、对称性等因素,以满足特定的要求和设计目标。不同…

江西广电会展集团总经理李悦一行莅临拓世科技集团调研参观,科技璀璨AIGC掀新潮

在江西这片充满活力的土地上,数字经济如潮水般涌动,会展文化与科技的完美结合,正如新时代的璀璨繁星照亮夜空,更预示着一场AIGC创新的壮丽篇章即将展开。作为拓世科技集团的老朋友,江西广电多位领导多次莅临拓世科技集…

Elasticsearch:与多个 PDF 聊天 | LangChain Python 应用教程(免费 LLMs 和嵌入)

在本博客中,你将学习创建一个 LangChain 应用程序,以使用 ChatGPT API 和 Huggingface 语言模型与多个 PDF 文件聊天。 如上所示,我们在最最左边摄入 PDF 文件,并它们连成一起,并分为不同的 chunks。我们可以通过使用 …

项目集成七牛云存储sdk

以PHP为例 第一步:下载sdk PHP SDK_SDK 下载_对象存储 - 七牛开发者中心 sdk下载成功之后,将sdk放入项目中,目录选择以自己项目实际情况而定。 注意:在examples目录中有各种上传文件的参考示例,这里我们主要参考的是…

如何注册一个 DA 为 10 的高价值老域名

众所周知,由于域名存在唯一性,随着人们注册的越多,好域名也变得越来越少,渐渐成为稀缺的网络资源。这个时候要想拥有好的域名,抢注优质老域名就成了广大米友的路径之一。 优质的高价值域名都有一个特点,那…

MySQL数据库入门到精通1--基础篇(MySQL概述,SQL)

1. MySQL概述 1.1 数据库相关概念 目前主流的关系型数据库管理系统: Oracle:大型的收费数据库,Oracle公司产品,价格昂贵。 MySQL:开源免费的中小型数据库,后来Sun公司收购了MySQL,而Oracle又收…

如何快速学习AdsPower RPA(2)——中级、高级部分

Tool哥继续给大家分享快速学习AdsPower RPA的方法。上一篇在这里,还没看过的小伙伴赶快补课去:如何快速学习AdsPower RPA(1)——简单、进阶部分 能进入到中级、高级阶段的学习,说明你自学能力超强!只要跟着…

创建型设计模式——工厂模式

摘要 本博文主要介绍软件设计模式中工厂模式,其中工厂设计模式的扩展为简单工厂(Simple Factory)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)三种。 一、简单工厂(Simple Factory) 主要分析设计模式 - 简单工厂(Simple Factory),它把实例…