Make a copy of the vector table and set the STM32 vector table offset to the new table. Program freezes soon after.
main.cpp@0:97bd31dcc8c2, 2015-07-25 (annotated)
- Committer:
- riaancillie
- Date:
- Sat Jul 25 20:11:51 2015 +0000
- Revision:
- 0:97bd31dcc8c2
Test vector table relocation;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
riaancillie | 0:97bd31dcc8c2 | 1 | #include "mbed.h" |
riaancillie | 0:97bd31dcc8c2 | 2 | |
riaancillie | 0:97bd31dcc8c2 | 3 | //------------------------------------ |
riaancillie | 0:97bd31dcc8c2 | 4 | // Hyperterminal configuration |
riaancillie | 0:97bd31dcc8c2 | 5 | // 115200 bauds, 8-bit data, no parity |
riaancillie | 0:97bd31dcc8c2 | 6 | //------------------------------------ |
riaancillie | 0:97bd31dcc8c2 | 7 | |
riaancillie | 0:97bd31dcc8c2 | 8 | Serial pc(SERIAL_TX, SERIAL_RX); |
riaancillie | 0:97bd31dcc8c2 | 9 | DigitalOut myled(LED1); |
riaancillie | 0:97bd31dcc8c2 | 10 | |
riaancillie | 0:97bd31dcc8c2 | 11 | extern uint32_t __Vectors[]; |
riaancillie | 0:97bd31dcc8c2 | 12 | #define VECTORTABLE_SIZE (512) |
riaancillie | 0:97bd31dcc8c2 | 13 | #define VECTORTABLE_ALIGNMENT (0x200ul) |
riaancillie | 0:97bd31dcc8c2 | 14 | uint32_t vectorTable_RAM[VECTORTABLE_SIZE] __attribute__(( aligned (VECTORTABLE_ALIGNMENT) )); |
riaancillie | 0:97bd31dcc8c2 | 15 | int j; |
riaancillie | 0:97bd31dcc8c2 | 16 | |
riaancillie | 0:97bd31dcc8c2 | 17 | int main() { |
riaancillie | 0:97bd31dcc8c2 | 18 | int i = 1; |
riaancillie | 0:97bd31dcc8c2 | 19 | pc.baud(115200); |
riaancillie | 0:97bd31dcc8c2 | 20 | pc.printf("Hello World !\r\n"); |
riaancillie | 0:97bd31dcc8c2 | 21 | |
riaancillie | 0:97bd31dcc8c2 | 22 | //Duplicate and relocate the vector table |
riaancillie | 0:97bd31dcc8c2 | 23 | for (i = 0; i < VECTORTABLE_SIZE; i++) { |
riaancillie | 0:97bd31dcc8c2 | 24 | vectorTable_RAM[i] = __Vectors[i]; /* copy vector table to RAM */ |
riaancillie | 0:97bd31dcc8c2 | 25 | } |
riaancillie | 0:97bd31dcc8c2 | 26 | __disable_irq(); |
riaancillie | 0:97bd31dcc8c2 | 27 | SCB->VTOR = (uint32_t)(&vectorTable_RAM); |
riaancillie | 0:97bd31dcc8c2 | 28 | __DSB(); |
riaancillie | 0:97bd31dcc8c2 | 29 | __enable_irq(); |
riaancillie | 0:97bd31dcc8c2 | 30 | |
riaancillie | 0:97bd31dcc8c2 | 31 | //Print 100 lines - this is where things just go wrong and the program freezes |
riaancillie | 0:97bd31dcc8c2 | 32 | for (j = 0; j <= 100; j++) |
riaancillie | 0:97bd31dcc8c2 | 33 | { |
riaancillie | 0:97bd31dcc8c2 | 34 | pc.printf("test %d\r\n", j); |
riaancillie | 0:97bd31dcc8c2 | 35 | } |
riaancillie | 0:97bd31dcc8c2 | 36 | |
riaancillie | 0:97bd31dcc8c2 | 37 | while(1) { |
riaancillie | 0:97bd31dcc8c2 | 38 | wait(1); |
riaancillie | 0:97bd31dcc8c2 | 39 | pc.printf("This program runs since %d seconds.\r\n", i++); |
riaancillie | 0:97bd31dcc8c2 | 40 | myled = !myled; |
riaancillie | 0:97bd31dcc8c2 | 41 | } |
riaancillie | 0:97bd31dcc8c2 | 42 | } |
riaancillie | 0:97bd31dcc8c2 | 43 |