Suga koubou
/
MPU_test
Memory Protection Unit
この行を変えて色々試してみてください。
mpu_config(リージョン番号, 先頭アドレス, サイズ, 読出許可, 書込許可, 実行許可, サブリージョン);
- リージョン番号:0~7
- 先頭アドレス:サイズ単位でアラインしておくこと
- サイズ:32以上、2の累乗数単位
- サブリージョン:リージョンを8分割したものを8bitで指定、ビットが立ってるサブリージョンは無視される(サイズ128以下では0固定)
main.cpp@0:b77812004bbd, 2014-10-02 (annotated)
- Committer:
- okini3939
- Date:
- Thu Oct 02 13:36:10 2014 +0000
- Revision:
- 0:b77812004bbd
1st build;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |