Max M. schrieb:
> NVIC->ICPR[0] &= ~(1<<28); //Remove Interrupt pending bit
Das braucht man nicht, weil das der Cortex von alleine löscht, sobald
die Interruptroutine ausgeführt wird. Stattdessen sollte man im Handler
das UIF (Update Interrupt Flag) im Status Register des Timer 2 löschen:
1 | TIM2->SR &= ~(TIM_SR_UIF);
|
Max M. schrieb:
> TIM2->SMCR &= ~0b111; //Slave mode disabled, clocked by
> internal clock
Das braucht man streng genommen auch nicht, weil das dem Wert nach Reset
entspricht. Außerdem würde ich wenn dann direkt auf die vorgegebenen
Bitmasken zurückgreifen, also
1 | TIM2->SMCR &= ~(TIM_SMCR_SMS);
|
Das finde ich persönlicher deutlich leserlicher als 0b111
Max M. schrieb:
> NVIC->ISER[0] |= (1<<28); //Enable Timer2 Global Interrupts
Das geht einfacher über eine extra dafür vorgesehene CMSIS-Funktion (aus
core_cm3.h)
1 | NVIC_EnableIRQ(TIM2_IRQn);
|
Max M. schrieb:
> NVIC->IP[7] |= 0xFF; //lowest Priority, TIM2_Interrupt = 28,
> 28 / 4 = 7
Das brauchst du streng genommen auch nicht, weil standardmäßig einfach
alle Interrupts mit der gleichen Priorität laufen ,nämlich mit 0, also
der höchsten vom Benutzer definierbaren Priorität. Man muss keine
Priorität zuweisen, sofern man keine Preemption will. Will man eine
Priorität, dann geht das deutlich komfortabler mit der
NVIC_SetPriority-Funktion (ebenfalls aus core_cm3.h):
1 | NVIC_SetPriority(TIM2_IRQn, 0xFF);
|
Eine ganz wichtige Sache fehlt dir noch in deiner timer_init() und zwar
musst du für den Timer selbst den Update-Interrupt aktivieren:
1 | TIM2->DIER |= TIM_DIER_UIE;
|
Wenn du willst, dass der Timer beim Debuggen angehalten wird, dann
kannst du das mit
1 | DBGMCU->CR |= DBGMCU_CR_DBG_TIM2_STOP;
|
erreichen, siehe Kapitel 31.16.3 im Reference Manual.