mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 -> NVIC-Setup -> Vector Table


Autor: Dominik Hezel (d_hezel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Allerseits,

ich beschäftige mich mit dem STM32 (Olimex STM32-H103-Board und Ride7 
mit RLink) jetzt seit etwa zwei Wochen also bitte nicht gleich schlagen 
falls die Frage blöd ist. Ich fange mal klein an:

Was muss ich tun um das "Vector Table Offset Register (SCB_VTOR)" beim 
STM32 (F103RBT6) zu beschreiben?

Nach der Lektüre mehrerer Beispiel-Projekte und (selbstverständlich) 
aller mir verfügbarer Manuals habe ich mich mal für die Werte 0x8000000 
(für VectTab im Flash) und 0x20000000 (für VectTab im RAM) entschieden. 
So weit so gut. Aber wenn ich nun versuche im Rahmen der 
NVIC-Konfiguration diesen (oder irgendeinen anderen) Wert an die Adresse 
des Offset-Registers (0xE000ED08) zu schreiben sehe ich beim Debuggen 
mit Ride7 unter "View Symbols" immer nur 0x0.

Das "Gesamt-Problem" geht natürlich etwas weiter: ich versuche "meinen 
ersten STM32-Interrupt" ;) meines Lebens zu verarbeiten. Das läuft 
insofern auch ganz gut, als dieser Interrupt tatsächlich das "Interrupt 
Pending Register (EXTI_PR)" erreicht und auf meinen Tastendruck das 
entsprechende Bit gesetzt wird. Das war's dann aber auch erst mal!

Ich schließe daraus, dass der Interrupt bis dahin korrekt konfiguriert 
ist und lediglich der Weg zu meiner Interrupt-Verarbeitung 
("EXTI2_IRQHandler") falsch abzweigt. Und dazu fällt mir als Anfänger 
nur die Vektor-Tabelle ein.

Ich hoffe, ich habe das Problem ausreichend beschrieben so, dass es auch 
ohne Quelltext geht. Der ist leider noch nicht ganz "post-fähig". ;)

Falls jemand ein möglichst simples (z.B. eine Taste, o.Ä.) Beispiel für 
mich hat wie man von Anfang an mit allen Schritten einen Interrupt 
konfiguriert nehme ich das gerne. Vielleicht war ich nur zu blöd, das 
eine Beispiel das ich bisher gefunden habe zu kapieren.

Schon mal vielen Dank an die Helfer!

Grüße
Dominik

P.S.: Bitte bitte bitte... keine oberschlauen "RTFM!!!"- oder "SUCH' IM 
FORUM!!!"-Antworten ohne sinnvollen Inhalt (RTFM = "Read The F***ing 
Manual"). Ich mache seit 2 Tagen fast nichts anderes (peinlich genug).

Ich freue mich aber über sinnvolle Hinweise WO und in WELCHEM Manual 
oder Forum ich lesen sollte. Nichts für ungut! Dankeschön!

Autor: Doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Library gibts einige Beispiele, die Interrupts benutzen.

Mit der Tabelle usw. muss man sich eigentlich garnicht herumschlagen...
Versuchs doch erstmal auf dem "einfachem" Weg.

Autor: Plan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So sieht das im EXTI Demo der FW-Lib 2.x von ST aus:
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif

  /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  /* Enable the EXTI9_5 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

Dann der Interrupt-Aufruf:
void EXTI9_5_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_LINE_KEY_BUTTON) != RESET)
  {
    /* Toggle GPIO_LED pin 6 */
    GPIO_WriteBit(GPIO_LED, GPIO_Pin_6, (BitAction)((1-GPIO_ReadOutputDataBit(GPIO_LED, GPIO_Pin_6))));

    /* Clear the Key Button EXTI line pending bit */
    EXTI_ClearITPendingBit(EXTI_LINE_KEY_BUTTON);
  }
}

Die FW gibts hier:
http://www.st.com/mcu/devicedocs-STM32F103RB-110.html

Hier der Link direkt:
http://www.st.com/mcu/download2.php?file=stm32f10x...

Nutze die FW-Lib und Du musst Dich mit den ganzen Bits vom RM0008 nicht 
so viel herumärgern...

Autor: Dominik Hezel (d_hezel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähhhi... :) erst mal danke an Euch Beide!

Die Beispiele in der Library hatte ich bisher erfolgreich ignoriert. 
schäm Mal schauen ob ich daraus schlauer werde.

Grüße
Dominik

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/Datei:BusA...

Dort könntest du dir auch rausziehen, wie man den SysTick Timer 
konfiguriert (ist dann ein periodischer Interrupt, in dem man z.B. eine 
LED blinken lassen kann).

Autor: Frank Boe (frank_boe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Dominik Hezel (d_hezel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das schau' ich mir auch mal an. Danke!

Inzwischen habe ich auch herausgefunden, dass ich mich von Ride7 etwas 
habe verar***en lassen. Das "Vector Table Offset Register (SCB_VTOR)" 
wird zwar in der "Debug->Symbols"-Liste aufgeführt aber der Inhalt wird 
einfach nicht angezeigt. Erst wenn man das Register in eine Variable 
liest und diese beim Debuggen betrachtet, stellt man fest, dass sehr 
wohl der richtige Wert drin steht. Also liegt mein Problem wo anders. 
Aber mit den Beispielen krieg' ich das hin.

Dominik

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.