25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

78 lines
3.1 KiB

  1. #include "mpu.h"
  2. #include "led.h"
  3. #include "delay.h"
  4. #include "usart.h"
  5. //////////////////////////////////////////////////////////////////////////////////
  6. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  7. //ALIENTEK STM32F7开发板
  8. //MPU驱动代码
  9. //正点原子@ALIENTEK
  10. //技术论坛:www.openedv.com
  11. //创建日期:2015/11/30
  12. //版本:V1.0
  13. //版权所有,盗版必究。
  14. //Copyright(C) 广州市星翼电子科技有限公司 2014-2024
  15. //All rights reserved
  16. //////////////////////////////////////////////////////////////////////////////////
  17. //设置某个区域的MPU保护
  18. //baseaddr:MPU保护区域的基址(首地址)
  19. //size:MPU保护区域的大小(必须是32的倍数,单位为字节),可设置的值参考:CORTEX_MPU_Region_Size
  20. //rnum:MPU保护区编号,范围:0~7,最大支持8个保护区域,可设置的值参考:CORTEX_MPU_Region_Number
  21. //ap:访问权限,访问关系如下:可设置的值参考:CORTEX_MPU_Region_Permission_Attributes
  22. //0,无访问(特权&用户都不可访问)
  23. //1,仅支持特权读写访问
  24. //2,禁止用户写访问(特权可读写访问)
  25. //3,全访问(特权&用户都可访问)
  26. //4,无法预测(禁止设置为4!!!)
  27. //5,仅支持特权读访问
  28. //6,只读(特权&用户都不可以写)
  29. //详见:STM32F7 Series Cortex-M7 processor programming manual.pdf,4.6节,Table 89.
  30. //sen:是否允许共用;0,不允许;1,允许
  31. //cen:是否允许catch;0,不允许;1,允许
  32. //返回值;0,成功.
  33. // 其他,错误.
  34. u8 MPU_Set_Protection(u32 baseaddr,u32 size,u32 rnum,u32 ap,u8 sen,u8 cen,u8 ben)
  35. {
  36. MPU_Region_InitTypeDef MPU_Initure;
  37. HAL_MPU_Disable(); //配置MPU之前先关闭MPU,配置完成以后在使能MPU
  38. MPU_Initure.Enable=MPU_REGION_ENABLE; //使能该保护区域
  39. MPU_Initure.Number=rnum; //设置保护区域
  40. MPU_Initure.BaseAddress=baseaddr; //设置基址
  41. MPU_Initure.Size=size; //设置保护区域大小
  42. MPU_Initure.SubRegionDisable=0X00; //禁止子区域
  43. MPU_Initure.TypeExtField=MPU_TEX_LEVEL0; //设置类型扩展域为level0
  44. MPU_Initure.AccessPermission=(u8)ap; //设置访问权限,
  45. MPU_Initure.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE; //允许指令访问(允许读取指令)
  46. MPU_Initure.IsShareable=sen; //是否允许共用
  47. MPU_Initure.IsCacheable=cen; //是否允许cache
  48. MPU_Initure.IsBufferable=ben; //是否允许缓冲
  49. HAL_MPU_ConfigRegion(&MPU_Initure); //配置MPU
  50. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); //开启MPU
  51. return 0;
  52. }
  53. //设置需要保护的存储块
  54. //必须对部分存储区域进行MPU保护,否则可能导致程序运行异常
  55. //比如MCU屏不显示,摄像头采集数据出错等等问题...
  56. void MPU_Memory_Protection(void)
  57. {
  58. MPU_Set_Protection(0x20000000,MPU_REGION_SIZE_512KB,MPU_REGION_NUMBER1,MPU_REGION_FULL_ACCESS,1,1,0); //保护整个内部SRAM,包括SRAM1,SRAM2和DTCM,共512K字节
  59. MPU_Set_Protection(0XC0000000,MPU_REGION_SIZE_32MB,MPU_REGION_NUMBER2,MPU_REGION_FULL_ACCESS,1,1,1); //保护SDRAM区域,共32M字节
  60. }
  61. //MemManage错误处理中断
  62. //进入此中断以后,将无法恢复程序运行!!
  63. void MemManage_Handler(void)
  64. {
  65. LED1(ON); //点亮DS1
  66. printf("Mem Access Error!!\r\n"); //输出错误信息
  67. delay_ms(1000);
  68. printf("Soft Reseting...\r\n"); //提示软件重启
  69. delay_ms(1000);
  70. NVIC_SystemReset(); //软复位
  71. }