Forum: Mikrocontroller und Digitale Elektronik STM32F411VE TIM Interrupt Problem


von Aa B. (aaab)


Angehängte Dateien:

Lesenswert?

Hallo Ihr STM32 Experte,

Ich versuche den TIM2 Update Interrupt in betrieb zu nehmen. Ich habe 
die TIM peripheral clock initialisiert,  TIM konfiguriert mit Prescaler, 
ARR usw. und beim Interrupt Enable, bei dieser Setting bleibt er hängen.
1
TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE );

In dem ISR soll er ein Pin setzen, diese GPIO Clocks habe ich auch 
initialisiert. (siehe Code)

Evalboard- STM32F411VETx
Libs: Standard peripheral/CMSIS


Sysclock ist 100MHz das habe ich schon getestet.ich habe weder Linker
noch Compiler fehler bekommen, Der binary ist in Flash schon drin, bloß
läuft nicht wie erwartet.
Im Anhang ist mein code. Wäre auf euer Feedback sehr dankbar.

von Dr. Sommer (Gast)


Lesenswert?

Tim2_initstruct ist nicht definiert. Daher kompiliert dieser Code nicht.
Aus den fehlenden void's in den Funktionen folgere ich dass es C++ ist, 
dann fehlt das extern "C" an der ISR.
Das __enable_irq () fehlt.

von Aa B. (aaab)


Lesenswert?

Dr. Sommer schrieb:
> Tim2_initstruct ist nicht definiert. Daher kompiliert dieser Code nicht.
> Aus den fehlenden void's in den Funktionen folgere ich dass es C++ ist,
> dann fehlt das extern "C" an der ISR.
> Das __enable_irq () fehlt.

ist definiert in main.h, das kompiliert schon

von Dr. Sommer (Gast)


Lesenswert?

Aa B. schrieb:
> ist definiert in main.h, das kompiliert schon

Warum zeigst du die dann nicht? Globale Variablen in Header Dateien zu 
definieren resultiert in Linker Fehlern. Außerdem wird diese Variable 
nur kurz beim Starten benötigt, warum global definieren und dauerhaft 
Speicher dafür verschwenden?

Beitrag #5294198 wurde von einem Moderator gelöscht.
von Aa B. (aaab)


Angehängte Dateien:

Lesenswert?

Dr. Sommer schrieb:
> Aa B. schrieb:
>> ist definiert in main.h, das kompiliert schon
>
> Warum zeigst du die dann nicht? Globale Variablen in Header Dateien zu
> definieren resultiert in Linker Fehlern. Außerdem wird diese Variable
> nur kurz beim Starten benötigt, warum global definieren und dauerhaft
> Speicher dafür verschwenden?
Um erstmal das Ding überhaupt im betrieb zu nehmen, dafür ist egal ob 
das Globale oder lokale oder private variable sind oder, außerdem, 
speicher ist genug vorhanden. Anbei main.h, Und ich habe weder Linker 
noch Compiler fehler bekommen, Der binary ist in Flash schon drin, bloß 
läuft nicht wie erwartet.

von STM Apprentice (Gast)


Angehängte Dateien:

Lesenswert?

Hab mal den Code etwas in Ordnung gebracht. Ohne main.h ...

Er läuft auf meinem VE-Board, die IRQ Handler werden
angesprungen, ob jetzt die LEDs blinken oder nicht
hab ich jetzt nicht gecheckt (anderes Board).

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Aa B. schrieb:
> bleibt er hängen.
>

Definiere "bleibt er hängen."

Wird der ISR überhaupt aufgerufen, oder gibt es schon vorher nach dem 
Enablen einen fault? Wenn der ISR aufgerufen wird, was genau passiert? 
Kommt er nicht mehr raus, oder wird der ISR nach dem Verlassen sofort 
wieder aufgerufen (hiesse der ISR löscht die Interruptsource nicht)? Wo 
steht der PC im Fehlerfall? Oder läuft Alles möglicherweise soweit, nur 
der ISR wird nicht aufgerufen? Ist die IVT richtig aufgesetzt?

Vermutlich findest Du die Lösung selber, wenn Du Dir diese Fragen selber 
stellst...

von STM Apprentice (Gast)


Lesenswert?

Allerdings den SystTick mit 1 MHz laufen zu lassen könnte
problematisch werden da der Prozessor aus dem Interrupt
Handlen gar nicht mehr herauskommt.
1
void SysTick_Init(void)
2
{
3
  /****************************************
4
   *SystemFrequency/1000      1ms         *
5
   *SystemFrequency/100000    10us        *
6
   *SystemFrequency/1000000   1us         *
7
   *****************************************/
8
9
  //SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
10
11
  while (SysTick_Config(SystemCoreClock / 1000000) != 0)
12
  {
13
  }
14
15
}

von Aa B. (aaab)


Lesenswert?

Ruediger A. schrieb:
> Aa B. schrieb:
>> bleibt er hängen.
>>
>
> Definiere "bleibt er hängen."
>
> Wird der ISR überhaupt aufgerufen, oder gibt es schon vorher nach dem
> Enablen einen fault?
Ja, Also wenn ich diese
1
TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE );
setting weg lasse, und mein LED_DEBUG switch anschalte,kommt er in die 
while loop rein und schaltet PD13 an, ansonsten kommt er nicht mal in 
die while loop rein. das bedeutet gibt es schon vorher ein Fehler.

von Aa B. (aaab)


Lesenswert?

STM Apprentice schrieb:
> Allerdings den SystTick mit 1 MHz laufen zu lassen könnte
> problematisch werden da der Prozessor aus dem Interrupt
> Handlen gar nicht mehr herauskommt.


meinst du der Prozessor ist so lahm dass er nicht schnell genug den 
anderen ISR zu bedienen, aso.....

von Aa B. (aaab)


Lesenswert?

so jetzt läuft:

es waren zwei Dinge:

1. TIM2 Pending Bit im SR müsste resettet werden bevor Timer Interrupt 
enabled wurde

Also,
1
TIM_ClearITPendingBit (TIM2, TIM_IT_Update);
 und erst danach
1
TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE );

2. Der startup.s file der generiert wurde kannte keine
1
TIM2_IRQHandler
, also musste ich den startup.s auch anpassen, und jetzt triggert der 
IRQ jeder 1 Sekunde wie ursprünglich geplant.

von Aa B. (aaab)


Lesenswert?

STM Apprentice schrieb:
> Allerdings den SystTick mit 1 MHz laufen zu lassen könnte
> problematisch werden da der Prozessor aus dem Interrupt
> Handlen gar nicht mehr herauskommt.


hatte damit überhaupt nichts zu tun!!!!!!

von Aa B. (aaab)


Lesenswert?

Ruediger A. schrieb:
> Aa B. schrieb:
>> bleibt er hängen.
>>
>
> Definiere "bleibt er hängen."
>
> Wird der ISR überhaupt aufgerufen, oder gibt es schon vorher nach dem
> Enablen einen fault? Wenn der ISR aufgerufen wird, was genau passiert?
> Kommt er nicht mehr raus, oder wird der ISR nach dem Verlassen sofort
> wieder aufgerufen (hiesse der ISR löscht die Interruptsource nicht)? Wo
> steht der PC im Fehlerfall? Oder läuft Alles möglicherweise soweit, nur
> der ISR wird nicht aufgerufen? Ist die IVT richtig aufgesetzt?
>
> Vermutlich findest Du die Lösung selber, wenn Du Dir diese Fragen selber
> stellst...

Vielen Dank für die Hinweise. :)

von STM Apprentice (Gast)


Lesenswert?

Aa B. schrieb:
> hatte damit überhaupt nichts zu tun!!!!!!

Warum so viele Ausrufezeichen?

Klingt nach Bestrafung! Da brauch ich eigentlich nicht
weiter Tips geben oder Dinge austesten.

Dabei habe ich nur geschrieben

STM Apprentice schrieb:
> Allerdings den SystTick mit 1 MHz laufen zu lassen *könnte*
> problematisch werden

Was ich nicht (nicht!) geschrieben habe:

Das ist dein Fehler den du beheben musst.

von Aa B. (aaab)


Lesenswert?

STM Apprentice schrieb:
>
> Was ich nicht (nicht!) geschrieben habe:
>
> Das ist dein Fehler den du beheben musst.

Okay das war auch ein gute Hinweis, vielen dank dass Du das auf dein 
Target ausgetestet hast! War gar nicht als Bestrafung oder sonst was 
gemeint.
Es wundert mich dass bei Dir das geklappt hat, wahrscheinlich weil dein 
startup.s hat schon diese IRQHandler drin!

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.