Cortex-M3 MPU を使用して、意図しないアクセスからメモリを保護したい。この目的のために、MPU を構成しました。しかし、例外はまったくありませんでした。その他の例外として、BusFault、HardFault は適切な「不良コード」で強制されています。
現在の初期化は
MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; // disable MPU
MPU->RNR = 0
MPU->RBAR = 0x20000000;
MPU->RASR = 0x03000019; // 0x03UL << (MPU_RASR_ATTRS_Pos+8) | (0x19UL << 0);
MPU->RNR = 1;
MPU->RBAR = 0x8000000; // read back as 0x8000001
MPU->RASR = 0x03000027; // 0x03UL << (MPU_RASR_ATTRS_Pos+8) | (0x27UL << 0);
MPU->RNR = 2;
MPU->RBAR = 0x40000000; // read back as 0x40000002
MPU->RASR = 0x13000039; // 0x13UL << (MPU_RASR_ATTRS_Pos+8) | (0x39UL << 0);
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; // Enable the memory fault exception
MPU->CTRL |= MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk; // Enable MPU
今まで、すべてのメモリにアクセスできました。ここで、リージョンを保護するためにリージョンを追加します。
MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; // disable MPU
MPU->RNR = 3;
MPU->RBAR = 0x20002000; // read back as 0x20002003
MPU->RASR = 0x00000009; // 0x00UL << (MPU_RASR_ATTRS_Pos+8) | (0x09UL << 0);
MPU->CTRL |= MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk; // re-enable MPU
領域番号 3 は、他のすべての MPU 領域を非表示にする必要があります。これで、0x20002000 のメモリにアクセスできなくなり、読み取りも書き込みもできなくなります。ただし、このアドレスでメモリを読み書きすることもできます。
NXP LPC1788 CPU のメモリ保護を阻害するものは何ですか?