Hallo!
Ich versuche gerade einen eigenen Handler für die diversen Exceptions
des CortexM3 zu schreiben. Es geht darum eine Art Bluescreen über die
Serielle auszugeben, wenn eine Exception oder ein nicht definierter
Interrupt auftritt.
Es gibt dazu ein paar Codebeispiele, die jedoch scheinbar nur dann
funktionieren, wenn ein RTOS im Hintergrund läuft. Das ist bei mir nicht
der Fall.
Das Problem ist, dass mein Handler funktioniert, wenn ich per
gdb/insight verbunden bin. Lasse ich das Programm so laufen, fällt die
CPU immer in STOP mit Hardfault statt meinen Handler aufzurufen.
Ich habe die Doku (STM32F10x PM0056.pdf) so verstanden, dass man die
entsprechenden Register nur im Privileged Mode setzen darf. Im Exception
Handler wird wohl auch der PSP Stack Pinter verwendet, statt dem MSP.
Also habe ich die Initialisierung so durchgeführt:
1 | /* Set privileged mode */
|
2 | __set_PSP((uint32_t)&_pspstack_end);
|
3 | __set_CONTROL(0x0);
|
4 | SCB->SHCSR |= (SCB_SHCSR_MEMFAULTENA|SCB_SHCSR_BUSFAULTENA|SCB_SHCSR_USGFAULTENA);
|
5 | /* Set back Thread mode */
|
6 | __set_CONTROL(0x1);
|
Es ist aber weiterhin so, dass im SHCSR statt der erhofften 0x00070000
nur 0x00020000 steht.
Starte ich das ganze bei laufendem Debugger, funktioniert es prächtig.
Irgendeine Idee?
Gruß, Ulrich