MPU不会触发皮层M4的故障

问题描述 投票:0回答:1

我想保护内存区域不被写入。我已配置MPU,但它没有产生任何故障。我要保护的区域的基地址是0x20000000。区域大小为64字节。

这是一个演示该问题的编译代码。

#define MPU_CTRL  (*((volatile unsigned long*) 0xE000ED94))
#define MPU_RNR   (*((volatile unsigned long*) 0xE000ED98))
#define MPU_RBAR  (*((volatile unsigned long*) 0xE000ED9C))
#define MPU_RASR  (*((volatile unsigned long*) 0xE000EDA0))
#define SCB_SHCSR (*((volatile unsigned long*) 0xE000ED24))

void Registers_Init(void)
{
   MPU_RNR =  0x00000000;       // using region 0
   MPU_RBAR = 0x20000000;       // base address is 0x20000000
   MPU_RASR = 0x0700110B;       // Size is 64 bytes, no sub-regions, permission=7(ro,ro), s=b=c= 0, tex=0
   MPU_CTRL = 0x00000001;       // enable MPU
   SCB_SHCSR = 0x00010000;      // enable MemManage Fault
}

void MemManage_Handler(void)
{ 
   __asm(
         "MOV R4, 0x77777777\n\t"
         "MOV R5, 0x77777777\n\t"
      );
}

int main(void)
{
    Registers_Init();

   __asm(
      "LDR R0, =0x20000000\n\t"
      "MOV R1, 0x77777777\n\t"
      "STR R1, [R0,#0]"
      );

   return (1);
}
void SystemInit(void)
{
}

因此,在main函数中,我在限制区域写入,即0x20000000,但MPU没有产生任何错误,而是调用MemManage_Handler(),而是成功写入。

memory stm32 keil cortex-m3 mpu
1个回答
0
投票

这看起来很好。确保您的硬件具有MPU。 MPU有一个名为MPU_TYPE Register的寄存器。这是一个只读寄存器,可以告诉您是否有MPU。如果MPU_TYPE寄存器中的位15:8读为0,则表示没有MPU。

在处理寄存器时永远不要使用数字。这使您和其他人很难阅读您的代码。相反,定义一些位掩码。请参阅有关如何执行此操作的教程。

© www.soinside.com 2019 - 2024. All rights reserved.