/**
  ******************************************************************
  * @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;
	}
	
}