Hi,
here is example to use MPU for protecting vector table against write access after it has been relocated to ram
extern int __vectortableram_start;
void SetupMpu(void)
{
#define MPU_RGN_NUMBER_VT 3 // region number and priority
#define MPU_RGN_SIZE_VT 8 // 512B =2^(8+1)
#define AP_VT 6 // access parameters r/r
#define MPU_RBAR_VALUE_VT ((uint32_t)__vectortableram_start)
#define MPU_RASR_VALUE_VT ((((uint32_t)MPU_RGN_SIZE_VT << PPB_MPU_RASR_SIZE_Pos) & PPB_MPU_RASR_SIZE_Msk) | \
((uint32_t)PPB_MPU_RASR_S_Msk) | \
((uint32_t)PPB_MPU_RASR_C_Msk) | \
(((uint32_t)AP_VT << PPB_MPU_RASR_AP_Pos) & PPB_MPU_RASR_AP_Msk) | \
((uint32_t)PPB_MPU_RASR_ENABLE_Msk))
// setup region address and region access parameters for VT
PPB->MPU_RNR = MPU_RGN_NUMBER_VT;
PPB->MPU_RBAR = MPU_RBAR_VALUE_VT;
PPB->MPU_RASR = MPU_RASR_VALUE_VT;
// enable MPU
PPB->MPU_CTRL = (uint32_t)(PPB_MPU_CTRL_ENABLE_Msk | PPB_MPU_CTRL_PRIVDEFENA_Msk);
__DSB();
__ISB();
}
write access will trigger exception memfault if installed.
rum
here is example to use MPU for protecting vector table against write access after it has been relocated to ram
extern int __vectortableram_start;
void SetupMpu(void)
{
#define MPU_RGN_NUMBER_VT 3 // region number and priority
#define MPU_RGN_SIZE_VT 8 // 512B =2^(8+1)
#define AP_VT 6 // access parameters r/r
#define MPU_RBAR_VALUE_VT ((uint32_t)__vectortableram_start)
#define MPU_RASR_VALUE_VT ((((uint32_t)MPU_RGN_SIZE_VT << PPB_MPU_RASR_SIZE_Pos) & PPB_MPU_RASR_SIZE_Msk) | \
((uint32_t)PPB_MPU_RASR_S_Msk) | \
((uint32_t)PPB_MPU_RASR_C_Msk) | \
(((uint32_t)AP_VT << PPB_MPU_RASR_AP_Pos) & PPB_MPU_RASR_AP_Msk) | \
((uint32_t)PPB_MPU_RASR_ENABLE_Msk))
// setup region address and region access parameters for VT
PPB->MPU_RNR = MPU_RGN_NUMBER_VT;
PPB->MPU_RBAR = MPU_RBAR_VALUE_VT;
PPB->MPU_RASR = MPU_RASR_VALUE_VT;
// enable MPU
PPB->MPU_CTRL = (uint32_t)(PPB_MPU_CTRL_ENABLE_Msk | PPB_MPU_CTRL_PRIVDEFENA_Msk);
__DSB();
__ISB();
}
write access will trigger exception memfault if installed.
rum