STM32H750XB_RT-THREAD/30-TIM—基本定时器定时/User/mpu/bsp_mpu.c
2025-07-21 14:34:29 +08:00

99 lines
3.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************
* @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 键入扩展字段,允许您配置内存访问类型,例如强排序,外设。
* 可以取值012
* @param Address MPU保护区域基地址特别注意配置的Address需要被Size整除
* @param Size MPU保护区域大小,可以取值MPU_1KBMPU_4KB ...MPU_512MB
* @param IsShareable 保护的存储空间是否可以共享1=允许共享0=禁止共享。
* @param IsCacheable 保护的存储空间是否可以缓存1=允许缓存0=禁止缓存。
* @param IsBufferable 使能Cache之后策略是write-through还是write-back(bufferable)
* 1=允许缓冲即回写write-back0=禁止缓冲即直写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;
}
}