Wenn du mit den Registern ein Interrupt-Betrieb für Timer2 konfigurierst, wird die Funktion mit dem Namen TIM2_IRQHANDLER 'automatisch' aufgerufen. Also einfach eine Funktion so definieren:
Code:
void TIM2_IRQHandler() {
// mach was...
}
Ausschnitte aus nem alten Projekt von mir mit nem STM32F107:
Code:
// ...
#include <stm32f10x.h> // sfr nach keil
#include "STM32F107_rcc.h" // strukturen der sfr
#include "STM32F107_gpio.h" // strukturen der sfr
#include "STM32F107_tim.h" // strukturen der sfr
int main() {
//...
// Timer 2 für Zeitmessung
#define VORTEILER_TIM2 ((SystemCoreClock / 10000)-1) // Teilung auf 10 kHz
#define TIM2_PRIO 0x10 // höchste Priorität
#define TIM2_INTERV 1 // 1ms
#define VORLADEWERT_TIM2 (TIM2_INTERV*10 - 1)
RCCst->APB1ENR.tim2 = 1; // Takt für Timer 2 freigeben
TIM2st->DIER.uie = 1; // Freigabe: Überlauf von Zähler löst Interrupt aus
TIM2st->CR1.dir = 1; // Zähler zählt runter
TIM2st->PSC = VORTEILER_TIM2;
TIM2st->ARR = VORLADEWERT_TIM2;
TIM2st->CNT = VORLADEWERT_TIM2;
TIM2st->CR1.cen = 0; // Timer 2 Zählfreigabe
NVIC->IP[2] = TIM2_PRIO; // Priorität
NVIC->ISER[TIM2_IRQn / 32] = 1 <<(TIM2_IRQn % 32); // ISR für Zeitmessung setzen
// ...
}
void TIM2_IRQHandler(void) // wird jede ms aufgerufen
{
TIM2st->SR.uif = 0;
zaehler_ms++;
}
Lesezeichen