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!
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.
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...
Ä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
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.