STM32 + TrueStudio + breakpoint

Gast #2451069
Lesenswert?

Hallo,

ich programmiere mit Atollic TrueStudio Lite auf STM32F103 über ST-Link. 
Zur Zeit hat mein Programm 2 Interrupts:
- TIM2
- USART2 (für Kommunikation mit XPort)

Wenn ich von Laptop über LAN ein Byte an µC schicke, kommt es nicht an. 
Setze ich aber ein Breakpoint in USART2_IRQHandler, dann wird diese 
Nachricht bearbeitet.

Woran liegt es? Und wie kann es behoben werden?
Ist es ein Bug in der Atollic TrueStudio? Oder kriegen sich die 
Interrupts in die Wolle?

Danke im voraus, Minti
Gast #2451083
Lesenswert?

>Zur Zeit hat mein Programm 2 Interrupts:
>- TIM2
>- USART2 (für Kommunikation mit XPort)

TIM2 hat nicht zufällig eine höhere Priorität
als der USART2?

Löschst du das Interruptflag bei TIM2 auch?
Beispiel:

 TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
Gast #2451132
Lesenswert?

Hi holger,

hier sind NVIC_InitStructures
1
// Enable the TIM2 global Interrupt
2
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
3
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
4
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
5
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
6

7
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
8
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0; //1;
9
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; //1;
10
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
11
    NVIC_Init(&NVIC_InitStructure);

>Löschst du das Interruptflag bei TIM2 auch?
ja

Kann es daran liegen, dass die Bearbeitung von Interrupt von TIM2 lange 
dauert, so dass in dieser Zeit 2. Interrupt von TIM2 sofort dran ist und 
so USART gar nicht dran kommt?
(Firma: EleLa - www.elela.de) #2451148
Lesenswert?

Das Ändern der Sub-Priority bring rein gar nichts.

Wenn ein wichtiger Interrupt einen unwichtigen unterbrechen können soll, 
dann muss der wichtige eine höhere PreemptionPriority haben (kleinere 
Zahl!).

Mit:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
hat man für die PreemptionPriority 2 Bits und SubPriority auch zwei.

Dann können als PreemptionPriority 0..3 eingestellt werden.
Der wichtige bekommt 0, der unwichtige 1. Somit kann der wichtige den 
anderen Interrupt unterbrechen.
Gast #2451172
Lesenswert?

Hallo Markus Müller,

wenn ich dich richtig verstanden habe, dann haben beide Interrputs 
gleiche Prio und somit unterbrechen sie sich nicht, sondern einer wartet 
auf den anderen und wird danach ausgeführt. Richtig?

Aber das erklärt nicht, warum in "normalen Modus" die Nachricht nicht 
ankommt. Denn dann würde USART nach TIM2 ausgeführt und die Nachrit 
würde bearbeitet werden. Oder verstehe ich was falsch?

Und warum funktioniert es, wenn ich breakpoint in Debug setze?
(Firma: EleLa - www.elela.de) #2451209
Lesenswert?

> Richtig?
Ja.

Man sollte eine Zähler-Variable im Main-Loop drin haben. und sich jede 
Sekunde die Differenz merken.
Immer wenn dieser Zähler nur wenig hoch zählt hat man irgendwo ein 
"Hänger" programmiert.
Somit kannst Du einzelne Teile nacheinander auskommentieren und dann 
sehen wo es klemmt.

Ansonsten kann sicher niemand sinnvoll helfen, bei diesen wenigen 
Codezipfel die wir bisher sehen durften.
Gast #2451222
Lesenswert?

>Schalte TIM2 doch einfach mal ab. Ist das Problem dann weg?
Ich kann jetzt nicht testen, aber was würde bedeuten, wenn das Problem 
weg wäre? Dauert die Bearbeitung von der Interruptroutine zu lange?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren