Holger schrieb:
> Wieso brauch ich einen Delay bevor ich was in das ARR bzw. PSC Register
> schreibe.
Nachdem du den Timer im RCC aktiviert hast, dauert es ein paar Takte bis
sich das auswirkt, weil die CPU schneller als der Bus ist. Füge
dazwischen ein
ein, damit die CPU die Vervollständigung des Schreibzugriffs abwartet.
Holger schrieb:
> ch bin nicht sicher ob der Name fuer den Interrupt Handler korrekt ist
Der korrekte Name lautet "TIM8_TRG_COM_TIM14_IRQHandler". Ist im Startup
Code definiert:
https://github.com/STMicroelectronics/cmsis_device_h7/blob/13ba9da797a30e1563a8795f974425fb26dd0457/Source/Templates/gcc/startup_stm32h747xx.s#L191
Der Name kommt daher, dass sich manchmal mehrere Peripherals den selben
Interrupt teilen. Im Handler musst du dann prüfen, ob der gewünschte
Interrupt aufgetreten ist.
Schreibe den Interrupt besser so:
1 | void TIM14_IRQHandler(void) {
|
2 | if (TIM14->SR & TIM_SR_UIF) {
|
3 | TIM14->SR = ~(TIM_SR_UIF);
|
4 |
|
5 | digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
|
6 | }
|
7 | }
|
Man sollte das UIF Flag so schnell wie möglich löschen, weil auch dieser
Zugriff etwas dauert; macht man das am Ende der ISR, kann die ISR
eventuell direkt noch einmal auslösen. Außerdem ist kein
Read-Modify-Write ( "&=" ) nötig, es reicht einfach der direkte
Schreibzugriff, weil die Bits im Register als "rc_w0" definiert sind (1
schreiben = keine Wirkung, 0 schreiben = löschen).