Arm 在Atmel SAMD51上配置内存保护单元

Arm 在Atmel SAMD51上配置内存保护单元,arm,cortex-m,Arm,Cortex M,我正在尝试配置SAMD51(Cortex-M4)的MPU,以保护1k闪存不受任何访问,以及1k SRAM不受写入访问,因为写入访问中包含的敏感信息永远不会被访问或损坏(来自软件错误或任何其他方式) 我希望保护这些部分,即使是在特权模式下(软件没有RTO,将始终处于特权模式) 由于代码将以特权模式运行,我使用MPU\u CTRL\u privedefea\u Msk标志,只希望覆盖我的两个区域的访问权限 我已检查了这些路段的线形要求: 区域0(闪烁)@0x0001d400(1k对齐) 区域1(S

我正在尝试配置SAMD51(Cortex-M4)的MPU,以保护1k闪存不受任何访问,以及1k SRAM不受写入访问,因为写入访问中包含的敏感信息永远不会被访问或损坏(来自软件错误或任何其他方式)

我希望保护这些部分,即使是在特权模式下(软件没有RTO,将始终处于特权模式)

由于代码将以特权模式运行,我使用
MPU\u CTRL\u privedefea\u Msk
标志,只希望覆盖我的两个区域的访问权限

我已检查了这些路段的线形要求:

  • 区域0(闪烁)@
    0x0001d400
    (1k对齐)
  • 区域1(SRAM中)@
    0x20000000
    (1k对齐)
以下是配置MPU的我的代码:

__disable_irq();

//
// Region0
//
__DSB();
__ISB();
MPU->RNR = 0;
MPU->RBAR = (0x0001d400 << MPU_RBAR_ADDR_Pos);
// 1k size - log2(1k) = 10
MPU->RASR  = ((10 - 1) << MPU_RASR_SIZE_Pos); 
// Normal; Not shareable; Cacheable; Inner Write back; no write allocate
MPU->RASR |= ((0x4 << MPU_RASR_TEX_Pos) | (1 << MPU_RASR_C_Pos) | (1 << MPU_RASR_B_Pos)); 
// No priviledged or unpriviledge access
MPU->RASR |= (0UL << MPU_RASR_AP_Pos);
// Enable
MPU->RASR |= 1UL;

//
// Section 1
//
__DSB();
__ISB();
MPU->RNR = 1;
MPU->RBAR = (0x20000000 << MPU_RBAR_ADDR_Pos);
// 1k size - log2(1k) = 10
MPU->RASR  = ((10 - 1) << MPU_RASR_SIZE_Pos); 
// Normal; Not shareable; Cacheable; Inner Write back; no write allocate
MPU->RASR |= ((0x4 << MPU_RASR_TEX_Pos) | (1 << MPU_RASR_C_Pos) | (1 << MPU_RASR_B_Pos)); 
// Read-Only Priviledged or unpriviledge access
MPU->RASR |= (6UL << MPU_RASR_AP_Pos);
// Enable
MPU->RASR |= 1UL;

// Enable MPU
MPU->CTRL = MPU_CTRL_ENABLE_Msk | MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk;
// Enable MemFault handler
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
__DSB();
__ISB();
__enable_irq();
禁用irq();
//
//区域0
//
__DSB();
__ISB();
MPU->RNR=0;
MPU->RBAR=(0x0001d400 RASR=((10-1)RASR=(0x4 RBAR=(0x20000000 RASR=((10-1)RASR=)((0x4 SHCSR=)SCB_SHCSR_MEMFAULTENA_Msk;
__DSB();
__ISB();
__启用_irq();
在访问已配置的区域时,配置似乎被忽略,并且从不生成故障

我已经阅读了很多次ARM文档,看不出有什么问题

  • 我的密码有错误吗
  • SAMD51的高速缓存/内存配置是否错误
  • 我想做的事情是不是在特权模式下无法实现

谢谢您的帮助!

您的代码中有一些明显的问题。 有关位字段,请参阅此:

从一开始: 1:你为什么在这里移动基址

MPU->RBAR = (0x0001d400 << MPU_RBAR_ADDR_Pos);
2:此行无效。因为在设置大小时,此字段已设置为零,而且也不正确。要清除位,我们使用&operation not |

MPU->RASR |= (0UL << MPU_RASR_AP_Pos);

MPU->RASR |=(0UL您的代码中有一些明显的问题。
有关位字段,请参阅此:

从一开始: 1:你为什么在这里移动基址

MPU->RBAR = (0x0001d400 << MPU_RBAR_ADDR_Pos);
2:此行无效。因为在设置大小时,此字段已设置为零,而且也不正确。要清除位,我们使用&operation not |

MPU->RASR |= (0UL << MPU_RASR_AP_Pos);
MPU->RASR=(0UL 1.我将此用作参考,并误解了RBAR配置。谢谢,这显然是问题所在…移位将截断地址。2.虽然没有效果,但这不是问题,因为RASR受上面两行的影响,然后被OR。无论如何…3.事实上,在我的情况下设置XN更安全。1.我将此用作参考,并误解了RBAR配置。谢谢,这显然是问题所在…移位会截断地址。2.虽然没有效果,但这不是问题,因为RASR受上面两行的影响,然后是OR。总之…3.事实上,在我的情况下,设置XN更安全。