1

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

这个对吗?我做错了吗?请指导。

4

1 回答 1

1

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

您不必使用 RNR 寄存器,因为您可以使用 RBAR 寄存器中的 VALID 和 REGION 字段。

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

于 2017-11-14T12:38:14.780 回答