CortexM3 Hardfault Handler

OP (Firma: DC3AX) #1950524
Lesenswert?

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
Persönliche Seite #1950724
Lesenswert?

Ulrich P. schrieb:
> Im Exception Handler wird wohl auch der PSP Stack Pinter verwendet,
> statt dem MSP.

Das geht nicht. Exception Handler verwenden immer den MSP.

> Also habe ich die Initialisierung so durchgeführt:

Wo befindest Du Dich denn während der Code ausgeführt wird?
1
     __set_CONTROL(0x0);

Dieses Kommando ändert das CONTROL Register ohnehin nur, wenn Du
bereits privilegiert bist. Du kannst damit keine Privilegien erlangen.

Es ist übrigens keine gute Idee, mit dem selben Problem in
verschiedenen Threads anzukommen.

Viel Erfolg
Marcus

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren