drv_mpu.c 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include <rtthread.h>
  2. #include "drv_mpu.h"
  3. #include "stm32f4xx_hal.h"
  4. /************************** PUBLIC DEFINITIONS *************************/
  5. /* Access permission definitions */
  6. #define MPU_NO_ACCESS 0x00
  7. #define MPU_PRIVILEGED_ACESS_USER_NO_ACCESS 0x01
  8. #define MPU_PRIVILEGED_RW_USER_READ_ONLY 0x02
  9. #define MPU_FULL_ACCESS 0x03
  10. #define MPU_UNPREDICTABLE 0x04
  11. #define MPU_PRIVILEGED_READ_ONLY_USER_NO_ACCESS 0x05
  12. #define MPU_READ_ONLY 0x06
  13. /* RASR bit definitions */
  14. #define MPU_RASR_REGION_SIZE(n) ((uint32_t)(n<<1))
  15. #define MPU_RASR_ACCESS_PERMISSION(n) ((uint32_t)(n<<24))
  16. int mpu_init(void)
  17. {
  18. /* Disable MPU */
  19. MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
  20. /* - Region 0: 0x00000000 - 0x0007FFFF --- on-chip non-volatile memory
  21. * + Size: 512kB
  22. * + Acess permission: full access
  23. */
  24. MPU->RNR = 0;//indicate MPU region 0
  25. MPU->RBAR = 0x00000000; // update the base address for the region 0
  26. MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS) //full access
  27. | MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_1MB) //512Kb size
  28. | MPU_REGION_ENABLE; //region enable
  29. /* - Region 1:0x20000000 - 0x20007FFF --- on chip SRAM
  30. * + Size: 32kB
  31. * + Access permission: full access
  32. */
  33. MPU->RNR = 1;
  34. MPU->RBAR = 0x20000000; // update the base address for the region 5
  35. MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
  36. | MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_256KB)
  37. | MPU_REGION_ENABLE;
  38. /* - Region 2: 0x40000000 - 0x400FFFFF --- APB peripheral
  39. * + Size: 1MB
  40. * + Access permission: full access
  41. */
  42. MPU->RNR = 2;
  43. MPU->RBAR = 0x40000000; // update the base address for the region 2
  44. MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
  45. | MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_128KB)
  46. | MPU_REGION_ENABLE;
  47. /* - Region 3: 0x20080000 - 0x200BFFFF --- AHB1 peripheral
  48. * + Size: 256KB
  49. * + AP=b011: full access
  50. */
  51. MPU->RNR = 3;
  52. MPU->RBAR = 0x40020000; // update the base address for the region 3
  53. MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
  54. | MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_512KB)
  55. | MPU_REGION_ENABLE;
  56. /* - Region 4: 0xE0000000 - 0xE00FFFFF --- System control
  57. * + Size: 1MB
  58. * + Access permission: full access
  59. */
  60. MPU->RNR = 4;
  61. MPU->RBAR = 0xE0000000; // update the base address for the region 4
  62. MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
  63. | MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_1MB)
  64. | MPU_REGION_ENABLE;
  65. /* - Region 5:0xA0000000 - 0xA2000000 --- external SDRAM
  66. * + Size: 32MB
  67. * + Access permission: full access
  68. */
  69. MPU->RNR = 6;
  70. MPU->RBAR = 0xC0000000; // update the base address for the region 6
  71. MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
  72. | MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_32MB)
  73. | MPU_REGION_ENABLE;
  74. /* Enable the memory fault exception */
  75. SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
  76. /* Enable MPU */
  77. MPU->CTRL |= MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk;
  78. return 0;
  79. }
  80. INIT_BOARD_EXPORT(mpu_init);