Forum: Mikrocontroller und Digitale Elektronik EmBitz Debugging Problem mit STM32F103


von Christian J. (Gast)


Lesenswert?

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

von Jim M. (turboj)


Lesenswert?

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.

von Arduinoquäler (Gast)


Lesenswert?

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.

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Arduinoquäler (Gast)


Lesenswert?

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.

von Christian J. (Gast)


Lesenswert?

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.

von Arduinoquäler (Gast)


Lesenswert?

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.

von Christian J. (Gast)


Lesenswert?

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.

von Arduinoquäler (Gast)


Lesenswert?

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?

von Christian J. (Gast)


Lesenswert?

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 */

von Christian J. (Gast)


Lesenswert?

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();

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.