STM32F411VE TIM Interrupt Problem

OP #5294186
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.
Angehängte Dateien:
Gast #5294187
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.
Gast #5294196
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.
OP #5294201
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.
Angehängte Dateien:
(Firma: keine) #5294207
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...
Gast #5294211
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
}
OP #5294212
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.
OP #5294502
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.
OP #5294511
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. :)
Gast #5294564
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.
OP #5294584
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!

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