Как настроить регистры MPU в Cortex M4?
Я хочу добавить защиту в область памяти, начиная с 0x20000000. Размер области составляет 64 байта. Разрешение только для чтения, флаг не установлен, кроме xn. Вот как я думаю, что это должно быть,
#define MPU_CTRL (*((volatile unsigned long*) 0xE000ED94)) // MPU Control register
#define MPU_RNR (*((volatile unsigned long*) 0xE000ED98)) // MPU Region Number register
#define MPU_RBAR (*((volatile unsigned long*) 0xE000ED9C)) // MPU Region Base Address Register
#define MPU_RASR (*((volatile unsigned long*) 0xE000EDA0)) // MPU Region attributes and size register
void Registers_Init(void)
{
//MPU Configuring
MPU_RNR = 0x00000000; // use region 0
MPU_RBAR = 0x20000000; // base address is 0x20000000
MPU_RASR = 0x1608FF0B; // enable bit=1, 64 bytes,not subregions, s=c=b=0, xn=1, permission= ro/ro.
MPU_CTRL = 0x00000005; // enable memory protection unit,guaranteeing default priviliged access
}
int main()
{
Registers_Init();
return 0;
}
Это правильно? Я делаю это неправильно? Пожалуйста, руководство.
1 ответ
Да, это выглядит правильно для настройки региона. Однако вы отключили все субрегионы, что означает, что у вас не будет доступа к этому блоку памяти. Биты отключения субрегиона должны быть 0 (включены). Вы также установили привилегированное и непривилегированное только для чтения.
Вам не нужно использовать регистр RNR, поскольку вместо этого вы можете использовать поля VALID и REGION в регистре RBAR.
Если в любой момент вы перейдете в непривилегированный режим, у вас не будет доступа к вашему коду или памяти данных (кроме той, что определена в регионе), поэтому вы получите ошибку MPU. Я бы предложил добавить обработчик ошибок MPU, если вы еще этого не сделали, и, возможно, определите область только для чтения, чтобы разрешить доступ ко всем флеш-накопителям (хотя у вас уже есть привилегированный доступ через фоновую область).