- //设置某个区域的MPU保护
 
- //baseaddr:MPU保护区域的基址(首地址)
 
- //size:MPU保护区域的大小(必须是32的倍数,单位为字节),可设置的值参考:CORTEX_MPU_Region_Size
 
- //rnum:MPU保护区编号,范围:0~7,最大支持8个保护区域,可设置的值参考:CORTEX_MPU_Region_Number
 
- //ap:访问权限,访问关系如下:可设置的值参考:CORTEX_MPU_Region_Permission_Attributes
 
- //0,无访问(特权&用户都不可访问)
 
- //1,仅支持特权读写访问
 
- //2,禁止用户写访问(特权可读写访问)
 
- //3,全访问(特权&用户都可访问)
 
- //4,无法预测(禁止设置为4!!!)
 
- //5,仅支持特权读访问
 
- //6,只读(特权&用户都不可以写)
 
- //详见:STM32F7 Series Cortex-M7 processor programming manual.pdf,4.6节,Table 89.
 
- //sen:是否允许共用;0,不允许;1,允许
 
- //cen:是否允许catch;0,不允许;1,允许
 
- //返回值;0,成功.
 
- //    其他,错误.
 
- u8 MPU_Set_Protection(u32 baseaddr,u32 size,u32 rnum,u32 ap,u8 sen,u8 cen,u8 ben,u8 Tex)
 
- {
 
-         MPU_Region_InitTypeDef MPU_Initure;
 
-         HAL_MPU_Disable();                                                                        //配置MPU之前先关闭MPU,配置完成以后在使能MPU
 
-  
 
-         MPU_Initure.Enable=MPU_REGION_ENABLE;                                //使能该保护区域 
 
-         MPU_Initure.Number=rnum;                                            //设置保护区域
 
-         MPU_Initure.BaseAddress=baseaddr;                            //设置基址
 
-         MPU_Initure.Size=size;                                                    //设置保护区域大小
 
-         MPU_Initure.SubRegionDisable=0X00;                      //禁止子区域
 
-         MPU_Initure.TypeExtField=Tex;                           //设置类型扩展域
 
-         MPU_Initure.AccessPermission=(u8)ap;                            //设置访问权限,
 
-         MPU_Initure.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE;        //允许指令访问(允许读取指令)
 
-         MPU_Initure.IsShareable=sen;                            //是否允许共用
 
-         MPU_Initure.IsCacheable=cen;                            //是否允许cache
 
-         MPU_Initure.IsBufferable=ben;                           //是否允许缓冲
 
-         HAL_MPU_ConfigRegion(&MPU_Initure);                     //配置MPU
 
-         HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);                                //开启MPU
 
-     return 0;
 
- }
 
-  
 
- //设置需要保护的存储块
 
- //必须对部分存储区域进行MPU保护,否则可能导致程序运行异常
 
- //比如MCU屏不显示,摄像头采集数据出错等等问题...
 
- void MPU_Memory_Protection(void)   //特意把SRAM4设置为不允许cache,使用DMA的变量可以放在这里。但要注意相应DMA能否访问SRAM4
 
- {
 
-         MPU_Set_Protection(0x20000000,MPU_REGION_SIZE_128KB,MPU_REGION_NUMBER1,MPU_REGION_FULL_ACCESS,0,1,1,MPU_TEX_LEVEL0);        //保护整个DTCM,共128K字节,禁止共用,允许cache,允许缓冲
 
-         MPU_Set_Protection(0x24000000,MPU_REGION_SIZE_512KB,MPU_REGION_NUMBER2,MPU_REGION_FULL_ACCESS,0,1,1,MPU_TEX_LEVEL0);        //保护整个内部SRAM,包括SRAM1,SRAM2和DTCM,共512K字节
 
-         MPU_Set_Protection(0x30000000,MPU_REGION_SIZE_512KB,MPU_REGION_NUMBER3,MPU_REGION_FULL_ACCESS,0,1,1,MPU_TEX_LEVEL0);        //保护整个SRAM1~SRAM3,共288K字节,禁止共用,允许cache,允许缓冲
 
-         MPU_Set_Protection(0x38000000,MPU_REGION_SIZE_64KB ,MPU_REGION_NUMBER4,MPU_REGION_FULL_ACCESS,0,0,1,MPU_TEX_LEVEL0);        //保护整个SRAM4,共64K字节,禁止共用,不允许cache,允许缓冲
 
-         MPU_Set_Protection(0x60000000,MPU_REGION_SIZE_64MB ,MPU_REGION_NUMBER5,MPU_REGION_FULL_ACCESS,0,0,0,MPU_TEX_LEVEL0);        //保护MCU LCD屏所在的FMC区域,,共64M字节,禁止共用,禁止cache,禁止缓冲
 
-         MPU_Set_Protection(0xC0000000,MPU_REGION_SIZE_64MB ,MPU_REGION_NUMBER6,MPU_REGION_FULL_ACCESS,0,1,1,MPU_TEX_LEVEL0);        //保护SDRAM区域,共32M字节,禁止共用,允许cache,允许缓冲
 
- }