文章目录

  • 一、前言
  • 二、CubeMX
    • 2.1、Cortex interface Settings
    • 2.2、Cortex Memory Protection Unit Control Settings(内存保护单元控制设置)
    • 2.3、Cortex Memory Protection Unit Region 0 Settings(内存保护单元区域0设置)
      • 2.3.1、MPU Region
      • 2.3.2、MPU Region Base Address(MPU区域首地址)
      • 2.3.3、MPU Region Size(MPU区域大小)
      • 2.3.4、MPU SubRegion Disable
      • 2.3.5、MPU TEX field level(MPU TEX域等级)
      • 2.3.6、MPU Access Permission(MPU访问权限)
      • 2.3.7、MPU Instruction Access ( MPU指令访问)
      • 2.3.8、MPU Shareability Permission(MPU共享许可)
      • 2.3.9、MPU Cacheable Permission(MPU Cache许可)与 MPU Bufferable Permission(MPU 缓存许可)
  • 三、代码
    • 3.1、案例一
    • 3.2、案例二
    • 3.3、案例一与案例二的区别

相关笔记:
STM32H743+CubeMX-将变量定义到指定的内存
STM32CubeIDE教程-查看FLASH与RAM细节

一、前言

充分发挥Cortex-M7架构(STM32H743属于Cortex-M7)的性能,必须掌握MPU的使用。实际上,提高CPU性能的不是MPU,而是Cache(高速缓存器)。在STM32上,配置了MPU才能使用Cache,Cache的配置是通过MPU设置的。总之,为了使用cache才配置MPU。
参考安富莱例程源码,配置MPU管理512kb的AXI SRAM内存:

  1. 访问许可为Full access(访问不受限)
  2. 内存类型:Normal
  3. Cache的配置为Write-back,wirte and read allocate(Cache四种配置之一)
  4. 禁止多个进程共享内存。

    为什么使用Cache才能充分发挥CPU的性能?在默认的配置下,静态内存优先使用128KB的DTCM。原因是CPU读写DTCM内存的速度是480M,所以一般优先使用128KB的DTCM。CPU直接读写其他静态内存的速度仅仅只有200M,白白浪费CPU的480M主频了。为了解决这个问题,Cortex-M7架构有了cache。通过提前将数据缓冲到12KB的cache,然后CPU再从cache里读取数据,这样就能解决当CPU读写AXI SRAM与SRAM1等内存时所造成的性能损失。
    为什么要学习使用MPU?只有通过设置MPU才能配置cache,才能正常使用cache缓存数据。

    并不是DTCM挤满了才有机会使用MPU。比如当使用ADC+DMA采集模拟量数据时,DMA并不能将外设采集的模拟量数据存放到DTCM里,一般只能放进AXI SRAM,SRAM1,SRAM2,SRAM3里。此时,就需要使用MPU+cache提高CPU读写AXI RAM,SRAM1等内存的速度。

    配置MPU的目的是使用cache,所以可以简单地将MPU的设置分为三部分。第一部分是配置MPU的内存地址,第二部分是配置Cache的读写规则,第三部分设置保护规则(配置MPU是为了使用Cache,所以不用保护)。

二、CubeMX

2.1、Cortex interface Settings

在CubeMX上找到CORTEX_M7,使能CPU ICache与CPU DCahce。其实就是使能Cache(高速缓存器)。

2.2、Cortex Memory Protection Unit Control Settings(内存保护单元控制设置)

MPU Control Mode有四种控制模式:

  1. Background Region Access Not Allowed + MPU Disable during hard fault , NMI and FAULTMASK handlers
  2. Background Region Access Not Allowed + MPU Enable during hard fault , NMI and FAULTMASK handers
  3. Background Region Privileged access only + MPU Disable during hard fault , NMI and FAULTMASK handlers
  4. Background Region Privileged access only + MPU Enable during hard fault , NMI and FAULTMASK handers

    MPU Control Mode选项其实就是配置MPU_CTRL寄存器:
  • PRIVDEFENA :使能特权软件对默认内存映射的访问
  • HFNMIENA:使能在硬件故障,NMI与FAULTMASK中断程序里操作MPU

    MPU的四种控制模式相当于:
  1. Background Region Access Not Allowed + MPU Disable during hard fault , NMI and FAULTMASK handlers (PRIVDEFENA = 0 + HFNMIENA = 0)
  2. Background Region Access Not Allowed + MPU Enable during hard fault , NMI and FAULTMASK handers (PRIVDEFENA = 0 + HFNMIENA = 1)
  3. Background Region Privileged access only + MPU Disable during hard fault , NMI and FAULTMASK handlers (PRIVDEFENA = 1 + HFNMIENA = 0)
  4. Background Region Privileged access only + MPU Enable during hard fault , NMI and FAULTMASK handers (PRIVDEFENA = 1 + HFNMIENA = 1)

2.3、Cortex Memory Protection Unit Region 0 Settings(内存保护单元区域0设置)

2.3.1、MPU Region

必须使能。

2.3.2、MPU Region Base Address(MPU区域首地址)

内存的首地址0x24000000,从编程手册RM0433查询到:

2.3.3、MPU Region Size(MPU区域大小)

内存的大小512KB,从编程手册RM0433查询到:

2.3.4、MPU SubRegion Disable

0x00表示没有子区域。

2.3.5、MPU TEX field level(MPU TEX域等级)

配置MPU_RASR寄存器的TEX段,当前只用到000(level0)与001(level1)两种。

2.3.6、MPU Access Permission(MPU访问权限)

为了使用Cache才配置的MPU,所以并不需要限制访问。设置MPU_RASR寄存器的AP段,设置Full access(访问不受限)。

2.3.7、MPU Instruction Access ( MPU指令访问)

必须Enable。

2.3.8、MPU Shareability Permission(MPU共享许可)

必须DISABLE。根据安富莱的教程:

2.3.9、MPU Cacheable Permission(MPU Cache许可)与 MPU Bufferable Permission(MPU 缓存许可)

这两个配置与MPU TEX field level一起决定Memory Type(内存的类型)。

ST官方手册对以下下四种内存类型与Cache一起使用的说明:

安富莱的STM32H7用户手册对这四个内存类型与Cache也有进一步的说明,更容易理解。

三、代码

3.1、案例一


CubeMX上MPU的设置生成的代码如下:

void MPU_Config(void)
{MPU_Region_InitTypeDef MPU_InitStruct = {0};/* Disables the MPU */HAL_MPU_Disable();/** Initializes and configures the Region and the memory to be protected*/MPU_InitStruct.Enable = MPU_REGION_ENABLE;                    //MPU RegionMPU_InitStruct.Number = MPU_REGION_NUMBER0;                   //Region 0 SettingsMPU_InitStruct.BaseAddress = 0x24000000;                      //MPU Region Base AddressMPU_InitStruct.Size = MPU_REGION_SIZE_512KB;                  //MPU Region SizeMPU_InitStruct.SubRegionDisable = 0x0;                        //MPU SubRegion DisableMPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;                 //MPU TEX field levelMPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;     //MPU Access PermissionMPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;   //MPU Instruction AccessMPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;        //MPU Shareability PermissionMPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;            //MPU Cacheable PermissionMPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;          //MPU Bufferable PermissionHAL_MPU_ConfigRegion(&MPU_InitStruct);/* Enables the MPU */HAL_MPU_Enable(MPU_HFNMI_PRIVDEF);  //MPU Enable}

3.2、案例二

void MPU_Config(void)
{MPU_Region_InitTypeDef MPU_InitStruct = {0};/* 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 = 0x24000000;MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;MPU_InitStruct.SubRegionDisable = 0x0;MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;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_BUFFERABLE;HAL_MPU_ConfigRegion(&MPU_InitStruct);/* Enables the MPU */HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);}

3.3、案例一与案例二的区别

案例一与案例二的区别在于MPU control mode不一样,从而导致函数MPU_Config(void)里,最后一段代码HAL_MPU_Enable( )的入口参数从MPU_HFNMI_PRIVDEF改为MPU_PRIVILEGED_DEFAULT。功能上的区别是程序要不要在硬件错误等中断回调函数里处理MPU。

STM32H743+CubeMX-梳理MPU的设置相关推荐

  1. RTX5 | STM32H743+CubeMX+RTX5+两路FDCAN驱动+CANopen协议

    一.前言 百度网盘: 链接:https://pan.baidu.com/s/1NEccCy1S-Z5FhcInQOTzfA 提取码:fddg RTX5 | STM32H743+CubeMX+RTX5+ ...

  2. RTX5 | STM32H743+CubeMX+RTX5+两路FDCAN模板

    百度网盘: 链接:https://pan.baidu.com/s/15dy_YsLAaNDRZ7rPNUmtlA 提取码:0xm9 测试硬件:硬石科技的STM32H743工控板 CubeMX的版本:6 ...

  3. STM32H743+CubeMX-使用ADC(16bit分辨率)模数转换器读取CPU的温度(串行方式)

    文章目录 一.前言 二.CubeMX 2.1.RCC 2.2.SYS 2.3.ADC 2.4.Clock Configuration 四.代码 4.1.adc.c 4.2.adc.h 4.3.main ...

  4. STM32+CubeMX开发工程笔记汇总(更新2021.8.12)

    一.前言 使用STM32开发产品已经快两年了,一路走来真的非常有意思. 单片机型号:从STM32F103->STM32F407->STM32H743 库: 从标准库->HAL库(ST ...

  5. STM32H743+CubeMX-ADC+DMA采样四路AD

    文章目录 一.前言 二.CubeMX 2.1.Clock Configuration 2.2.CORTEX_M7(cache与MPU) 2.3.ADC3 Mode and Configuration ...

  6. STM32+CubeMX开发工程笔记汇总(更新2022.6.12)

    一.前言 使用STM32开发产品已经快两年了,一路走来真的非常有意思. 单片机型号:从STM32F103->STM32F407->STM32H743 库: 从标准库->HAL库(ST ...

  7. STM32H743+CubeIDE-将变量定义到指定的内存

    文章目录 一.前言 二.将变量定义到指定的内存 2.1.将变量定义到DTCM内存 2.2.将变量定义到RAM_D1内存 三.STM32CubeIDE实用技巧之ld链接文件解读 3.1.内存(MEMOR ...

  8. SMT32H743+CubeMX-配置MPU后,在Keil上的程序卡死

    文章目录 一.前言 二.解决问题 一.前言 在实际工作上,一定要使用cache才能充分发挥STM32H743的性能,所以一定要配置MPU.MPU的配置如下所示,但是Keil程序却无法正常执行.DEBU ...

  9. 如何梳理产品功能,才能既见森林又见树木?

    了解用户需求后,如何梳理产品的功能,才能做到全面,不遗漏核心功能? 之前的文章介绍了一种方法,暂且把它叫做:用户故事地图法. 用户故事地图,产品经理必须掌握的分析利器 今天介绍另外一种方法:用例法. ...

最新文章

  1. 关于SSL配置的报告
  2. OpenAI推新程序包:GPU适应十倍大模型仅需增加20%训练时间
  3. python中txt转成csv_Python-如何将JSON转换为CSV?
  4. python-adb
  5. 服务器所有文件,检索服务器端文件夹中的所有文件
  6. 如何轻松愉快的理解条件随机场(CRF)
  7. python土味情话_土味情话表情包下载
  8. 退出linux用户登录命令,Linux系统中用户的登入登出命令详解
  9. 信息系统项目管理02——信息系统项目管理基础
  10. sniffer模拟arp***
  11. python冒泡排序算法详解_Python 3.0冒泡排序算法示例源码
  12. Multipart生成的临时文件
  13. CDH大数据平台搭建
  14. 带你玩转 Visual Studio——带你跳出坑爹的 Runtime Library 坑
  15. 方立勋_30天掌握JavaWeb_Web开发入门
  16. 计算机能直接和cpu交换数据的是,内存储器_能直接与CPU交换信息的存储器是
  17. TWINCAT2安装问题
  18. Multiple primary key defined
  19. 转载来自朱小厮博客的 一文看懂Kafka消息格式的演变
  20. 真的是没有底线了,重新认识Java

热门文章

  1. 12.1 LNMP架构介绍 12.2 MySQL安装 12.3/12.4 PHP安装 12.5 Nginx介绍
  2. TCP的三次握手过程与四次挥手
  3. 红帽产品及技术总裁:未来IT趋势预测
  4. javascript技巧参考
  5. 一名老程序员的一点感悟给未来的程序员
  6. ZSKAME大白菜2013官网下载
  7. NanShan作者:风景未变人已变
  8. 深圳南山区法院受理11人集体诉腾讯案
  9. 创业失败常见的8大原因
  10. C/C++ 不可不知道的编程技巧!第一部分