我想从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 :(得分:1)
是的,配置区域看起来是正确的。但是,您已禁用所有子区域,这意味着您将无法访问此内存块。子区域禁用位应为0(启用)。您还设置了特权和非特权只读。
您不必使用RNR寄存器,因为您可以使用RBAR寄存器中的VALID和REGION字段。
如果您在任何时候更改为非特权模式,您将无法访问您的代码或数据存储器(除了该区域中定义的内容之外),因此您将获得MPU故障。我建议你添加一个MPU错误处理程序,如果你还没有并且可能定义一个只读区域来允许访问所有的flash(尽管你已经通过后台区域进行了特权访问)。