Forum: Mikrocontroller und Digitale Elektronik NVIC Zugriff -> Hard Fault


von U. E. (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
ich möchte (illustriert auch durch andere Threads) CAN auf dem STM32 zum 
Laufen bringen.
Aktuell nimmt mir der STM32F103RE aber jeden Zugriff auf die Register 
des NVIC sehr übel, wenn der zugehörige Interrupt aktiviert werden soll.
Genauer: Es geht um die Anweisungen:
1
   NVIC->IPR[4] |= 0x10000000;
2
   NVIC->ISER[0] |= (1 << (USB_HP_CAN_TX_IRQChannel  & 0x1F));

Beim Ausführen der ersten Zeile springt er in den Hard Fault. Wenn ich 
die Zeile spaßeshalber auskommentierte, passiert das gleiche beim 
nachfolgenden Statement (geprüft in Keil uvision).
Beim Assembler-Code kann auch sehen, daß erst der Lesezugriff auf das 
NVIC-Register das Problem auslöst. Das Attachment zeigt die Situation 
vor dem Auftreten des Hard Faults,  d.h. der Zugriff
1
0x08001C72 F8D00310  LDR      r0,[r0,#0x310]
löst den Fehler aus.

Was fehlt hier? Muß ich den NVIC (siehe 2. Attachment) vorher noch in 
anderer Form "vorbereiten"?
Grüße
schnack

von Torfkopp (Gast)


Lesenswert?

Geraten: Möglicherweise ist die CPU nicht in einem Privilege Mode, der
den Zugriff auf den NVIC erlaubt...

von U. E. (Gast)


Lesenswert?

Hi,
hm. Das könnte sein - bis eben war mir (peinlich) nicht bewußt, daß es 
hier überhaupt 2 Modi gibt.
Ich habe jetzt nachgelesen, daß es dafür ein eigenes Control-Register 
gibt (Bit 0 auf 0 setzen -> privileged mode).
Wie kann ich das Register lesen oder schreiben (Assembler-Anweisung 
notwendig)?
Grüße
schnack

von Torfkopp (Gast)


Lesenswert?

Hallo,

www.arm.com: Cortex™-M3 Technical Reference Manual, ARM-V7 arch ref 
manuals
www.st.com:  RM0008 Reference manual.
Zusammen mehr als 2000 Seiten.

Vorlesen werd´ ich Dir´s aber nicht...


Für Registerzugriffe ist kein Assembler notwendig. ARM behauptet
sogar, dass man bei Cortex komplett auf ASM verzichten könne.
Die (Nicht-CPU) Register haben sämtlich eine Adresse, so dass
sie wie eine Speicherzelle zugreifbar sind.


Hdh,

Torfkopp

von U. E. (Gast)


Lesenswert?

Hi,
und danke!

Ergebnis:
1
x = __get_CONTROL(); // Read the current value of CONTROL
2
__set_CONTROL(x); // Set the CONTROL value to x
.. wobei das auch nur geht, wenn man im privileged mode bereits ist...
Grüße
schnack

von Torfkopp (Gast)


Lesenswert?

ausserdem gibts von ST die STM32 Std Peripherals Lib
und von ARM die CMSIS Lib, die u.a Register-Adressen und
Zugriffsfunktionen definieren.

>.. wobei das auch nur geht, wenn man im privileged mode bereits ist...

Das gilt aber sicher nicht für alle Peripherieregister.

Was lässt Du da überhaupt für Software laufen?
Direkt nach dem Reset ist die CPU nämlich im priv Mode (heisst bei
Cortex WIMRE Handler-Mode)
und wird erst durch die SW in den nicht-privilegierten (Thread-) Mode
geschaltet, wobei das nicht zwingend notwendig ist.
In den Handler-Mode kommt man dann durch einen Interrupt (entweder HW 
oder
SW-Interrupt.

Aber lies´ erstmal die 2000 Seiten. Dann hast Du sowieso keine Fragen 
mehr ;-).

Hdh,

Torfkopp

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.