如何在cortex m4中配置MPU寄存器?

如何在cortex m4中配置MPU寄存器?,c,memory-management,cortex-m,cortex-m3,mpu,C,Memory Management,Cortex M,Cortex M3,Mpu,我想向内存区域添加一个保护,从0x20000000开始。该区域的大小为64字节。权限为只读,除xn外未设置任何标志。我想应该是这样的 #define MPU_CTRL (*((volatile unsigned long*) 0xE000ED94)) // MPU Control register #define MPU_RNR (*((volatile unsigned long*) 0xE000ED98)) // MPU Region Numbe

我想向内存区域添加一个保护,从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;
}

这是正确的吗?我做错了吗?请指导。

是,这看起来对配置区域是正确的。但是,您已禁用所有子区域,这意味着您将无法访问此内存块。子区域禁用位应为0(启用)。您还将特权和非特权设置为只读

您不必使用RNR寄存器,因为您可以使用RBAR寄存器中的有效和区域字段


如果在任何时候您更改为非特权模式,您将无法访问代码或数据存储器(区域中定义的除外),因此您将遇到MPU故障。如果您还没有并且可能还没有定义一个只读区域来允许访问所有闪存,我建议您添加一个MPU故障处理程序(尽管您已经拥有通过后台区域的特权访问)。

处理寄存器时,切勿使用“幻数”。没有人,包括你自己,知道这个数字意味着什么。你强迫人们阅读你的代码,1)在他们的头脑中将十六进制转换为二进制,以确定设置了哪些位,2)始终保持手动打开状态。而是定义一些位掩码。正确的C代码看起来像
MPU\uxyz=MPU\u THIS | MPU\u THAT其中
MPU\u此
etc是位掩码。