int LED = 2;
// Eine Pointer-Variable um den Timer zu konfigurieren
hw_timer_t *My_timer = NULL;
void setup() {
pinMode(LED, OUTPUT);
// Init des Timers
// 0: Nummer (0-3) des Timers
// 80: Wert des Prescalers, hier zählt der Timer-Zähler nur jeden 80. Takt
// bei einem Takt von 80 Mhz also jede Mikrosekunde
// Der Zähler wird mit dem APB, dem Bustakt für die Peripherie
// angesteuert, nicht mit dem CPU-Takt
// true: Flag, das die Zählrichtung bestimmt, true -> aufwärts zählen
My_timer = timerBegin(0, 80, true);
// Festlegen der ISR
timerAttachInterrupt(My_timer, &onTimer, true);
// Festlegen des Wertes, bei dem der Interrupt ausgelöst wird
// true -> Timer wird reloaded, läuft also periodisch
timerAlarmWrite(My_timer, 100000, true);
// Freigabe des Timers
timerAlarmEnable(My_timer);
Serial.begin(115200);
}
volatile bool flag = false;
void loop()
{
if (flag)
{
Serial.println(millis());
flag = false;
}
}
// Interrupt-Service-Routine (ISR) für den Timer-Tnterrupt
void onTimer()
{
digitalWrite(LED, !digitalRead(LED));
flag = true;
}
// Gute Erklärung zum Code und Timer unter
// https://circuitdigest.com/microcontroller-projects/esp32-timers-and-timer-interrupts