STM32F767 MPU的基本用法

本文介绍STM32F767 MPU的基本用法。

开发环境

硬件环境

  • 电脑:Windows 10 Home x64
  • Apollo STM32F767开发板(ST-LINK V2仿真器)

软件环境

  • Keil Version 5.24.1 (Pack Installer:Keil.STM32F7xx_DFP.2.9.0.pack)
  • STM32CubeMX Version 4.25.0(Packages Manager:STM32CubeF7)

MPU功能简介

主要特性

 MPU(Memory Protection Unit)即为内存保护单元,其主要作用是实施存储器的保护,它能够在系统或程序出现异常而非正常地访问不应该访问的存储空间时,通过触发异常中断而达到提高系统可靠性的目的。

 其主要功能有:

  • 将存储器映射为不同区域,可以设置每个区域的位置、大小、访问权限;
  • 对于每一个区域,其属性设置包括:IsBufferable、IsCacheable、IsShareable;
  • 对于每一个区域,可以控制区域是否可执行;

寄存器说明

MPU对区域的属性与大小配置通过寄存器MPU_RASR实现,改寄存器的说明如下:

Bits Name Function
[31:29] - Reserved.
[28] XN Instruction access disable bit:
0:Instruction fetches enabled.
1 Instruction fetches disabled.
[27] - Reserved.
[26:24] AP 见表1
[23:22] - Reserved.
[21:19, 17, 16] TEX, C, B 见表2
[18] S 见表2
[15:8] SRD Subregion disable bits. For each bit in this field:
0:Corresponding sub-region is enabled.
1:Corresponding sub-region is disabled
[7:6] - Reserved
[5:1] SIZE $RegionSize(bytes) = 2^{SIZE+1}$
[0] ENABLE Region enable bit

MPU_RASR中用来设置数据访问许可的AP字段详细设置选项如下:

AP[2 :0] AP[2 :0] 用户模式 描述
000 不可访问 不可访问 所有的访问产生一个内存管理异常
001 RW 不可访问 仅可从特权模式访问
010 RW RO 在用户模式下的写访问会产生内存管理异常
011 RW RW 完全访问
100 不可预知 不可预知 保留
101 RO 不可访问 仅可在特权模式下进行读访问
110 RO RO 特权和用户模式只读
111 RO RO 特权和用户模式只读

对于TEX, C, B, S位的设置,常用模式下TEX取1,此时配置方法为如下:

基于MPU对SDRAM数据区进行保护

MPU的设置

MPU的设置代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* @brief Configures the main MPU regions.
* @param None
* @retval None
*/
void MPU_Config(void)
{
MPU_Region_InitTypeDef MPU_InitStruct;
/* Disable MPU */
HAL_MPU_Disable();
/* SDRAM配置 */
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
MPU_InitStruct.BaseAddress = SDRAM_BASE_ADDRESS;
MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;
MPU_InitStruct.SubRegionDisable = 0x00;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
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.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
/* Enable MPU (any access not covered by any enabled region will cause a fault) */
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

其设置功能主要有:

  • 使能对SDRAM区域的保护;
  • 设置区域编号为0;
  • 设置SDRAM数据区的地址与大小;
  • 关闭子区域功能;
  • TEX拓展字段设置为0;
  • 访问权限为完全访问;
  • 设置该区域为BUFFERABLE、CACHEABLE、不可共享;
  • 设置该区域禁止执行代码。

MPU设置对SDRAM读写速率的影响

文章目录
  1. 1. 开发环境
    1. 1.1. 硬件环境
    2. 1.2. 软件环境
  2. 2. MPU功能简介
    1. 2.1. 主要特性
    2. 2.2. 寄存器说明
  3. 3. 基于MPU对SDRAM数据区进行保护
    1. 3.1. MPU的设置
  4. 4. MPU设置对SDRAM读写速率的影响
|