NVIC Zugriff -> Hard Fault

Gast #1989334
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
Angehängte Dateien:
Gast #1989376
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
Gast #1989457
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
Gast #1989647
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
Gast #1989703
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.