打印
[STM32H7]

STM32H743+CubeMX-梳理MPU的设置

[复制链接]
1079|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qcliu|  楼主 | 2021-9-3 17:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qcliu 于 2021-9-3 17:10 编辑

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

访问许可为Full access(访问不受限)
内存类型:Normal
Cache的配置为Write-back,wirte and read allocate(Cache四种配置之一)
禁止多个进程共享内存。
为什么使用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,所以不用保护)。

使用特权

评论回复
沙发
qcliu|  楼主 | 2021-9-3 17:10 | 只看该作者
二、CubeMX
2.1、Cortex interface Settings


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

使用特权

评论回复
板凳
qcliu|  楼主 | 2021-9-3 17:12 | 只看该作者
2.2、Cortex Memory Protection Unit Control Settings(内存保护单元控制设置)
MPU Control Mode有四种控制模式:

Background Region Access Not Allowed + MPU Disable during hard fault , NMI and FAULTMASK handlers
Background Region Access Not Allowed + MPU Enable during hard fault , NMI and FAULTMASK handers
Background Region Privileged access only + MPU Disable during hard fault , NMI and FAULTMASK handlers
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的四种控制模式相当于:Background Region Access Not Allowed + MPU Disable during hard fault , NMI and FAULTMASK handlers (PRIVDEFENA = 0 + HFNMIENA = 0)Background Region Access Not Allowed + MPU Enable during hard fault , NMI and FAULTMASK handers (PRIVDEFENA = 0 + HFNMIENA = 1)Background Region Privileged access only + MPU Disable during hard fault , NMI and FAULTMASK handlers (PRIVDEFENA = 1 + HFNMIENA = 0)Background Region Privileged access only + MPU Enable during hard fault , NMI and FAULTMASK handers (PRIVDEFENA = 1 + HFNMIENA = 1)

使用特权

评论回复
地板
qcliu|  楼主 | 2021-9-3 17:13 | 只看该作者
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(访问不受限)。



使用特权

评论回复
5
qcliu|  楼主 | 2021-9-3 17:14 | 只看该作者
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也有进一步的说明,更容易理解。



使用特权

评论回复
6
qcliu|  楼主 | 2021-9-3 17:15 | 只看该作者
三、代码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 Region

  MPU_InitStruct.Number = MPU_REGION_NUMBER0;                   //Region 0 Settings

  MPU_InitStruct.BaseAddress = 0x24000000;                      //MPU Region Base Address

  MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;                  //MPU Region Size

  MPU_InitStruct.SubRegionDisable = 0x0;                        //MPU SubRegion Disable

  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;                 //MPU TEX field level

  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;     //MPU Access Permission

  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;   //MPU Instruction Access

  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;        //MPU Shareability Permission

  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;            //MPU Cacheable Permission

  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;          //MPU Bufferable Permission


  HAL_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。



使用特权

评论回复
7
linluc| | 2022-3-5 13:33 | 只看该作者
分析的非常透彻,收下了,谢谢版主

使用特权

评论回复
8
Bblythe| | 2022-10-9 08:06 | 只看该作者

计算量小,计算快。缺点也严重:在不同的图像中,颜色分布差别大,处理效果也不会很好。

使用特权

评论回复
9
Pulitzer| | 2022-10-9 11:05 | 只看该作者

需要设定一个阈值来对像素点进行设置

使用特权

评论回复
10
Uriah| | 2022-10-9 18:06 | 只看该作者

根据色彩的变化记录每一行的颜色跳变点,由此识别出车牌区域。

使用特权

评论回复
11
帛灿灿| | 2023-8-1 07:03 | 只看该作者

需要在做项目的过程中经历磨难

使用特权

评论回复
12
Bblythe| | 2023-8-1 08:06 | 只看该作者

硬件设计和软件设计本来就是鱼和熊掌的关系,两者不可兼得

使用特权

评论回复
13
童雨竹| | 2023-8-1 10:02 | 只看该作者

结构化模块化的程序设计的思想,使最基本的要求

使用特权

评论回复
14
Pulitzer| | 2023-8-1 11:05 | 只看该作者

确定好硬件原理图,硬件布线,最后才是软件的开发

使用特权

评论回复
15
Clyde011| | 2023-8-1 12:08 | 只看该作者

没有发现有哪本是介绍设计思想的

使用特权

评论回复
16
公羊子丹| | 2023-8-1 13:01 | 只看该作者

写程序不难,但是程序怎么样才能写的好,写的快,那是需要点经验积累的

使用特权

评论回复
17
Wordsworth| | 2023-8-1 14:04 | 只看该作者

在实际的项目应用当中,单片机引脚的复用相当厉害

使用特权

评论回复
18
Clyde011| | 2023-8-1 15:07 | 只看该作者

但是如果不懂程序设计的思想的话,会给你做项目的过程中带来很多很多的困惑。

使用特权

评论回复
19
万图| | 2023-8-1 17:03 | 只看该作者

时间片轮的设计思想

使用特权

评论回复
20
Uriah| | 2023-8-1 18:06 | 只看该作者

事实上很多做项目的工程师本身自己也会在用

使用特权

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

本版积分规则

62

主题

3315

帖子

4

粉丝