Memory Protection Unit

Dependencies:   mbed

この行を変えて色々試してみてください。

    mpu_config(リージョン番号, 先頭アドレス, サイズ, 読出許可, 書込許可, 実行許可, サブリージョン);
  • リージョン番号:0~7
  • 先頭アドレス:サイズ単位でアラインしておくこと
  • サイズ:32以上、2の累乗数単位
  • サブリージョン:リージョンを8分割したものを8bitで指定、ビットが立ってるサブリージョンは無視される(サイズ128以下では0固定)
Committer:
okini3939
Date:
Thu Oct 02 13:36:10 2014 +0000
Revision:
0:b77812004bbd
1st build;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:b77812004bbd 1 /*
okini3939 0:b77812004bbd 2 * MPU (Memory Protection Unit)
okini3939 0:b77812004bbd 3 *
okini3939 0:b77812004bbd 4 * Reference:
okini3939 0:b77812004bbd 5 * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337gj/BIHHGADD.html
okini3939 0:b77812004bbd 6 * http://www.phoenix-c.or.jp/~olfa/lpcxpresso/27_mpu.html
okini3939 0:b77812004bbd 7 */
okini3939 0:b77812004bbd 8
okini3939 0:b77812004bbd 9 #include "mbed.h"
okini3939 0:b77812004bbd 10
okini3939 0:b77812004bbd 11 DigitalOut myled(LED1);
okini3939 0:b77812004bbd 12 Serial pc(USBTX, USBRX);
okini3939 0:b77812004bbd 13
okini3939 0:b77812004bbd 14 int mpu_config (int region, void *addr, int size, bool readable, bool writable, bool executable, int sub) {
okini3939 0:b77812004bbd 15 int a, s, ap, xn;
okini3939 0:b77812004bbd 16
okini3939 0:b77812004bbd 17 for (s = 4; s < 0x20; s ++) {
okini3939 0:b77812004bbd 18 if (size == (1<<(s + 1))) break;
okini3939 0:b77812004bbd 19 }
okini3939 0:b77812004bbd 20 if (s == 0x20) error("Invalid size");
okini3939 0:b77812004bbd 21
okini3939 0:b77812004bbd 22 a = (int)addr & (0xffffffff<<(s + 1));
okini3939 0:b77812004bbd 23 if (a != (int)addr) error("Invalid addr");
okini3939 0:b77812004bbd 24
okini3939 0:b77812004bbd 25 if (size <= 128) {
okini3939 0:b77812004bbd 26 sub = 0;
okini3939 0:b77812004bbd 27 }
okini3939 0:b77812004bbd 28
okini3939 0:b77812004bbd 29 ap = 0;
okini3939 0:b77812004bbd 30 if (readable) {
okini3939 0:b77812004bbd 31 ap = writable ? 0x03 : 0x07;
okini3939 0:b77812004bbd 32 }
okini3939 0:b77812004bbd 33 xn = executable ? 0 : 1;
okini3939 0:b77812004bbd 34
okini3939 0:b77812004bbd 35 MPU->CTRL = (1<<2)|(1<<0);
okini3939 0:b77812004bbd 36 MPU->RBAR = a|(1<<4)|(region & 0x0f);
okini3939 0:b77812004bbd 37 MPU->RASR = (xn<<28)|(ap<<24)|(0x1<<19)|((sub & 0xff)<<8)|(s<<1)|(1<<0);
okini3939 0:b77812004bbd 38 return 0;
okini3939 0:b77812004bbd 39 }
okini3939 0:b77812004bbd 40
okini3939 0:b77812004bbd 41
okini3939 0:b77812004bbd 42 extern "C" {
okini3939 0:b77812004bbd 43 void HardFault_Handler () {
okini3939 0:b77812004bbd 44 error(" *** HardFault\r\n");
okini3939 0:b77812004bbd 45 }
okini3939 0:b77812004bbd 46 void MemManage_Handler () {
okini3939 0:b77812004bbd 47 error(" *** MemManage\r\n");
okini3939 0:b77812004bbd 48 }
okini3939 0:b77812004bbd 49 }
okini3939 0:b77812004bbd 50
okini3939 0:b77812004bbd 51 int main() {
okini3939 0:b77812004bbd 52 char *buf1 = (char*)0x2007c000;
okini3939 0:b77812004bbd 53 char *buf2 = (char*)0x20080000;
okini3939 0:b77812004bbd 54 int i;
okini3939 0:b77812004bbd 55 volatile int c;
okini3939 0:b77812004bbd 56
okini3939 0:b77812004bbd 57 pc.baud(115200);
okini3939 0:b77812004bbd 58 pc.printf("--- mem test\r\n");
okini3939 0:b77812004bbd 59
okini3939 0:b77812004bbd 60 if (mpu_config(0, buf1, 0x4000, true, false, false, 0x01)) return -1;
okini3939 0:b77812004bbd 61 if (mpu_config(1, buf2, 0x4000, false, false, false, 0x03)) return -1;
okini3939 0:b77812004bbd 62 SCB->SHCSR |= (1<<16); // Enable Memory Management Fault
okini3939 0:b77812004bbd 63
okini3939 0:b77812004bbd 64 pc.printf("\r\nwrite 1\r\n");
okini3939 0:b77812004bbd 65 for (i = 0; i < 0x4000; i += 1024) {
okini3939 0:b77812004bbd 66 pc.printf(" %d", i);
okini3939 0:b77812004bbd 67 c = buf1[i];
okini3939 0:b77812004bbd 68 }
okini3939 0:b77812004bbd 69
okini3939 0:b77812004bbd 70 pc.printf("\r\nread 1\r\n");
okini3939 0:b77812004bbd 71 for (i = 0; i < 0x4000; i += 1024) {
okini3939 0:b77812004bbd 72 pc.printf(" %d", i);
okini3939 0:b77812004bbd 73 buf1[i] = c;
okini3939 0:b77812004bbd 74 }
okini3939 0:b77812004bbd 75
okini3939 0:b77812004bbd 76 pc.printf("\r\nwrite 2\r\n");
okini3939 0:b77812004bbd 77 for (i = 0; i < 0x4000; i += 1024) {
okini3939 0:b77812004bbd 78 pc.printf(" %d", i);
okini3939 0:b77812004bbd 79 c = buf2[i];
okini3939 0:b77812004bbd 80 }
okini3939 0:b77812004bbd 81
okini3939 0:b77812004bbd 82 pc.printf("\r\nread 2\r\n");
okini3939 0:b77812004bbd 83 for (i = 0; i < 0x4000; i += 1024) {
okini3939 0:b77812004bbd 84 pc.printf(" %d", i);
okini3939 0:b77812004bbd 85 buf2[i] = c;
okini3939 0:b77812004bbd 86 }
okini3939 0:b77812004bbd 87 }