In welcher IDE schreibst Du das überhaupt? Sieht auf den ersten Blick
irgendwie wie eine Mischung aus Arduino und HAL.
Vorab vielleicht noch das: war das Deine Idee, den PC13 für das Toggeln
der LED zu nehmen oder ist das irgendwo original so angeschlossen und
verbaut? Mit der Timergeschichte hat das natürlich nichts zu tun, ich
erwähne das aber, weil das vom Hersteller plausibel erklärt und
untersagt wird: PC13, PC14 und PC15 sind an einen Switch gekoppelt und
man sollte diese Pins nicht für stromhungrige Aufgaben – wie z.B.
LED-Blink-Experimente – nehmen; im Anhang der entsprechende Auszug aus
dem Datenblatt. Das gilt mindestens auch für den STM32F411RE. Auf dem
Nucleo Board, wo der verbaut ist, ist an PC13 der User-Button mit einem
Pull-Up angeschlossen – das ist gerade noch so akzeptabel, weil hier
nicht viel Strom fließen kann. Schaltplanauszug auch im Anhang.
Ich benutze für die STM32 die STM32CubeIDE – lasse mir aber nur das
Minimum initialisieren und mache alles andere dann explizit auf der LL-
und Registerebene selbst, insbesondere bei den Timern weiß man dann ganz
genau, was passiert, weil man die Register selbst beeinflusst. Wenn man
den Timer richtig initialisiert, die Interruptpriorität einstellt, den
Interrupt einschaltet und den Timer startet [!], dann funktioniert es
auch wie gewünscht. Du müsstest Deinen Code selbständig debuggen und
z.B. schauen, ob die CPU überhaupt in den Tim2_IRQHandler reinspringt.
Wenn NEIN, ist etwas nicht richtig initialisiert oder eingeschaltet
worden. Wenn JA, dann ev. diese IF-Abfrage auskommentieren, aber den
Togglebefehl selbst normal stehen lassen, damit ohne IF getoggelt werden
kann und am Ende das Flag gelöscht wird. Vielleicht wird in Deinem Code,
der hier ja nicht sichtbar ist, der Clock für den Timer2 nicht
aktiviert, dann läuft dieser Timer auch nicht. Im F411RE ist das im
Register RCC_APB1ENR, in HAL müsste aber auch eine explizite Anweisung
dafür existieren, die könntest Du testweise vor dem Tim2-Init und ev.
auch danach aufrufen – das muss man sich dann im HAL-F4-Datenblatt
heraussuchen, nennt sich 'HAL and LL drivers STM32F4' (UM1725 User
Manual). Für Timer2-Start gibt es in HAL möglicherweise auch ein
Äquivalent zu meiner LL-Anweisung – muss man auch dort nachschauen.
Hinzu kommt noch, dass Deine Interruptfrequenz vermutlich so hoch
gewählt worden ist, dass man das Toggeln der LED, sofern es überhaupt
liefe, gar nicht sehen würde, sondern die LED einfach mit einer
geringeren Helligkeit leuchten würde, quasi so eine PWM angesteuert mit
50% – das ist aber nur eine Vermutung, da hier leider nicht ersichtlich
ist, mit welcher Frequenz Tim2 überhaupt getaktet wird. Also im Main das
Toggeln auskommentieren und die Tim2-Parameter ändern, um mit der
Interruptfrequenz entsprechend runterzugehen und es erstmal überhaupt
sehen und debuggen zu können. Auch Deine Reihenfolge der Befehle könnte
möglicherweise nicht richtig sein, denn die zwei NVIC-Zeilen sollten
normalerweise vor dem Tim2-Init stehen und nicht danach, aber vielleicht
ist das in HAL anders als in LL; die Clock-Enable-Anweisung in LL muss
jedenfalls auf jeden Fall zuerst erfolgen.
1 | void TIM3_IRQHandler(void)
|
2 | {
|
3 | (...)
|
4 | LL_TIM_ClearFlag_CC1(TIM3);
|
5 | }
|
6 |
|
7 | void MX_TIM3_Init(void)
|
8 | {
|
9 | (...)
|
10 |
|
11 | /* Peripheral clock enable */
|
12 | LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);
|
13 |
|
14 | (...)
|
15 |
|
16 | /* TIM3 interrupt Init */
|
17 | NVIC_SetPriority(TIM3_IRQn, 0);
|
18 | NVIC_EnableIRQ(TIM3_IRQn);
|
19 | }
|
20 |
|
21 | (...)
|
22 |
|
23 | LL_TIM_EnableCounter(TIM3); // [!] - Timer starten
|