Hallo, ich versuche es zu beschreiben, nicht ganz einfach. Aber vielleicht kennt das ja jemand. Debugging der Anwendung soweit alles prima.... bis der UC Daten empfängt von einem 2.4Ghz Modul. Die werden von einem INT Pin getriggert und dann per SPI abgeholt und einsortiert. Sobald die alle da sind lässt sich kein Break Point mehr in der Hauptschleife setzen, sehr wohl aber in allen Interrupt Routinen und das sind einige. Versuche ich per Einzelschritt da raus zu steppen verschwindet der gelbe Pfeil einfach, als wenn ich "Run" gedrückt hätte. Erst ein neuer BP in einer INT Routine bringt ihn wieder. Auch auf dem Stack findet sich kein Main() mehr. Ok, dachte ich, ist vielleicht nur im Debugger so. Also Release Version geflashed und eine LED blinken lassen in der Hauptschleife. Aber auch da bleibt die Anwendung nach Datenmpfang einfach stecken. Nur noch die Ints laufen, 3 Timer Ints und ein ADC / DMA Int. Es ist kein HardFault und es läuft auch nichts über im Datenbereich. Die gleiche Anwendung läuft nämlich etwas modifiziert schon auf einer anderen Platine. Der Empfangsteil für daten ist exakt der Gleiche. Wo soll ich bloss suchen? Gruss, Christian
Christian J. schrieb: > Sobald die alle da sind lässt sich > kein Break Point mehr in der Hauptschleife setzen, sehr wohl aber in > allen Interrupt Routinen und das sind einige. Dann hätte ich die Vermutung dass Du irgendwo ein Interrupt Flag vergessen hast zurückzusetzen. Der Prozessor ist ein Cortex-M3, solange da ein Interrupt pending ist, geht es von einem Handler via Tail-Chain zum nächsten (oder demselben). Anders als bei z.B. AVR müssen da die Interrupt Flags i.d.R. direkt im Peripheiral zurück gesetzt werden.
Jim M. schrieb: > Anders als bei z.B. AVR müssen da die Interrupt Flags i.d.R. direkt im > Peripheiral zurück gesetzt werden. Ja, in diesem Fall muss sogar doppelt gemoppelt werden Interrupt Flag im STM und Interrupt Flag im NRF24. Wobei der NRF24 zuerst bedient werden muss sonst schlägt der Interrupt gleicht wieder zu und der STM kann sich nicht retten vor Interrupt-Arbeit.
Ok..... immer wieder was Neues :-) Könnt ihr mal gucken, wo das sein könnte? Ich bin da noch etwas Anfänger..... habe mal alles dran gepappt wo INT drin ist.
Christian J. schrieb: > Könnt ihr mal gucken, wo das sein könnte? Nichts neues, genau das was ich schon geschrieben habe. Wenn ein Interrupt auftritt, lese das Status-Register des NRF24, erkenne die Interrupt-Ursache und setze das entsprechende IRQ-Flag im Status-Register des NRF24 zurück. Dann lösche das IRQ-Flag im STM32.
Arduinoquäler schrieb: > Nichts neues, genau das was ich schon geschrieben habe. Der Cortex hängt sich auf, NICHT der NRF24! Mit dem ist alles ok. Das wird alles richtig gehandelt bei dem.
Christian J. schrieb: > Der Cortex hängt sich auf, NICHT der NRF24! Mit dem ist alles ok. Dann hast du es nicht verstanden. Arduinoquäler schrieb: > Wobei der NRF24 zuerst bedient werden muss sonst schlägt > der Interrupt gleicht wieder zu und der STM kann sich > nicht retten vor Interrupt-Arbeit.
Arduinoquäler schrieb: > Dann hast du es nicht verstanden. Oder Du vielleicht nicht? Spielt bei einem flankengetriggerten INT nämlich keine Rolle wie lange der Pin down ist. Ist alles in Ordnung damit, das ist nicht die Ursache.
Christian J. schrieb: > Oder Du vielleicht nicht? Spielt bei einem flankengetriggerten INT > nämlich keine Rolle wie lange der Pin down ist. Und wie soll ich riechen dass deine Interrupt-Programmierung flankengetriggert ist?
Arduinoquäler schrieb: > Und wie soll ich riechen dass deine Interrupt-Programmierung > flankengetriggert ist? Indem man nachguckt? ... trotzdem hatr es irgendwas damit zu tun, nur nicht an dieser Stelle..
1 | // Line einem Port und Pin zuordnen, hier Port A, Pin 2 = PA2
|
2 | GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2); |
3 | |
4 | /* Line 2 der External IRQs 2 konfigurieren */
|
5 | EXTI_InitStruct.EXTI_Line = IRQ_LINE; /* PA2 ist verbunden mit EXTI_Line2 */ |
6 | EXTI_InitStruct.EXTI_LineCmd = ENABLE; /* Enable interrupt */ |
7 | EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; /* Interrupt mode */ |
8 | EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; /* Trigger auf fallende Flanke */ |
9 | EXTI_Init(&EXTI_InitStruct); /* Aktivieren und zu EXTI hinzufügen */ |
10 | |
11 | /* NVIC einbinden: PA2 ist auf EXTI_Line1 und hat den Vector EXT2_IRQn */
|
12 | NVIC_InitStruct.NVIC_IRQChannel = IRQ_HDL; |
13 | NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 15; /* Höchste Priorität */ |
14 | NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; /* Sub Priorität */ |
15 | NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; /* Enable Interrupt */ |
16 | NVIC_Init(&NVIC_InitStruct); /* Zum NVIC hinzufügen */ |
17 | |
18 | NVIC_EnableIRQ(IRQ_HDL); /* Interrupt ein */ |
Glaube ich habe es.... der RTC Handler wird dauernd aufgerufen, der Pfeil ist sofort wieder auf dem Break, dabei soll der nur alle 1s aufgerufen werden. Gibt da zwei Routinen, die sehr ähnlich sind: RTC_ClearITPendingBit(RTC_FLAG_SEC); RTC_ClearFlag(RTC_FLAG_SEC); void RTC_IRQHandler(void) { #define MEZ +1 struct tm *ptr; // Zeiger auf Zeit Strktur time_t value; // 32 Bit Unixzeit if (RTC_GetITStatus(RTC_IT_SEC) != RESET) { /* Unixzeit aus RTC lesen */ RTC_WaitForSynchro(); value = (time_t)RTC_GetCounter();
Erklär mir einer das mal: PWR_BackupAccessCmd(ENABLE); RTC_WaitForLastTask(); RTC_SetCounter(0); PWR_BackupAccessCmd(DISABLE); schafft es, dass die RTC ihren Sekunden Interrupt andauernd ausführt, so dass das ganze System blockiert ist. Dabei steht der Wert anschliesend im Register drin. EDIT: Oh Mann! Auf den Schlitten muss ja erst mal einer kommen, dass RTC_Setcounter auch den Prescaler zurücksetzt, so dass die Uhr andauernd INTs auslöst. Mannomann......
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.