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