99 lines
3.7 KiB
C
99 lines
3.7 KiB
C
/**
|
||
******************************************************************
|
||
* @file bsp_mpu.c
|
||
* @author fire
|
||
* @version V1.0
|
||
* @date 2018-xx-xx
|
||
* @brief 配置MPU区域属性和大小
|
||
******************************************************************
|
||
* @attention
|
||
*
|
||
* 实验平台:野火 STM32H750开发板
|
||
* 论坛 :http://www.firebbs.cn
|
||
* 淘宝 :http://firestm32.taobao.com
|
||
*
|
||
******************************************************************
|
||
*/
|
||
#include "./mpu/bsp_mpu.h"
|
||
|
||
/**
|
||
* @brief 配置MPU区域属性和大小寄存器值
|
||
* @param Region MPU保护区域,取值范围(0—7)
|
||
* @param DisableExec 指令访问禁用位,0=允许指令访问,1=禁止指令访问。
|
||
* @param AccessPermission 数据访问权限,取值范围(MPU_NO_ACCESS—MPU_PRIV_RO_URO)
|
||
* @param TypeExtField 键入扩展字段,允许您配置内存访问类型,例如强排序,外设。
|
||
* 可以取值(0,1,2)
|
||
* @param Address MPU保护区域基地址,特别注意配置的Address需要被Size整除
|
||
* @param Size MPU保护区域大小,可以取值(MPU_1KB,MPU_4KB ...MPU_512MB)
|
||
* @param IsShareable 保护的存储空间是否可以共享,1=允许共享,0=禁止共享。
|
||
* @param IsCacheable 保护的存储空间是否可以缓存,1=允许缓存,0=禁止缓存。
|
||
* @param IsBufferable 使能Cache之后,策略是write-through还是write-back(bufferable)
|
||
* 1=允许缓冲,即回写(write-back),0=禁止缓冲,即直写(write-through)。
|
||
* @retval None
|
||
*/
|
||
void BSP_MPU_ConfigRegion( uint8_t Region,
|
||
uint8_t DisableExec,
|
||
uint8_t AccessPermission,
|
||
uint8_t TypeExtField,
|
||
uint32_t Address,
|
||
uint32_t Size,
|
||
uint8_t IsShareable,
|
||
uint8_t IsCacheable,
|
||
uint8_t IsBufferable )
|
||
{
|
||
MPU_Region_InitTypeDef MPU_InitStruct;
|
||
|
||
/* 禁用MPU */
|
||
HAL_MPU_Disable();
|
||
|
||
/* 配置MPU属性*/
|
||
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
|
||
MPU_InitStruct.BaseAddress = Address; //区域基地址。
|
||
MPU_InitStruct.Size = Size; //要配置的区域的区域大小。
|
||
MPU_InitStruct.AccessPermission = AccessPermission; //数据访问权限允许您配置用户和特权模式的读/写访问权限。
|
||
MPU_InitStruct.IsBufferable = IsBufferable; //区域是可缓冲的,即使用回写缓存。 可缓存但不可缓冲的区域使用直写策略。
|
||
MPU_InitStruct.IsCacheable = IsCacheable; //区域是否可缓存的,即其值是否可以保存在缓存中。
|
||
MPU_InitStruct.IsShareable = IsShareable; //区域是否可以在多个总线主控器之间共享。
|
||
MPU_InitStruct.Number = Region; //区域保护。
|
||
MPU_InitStruct.TypeExtField = TypeExtField; //键入扩展字段,允许您配置内存访问类型。
|
||
MPU_InitStruct.SubRegionDisable = 0x00; //子区域禁用字段。
|
||
MPU_InitStruct.DisableExec = DisableExec; //指令访问禁用位。
|
||
|
||
HAL_MPU_ConfigRegion(&MPU_InitStruct);
|
||
|
||
/* 启用MPU */
|
||
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
|
||
}
|
||
|
||
void Board_MPU_Config(uint8_t Region ,uint8_t Mode,uint32_t Address,uint32_t Size)
|
||
{
|
||
switch(Mode)
|
||
{
|
||
case MPU_Normal_WB:
|
||
/* 设置内存为Normal类型,禁用共享, 回写模式不带写入读取分配*/
|
||
BSP_MPU_ConfigRegion(Region,0,MPU_FULL_ACCESS,0,Address,Size,0,1,1);
|
||
break;
|
||
|
||
case MPU_Normal_WBWARA:
|
||
/* 设置内存为Normal类型,禁用共享, 回写模式带写入读取分配*/
|
||
BSP_MPU_ConfigRegion(Region,0,MPU_FULL_ACCESS,1,Address,Size,0,1,1);
|
||
break;
|
||
|
||
case MPU_Normal_WT:
|
||
/* 设置内存为Normal类型,禁用共享, 直写模式*/
|
||
BSP_MPU_ConfigRegion(Region,0,MPU_FULL_ACCESS,0,Address,Size,0,1,0);
|
||
break;
|
||
|
||
case MPU_Normal_NonCache:
|
||
/* 设置内存为Normal类型,禁用共享,禁用缓存模式*/
|
||
BSP_MPU_ConfigRegion(Region,0,MPU_FULL_ACCESS,1,Address,Size,0,0,0);
|
||
break;
|
||
|
||
case MPU_Device_NonCache:
|
||
/*设置内存为Device类型,共享设置无效,禁止共享,禁用缓存模式*/
|
||
BSP_MPU_ConfigRegion(Region,0,MPU_FULL_ACCESS,2,Address,Size,0,0,0);
|
||
break;
|
||
}
|
||
|
||
}
|