STM32【H7】理论——MPU、Cache

这篇具有很好参考价值的文章主要介绍了STM32【H7】理论——MPU、Cache。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. MPU - 内存保护单元


  • MPU:(Memory Protection Unit,内存保护单元),是一种硬件机制,用于保护处理器访问内存时产生的错误或意外情况。

  • MPU的作用:MPU 可以使用一组规则来限制某些内存区域的读、写或执行权限。这些规则被称为“MPU区域”。MPU 可以将内存分成多个区域,并为每个区域分配访问权限。这些权限包括读、写、执行和访问级别等。通过使用MPU,可以实现对特定区域的访问限制,保护系统的重要数据和代码。

  • 内存映射:指将STM32H7芯片中的各种硬件资源,如存储器、外设和寄存器等,映射到特定的内存地址空间中,以便CPU可以通过读写内存的方式来访问这些硬件资源。在STM32H7中,所有的硬件资源都被映射到一段连续的内存地址空间中,这段地址空间称为内存映射区域;
    在STM32H7内32 位 CM7 内核整体可以寻址的 0 到 2^32 -1 共计 4GB 的寻址空间。通过这些地址可以访问 RAM、Flash、外设等。下图是内存映射的轮廓图,IC 厂家使用时,再做细分,添加相应的硬件功能:
    stm32h7,# STM32 H7,stm32,单片机,嵌入式硬件,cache


  • MPU 的功能实现:MPU 可以独立配置保护 16 个内存区域,每个区域最小要求 256 字节,每个区域还可以配置为 8 个子区域;由于子区域一般都大小相同,这样每个子区域的大小就是 32 字节(256/8=32),正好跟 Cache 的 Cache Line 大小一样;

  • 16个内存区的优先级:MPU 可以配置的 16 个内存区的序号范围是 0 到 15,还有默认区 default region,也叫作背景区,序号-1;由于这些内存区可以嵌套和重叠,所以这些区域在嵌套或者重叠时有个优先级的问题。序号15 的优先级最高,以此递减,序号-1,即背景区的优先级最低。这些优先级是固定的;

  • 关于内存区的重叠优先级问题:如下所示共有 7 个区,背景区和序号 0-5 的区。内存区 4 跟内存区 0 和 1 有重叠部分,那么重叠部分将按照内存区 4 的配置规则执行(因为内存区 4的优先级更高);内存区 5 被完全包含在内存区3 里面,那么这部分内存区将按照内存区 5 的配置规则执行。
    stm32h7,# STM32 H7,stm32,单片机,嵌入式硬件,cache
  • 三种可配置的内存类型:STM32H7的MPU 提供了三种可配置的内存类型,分别是:
  1. Strongly Ordered Memory(强序内存):这种内存类型适用于访问特定的外设寄存器和共享内存区域等,它的访问顺序不能被改变。在这种内存类型下,访问该内存区域的数据会直接被发送到总线上,而不会被缓存。

  2. Device Memory(设备内存):这种内存类型适用于访问外设的数据缓冲区和寄存器等,它的访问顺序可以被改变。在这种内存类型下,访问该内存区域的数据会被缓存,但缓存策略不同于普通的数据缓存。

  3. Normal Memory(普通内存):这种内存类型适用于访问普通的数据和程序代码等,它的访问顺序可以被改变。在这种内存类型下,访问该内存区域的数据会被缓存,并且可以使用通用的缓存策略,如写回、写直通等。

通过使用这三种可配置的内存类型,STM32H7的MPU可以为不同的内存区域分配不同的访问权限,并控制不同类型的内存访问。例如,对于设备内存和强序内存,MPU可以限制对其的访问权限,防止程序对系统的恶意操作;而对于普通内存,MPU可以使用缓存策略来提高访问速度和效率。

1.1 MPU 的寄存器与对应库参数

1.1.1 MPU_RASR 寄存器

STM32H7的MPU中的MPU_RASR(Region Attribute and Size Register,区域属性和大小寄存器)寄存器用于配置MPU内存区域的属性和大小。MPU_RASR寄存器的位域结构如下:

typedef struct {
  uint32_t ENABLE:1;   // 区域使能位,最低位
  uint32_t SIZE:5;     // 区域大小
  uint32_t SRD:8;      // 禁用子区域位
  uint32_t B:1;        // 可缓存
  uint32_t C:1;        // 可写回(Cacheable)
  uint32_t S:1;        // 可共享
  uint32_t TEX:3;      // 类型扩展域
  uint32_t AP:3;       // 访问权限
  uint32_t XN:1;       // 禁止执行
  uint32_t res1:1;     // 保留位
  uint32_t SBO:1;      // 应该为1
  uint32_t res2:6;     // 保留位,最高位
} MPU_RASR_TypeDef;
  • XN 位:XN=0 表示使能指令提取,即这块内存区可以执行程序代码,XN=1 表示禁止指令提取,即这块内存
    区禁止执行程序代码。对应的 HAL 库 MPU 参数如下:
/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access
* @{
*/
#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00)
#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01)
  • AP 位::其功能如下:
    stm32h7,# STM32 H7,stm32,单片机,嵌入式硬件,cache
    对应的 HAL 库 MPU 参数如下
/** @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)
  • TEX 位:这仅关注 TEX = 0b000 和 0b001,其它的 TEX 配置基本用不到,其功能如下:
    stm32h7,# STM32 H7,stm32,单片机,嵌入式硬件,cache
  • SRD 位:这个位用于控制内存区的子区域,使用的是 bit[15:8],共计 8 个 bit,一个 bit 控制一个子区域,0表示使能此子区域,1 表示禁止此子区域。一般情况,基本不使用子区域的禁止功能,所以配置 HAL 库的 SubRegionDisable 参数时,直接取值 0x00 即可,表示 8 个子区域均使能。

1.1.2 MPU 的配置函数

HAL 库的 stm32h7xx_hal_cortex.c 文件为 MPU 的配置提供了三个函数:HAL_MPU_DisableHAL_MPU_EnableHAL_MPU_ConfigRegion

  1. HAL_MPU_Disable:该函数用于禁用MPU,函数原型如下:
void HAL_MPU_Disable(void);

该函数没有参数,也没有返回值。在函数内部,它会通过清除MPU的控制寄存器中的MPU_CTRL_ENABLE位来禁用MPU,代码如下:

MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
  1. HAL_MPU_Enable:该函数用于使能MPU,函数原型如下:
void HAL_MPU_Enable(void);

该函数没有参数,也没有返回值。在函数内部,它会通过设置MPU的控制寄存器中的MPU_CTRL_ENABLE位来使能MPU,代码如下:

MPU->CTRL |= MPU_CTRL_ENABLE_Msk;
  1. HAL_MPU_ConfigRegion:该函数用于配置MPU的某个区域,函数原型如下:
HAL_StatusTypeDef HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init);

该函数接收一个MPU_Region_InitTypeDef 类型的结构体指针作为参数,该结构体定义了要配置的MPU 区域的各个参数,包括区域编号、起始地址、大小、访问权限等等。

函数返回值为HAL_StatusTypeDef类型,表示函数执行结果的状态,包括HAL_OKHAL_ERROR等等。

在函数内部,首先会检查传入的参数是否合法,如果不合法则返回HAL_ERROR;否则,根据传入的参数配置MPU的区域,代码如下:

if((MPU_Init->Number < 0U) || (MPU_Init->Number > 7U))
{
  return HAL_ERROR;
}
else
{
  MPU->RNR = MPU_Init->Number;
  MPU->RBAR = MPU_Init->BaseAddress;
  MPU->RASR = MPU_Init->Attribute;
  return HAL_OK;
}

其中,MPU_Init->Number表示要配置的MPU区域的编号,MPU_Init->BaseAddress表示要配置的MPU区域的起始地址,MPU_Init->Attribute表示要配置的MPU区域的访问属性。

2. Cache - 缓存


  • Cache:Cache,即缓存是一种高速存储器,它可以暂存处理器访问的数据,以提高数据访问的速度和效率。缓存大小越大,系统的执行效率越高,但是也会占用更多的芯片面积和功耗。
    当前芯片厂商出的 M7 内核芯片基本都做了一级 Cache 支持, Cache 又分数据缓存 D-Cache 和指令缓冲 I-Cache,这里只看数据缓存D-Cache,其大小是16kB.
    STM32H7的主频是 400MHz,除了 TCM 和 Cache 以 400MHz工作,其它 AXI SRAM,SRAM1,SRAM2 等都是以 200MHz 工作。数据缓存 D-Cache 就是解决 CPU加速访问 SRAM.

  • 对于使能了 Cache 的 SRAM 区,要分读/写两种情况考虑:

    1. 读操作:如果 CPU 要读取的 SRAM 区数据在 Cache 中已经加载好,这就叫读命中(Cache hit),如果 Cache
      里面没有,就是所谓的读 Cache Miss.
    2. 写操作:如果 CPU 要写的 SRAM 区数据在 Cache 中已经开辟了对应的区域(专业词汇叫 Cache Line,以 32
      字节为单位),这就叫写命中(Cache hit),如果 Cache 里面没有开辟对应的区域,就是所谓的写 Cache Miss.
      stm32h7,# STM32 H7,stm32,单片机,嵌入式硬件,cache

2.1 Cache 的配置

Cache 的配置是通过 MPU 来设置的,通常只用到下几种方式:
stm32h7,# STM32 H7,stm32,单片机,嵌入式硬件,cache
其中的 TEX 是用来设置 Cache 策略的, C 是 Cache, B 是缓冲用来配合 Cache 设置的,而 S 是共享,
用来解决多总线或者多核访问时的同步问题。

2.2 四种 Cache(MPU) 配 置的读写操作流程

  • Cache 支持的策略有如下四种:
    stm32h7,# STM32 H7,stm32,单片机,嵌入式硬件,cache

M7 内核只要开启了 Cache,read allocate 就是开启的。

  1. Non-cacheable:正常的读写操作,无 Cache,即关闭Cache. 以下四种 MPU 配置都表示Non-cacheable

stm32h7,# STM32 H7,stm32,单片机,嵌入式硬件,cache文章来源地址https://www.toymoban.com/news/detail-597513.html

  1. Write back、read allocate、no write allocate
    • 使能了此配置的 SRAM 缓冲区写操作:如果 CPU 要写的 SRAM 区数据在 Cache 中已经开辟了对应的区域,那么会同时写到 Cache 里面和SRAM 里面;如果没有,就用到配置 no write allocate,意思就是 CPU 会直接往 SRAM 里面写数据,而不再需要在 Cache 里面开辟空间。
      在写 Cache 命中的情况下,这个方式的优点是 Cache 和 SRAM 的数据同步更新了,没有多总线访问造成的数据一致性问题。缺点也明显,Cache 在写操作上无法有效发挥性能。
    • 使能了此配置的 SRAM 缓冲区读操作:如果 CPU 要读取的 SRAM 区数据在 Cache 中已经加载好,就可以直接从 Cache 里面读取。如果没有,就用到配置 read allocate,意思就是在 Cache 里面开辟区域,将 SRAM 区数据加载进来,后续的操作,CPU 可以直接从 Cache 里面读取。
      stm32h7,# STM32 H7,stm32,单片机,嵌入式硬件,cache

到了这里,关于STM32【H7】理论——MPU、Cache的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32单片机入门学习笔记——MPU6050

    笔记整理自B站UP主江科大自化协教程《[10-2] MPU6050简介_哔哩哔哩_bilibili》,所用单片机也为教程推荐单片机。 如果芯片里再集成一个3轴的磁场传感器,测量XYZ轴的磁场强度,那就叫做9轴姿态传感器,如果再集成一个气压传感器,测量气压大小,那就叫做10轴姿态传感器,一

    2024年02月08日
    浏览(38)
  • STM32 CubeMX 无法将 STM32H7 的最大 CPU 频率设置为 480 MHz

    使用stm32cubemx设置时钟树为480MHz时,提示 cpu clock frequency must be =200MHZ 对于STM32H7 需要CPU修订版 为 V 才能达到 480 MHz 的最大频率。 使用STM32Programmer查看芯片修订版,确认是V版本: 在STM32CubeMX PinConfiguration 界面修改RCC选项,将Product Version设置为V: 此时时钟树界面已可以设置48

    2024年02月16日
    浏览(37)
  • STM32H7使用FileX库BUG,SD卡挂载失败

    使用STM32H7+ThreadX+FileX,之前使用swissbit牌的存储卡可正常使用,最近项目用了金士顿的存储卡,发现无法挂载文件系统。 调试过程发现,关闭D-Cache可以挂载使用exfat文件系统。 FileX对SD卡读写接口全部位于fx_stm32_sdio_driver.c中,查看该文件可以发现在读写函数中已经考虑到使用

    2024年04月28日
    浏览(28)
  • stm32h7中RTC的BCD模式与BIN模式

    BCD(Binary-Coded Decimal)和BIN(Binary)是两种不同的数字表示格式。 BCD格式: BCD是一种用二进制编码表示十进制数字的格式。在BCD格式中,每个十进制数位使用4位二进制数来表示,范围从0到9。例如,数字5在BCD格式中表示为0101,数字9表示为1001。这种编码方式使得BCD数值的每

    2024年01月23日
    浏览(30)
  • STM32H7 SDMMC+FATFS+USBMSC+FREERTOS 虚拟U盘

    通过cubemx配置 实现STM32H7 SDMMC+FATFS+USBMSC+FREERTOS 虚拟U盘 1.使用FAFTS文件操作系统,实现STM32虚拟U盘,读写外部SD卡,fatfs和usb mass storage class共存。 2.请先完成上一个帖子的步骤 -- 跳转https://blog.csdn.net/hjn0618/article/details/130383593 硬件平台:正点原子阿波罗 STM32H734IIT6 开发工具:

    2024年02月10日
    浏览(30)
  • STM32H7使用QSPI外扩flash(linux下使用openocd操作)

    根据安福莱的STM32H7教程,H7单片机的QSPI外设是直接连到芯片内核上的,地址是0X90000000;那么就可以通过QSPI外设,将外置flash内存映射,并由此执行代码。 相关操作在keil5上比较简单,配置点东西就行;可以参考安福莱教程。 这里要介绍的是在linux环境下没有keil5 IDE的情况下

    2024年01月16日
    浏览(42)
  • STM32H7并行读取AD7606数据以及片内AD值不准解决办法

    先了解一下AD7606,16位,单电源,200k采样率,8路,除了贵没有其他缺点,数据相当的稳,一个5V供电,不用运放的情况下采集电压精度可以达到1mv,非常Nice 与单片机相连 单片机 调用代码 测试发现AD采集到的电压要远小于实际电压,H7的AD还是16位的,不能这么拉跨吧,在网上

    2024年02月11日
    浏览(31)
  • 【正点原子STM32】STM32基础知识(F1F4F7H7 STM32系统框架、寻址范围、存储器映射的存储器功能划分、寄存器映射)

    一、STM32系统框架 1.1、Cortex M内核 芯片 1.2、F1系统架构 1.3、F4系统架构 1.4、F7系统架构 1.5、H7系统架构 二、STM32的寻址范围? 三、存储器映射 存储器功能划分(F1为例) STM32F1存储器映射图 四、寄存器映射 寄存器基础知识 STM32寄存器分类 寄存器映射(F1为例) 寄存器描述解

    2024年02月21日
    浏览(39)
  • 【STM32H7 开发笔记】| 02 - 通过定时器级联方式同步启动多个定时器并输出 PWM 波形

    (STM32H723xE/G) 所有定时器包括 两个高级控制定时器、十二个通用定时器、两个基本定时器、五个低功耗定时器、两个看门狗定时器和一个SysTick定时器 。所有计时器计数器都可以在Debug模式下冻结。 本次实验主频配置的是500MHz 高级控制定时器(TIM1,TIM8)可以看作是在6通道

    2024年02月14日
    浏览(26)
  • cubmx基础操作,hal库基本配置流程之使用 stm32cubmx生成HAL库进行gpio点亮led(stm32h7xx)(超详细,小白教程)

    HAL库(硬件抽象层库)是一个提供对底层硬件操作的抽象的库,它使得开发者可以使用统一的接口进行硬件操作,而不必关心底层硬件的具体实现细节。HAL库通常由硬件厂商提供,用于支持其硬件设备,并为其提供标准化的接口。 HAL库的主要目的是简化底层硬件的操作,使得

    2024年02月20日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包