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


von Dominik H. (d_hezel)


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!

von Doc (Gast)


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.

von Plan (Gast)


Lesenswert?

So sieht das im EXTI Demo der FW-Lib 2.x von ST aus:
1
void NVIC_Configuration(void)
2
{
3
  NVIC_InitTypeDef NVIC_InitStructure;
4
  
5
#ifdef  VECT_TAB_RAM  
6
  /* Set the Vector Table base location at 0x20000000 */ 
7
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
8
#else  /* VECT_TAB_FLASH  */
9
  /* Set the Vector Table base location at 0x08000000 */ 
10
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
11
#endif
12
13
  /* Configure one bit for preemption priority */
14
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
15
  
16
  /* Enable the EXTI9_5 Interrupt */
17
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
18
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
19
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
20
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
21
  NVIC_Init(&NVIC_InitStructure);
22
}

Dann der Interrupt-Aufruf:
1
void EXTI9_5_IRQHandler(void)
2
{
3
  if(EXTI_GetITStatus(EXTI_LINE_KEY_BUTTON) != RESET)
4
  {
5
    /* Toggle GPIO_LED pin 6 */
6
    GPIO_WriteBit(GPIO_LED, GPIO_Pin_6, (BitAction)((1-GPIO_ReadOutputDataBit(GPIO_LED, GPIO_Pin_6))));
7
8
    /* Clear the Key Button EXTI line pending bit */
9
    EXTI_ClearITPendingBit(EXTI_LINE_KEY_BUTTON);
10
  }
11
}

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_fw_archive.zip&info=STM32F103RB%20Firmware%20&url=http://www.st.com/stonline/products/support/micro/files/stm32f10x_fw_archive.zip

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

von Dominik H. (d_hezel)


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

von Alex (Gast)


Lesenswert?

http://www.mikrocontroller.net/articles/Datei:BusAnalyzer.zip

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).

von Frank B. (frank_boe)


Lesenswert?


von Dominik H. (d_hezel)


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

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.