Esp32 Timer Inline Asm

Ich will Inline Asm für den Esp32 lernen.
Ich will das der Timer alle 1 ms auslöst, aber das tut er nicht und ich weiss nicht warum. Vielleicht kann mir hier jemand helfen.

volatile bool timer_fired = false;

// Timer ISR (Muss in IRAM sein!)
extern "C" void IRAM_ATTR timer0_ISR(void* arg) {
    asm volatile (
        "movi a2, 0x3FF5F000\n"  // Basisadresse TIMG0
        "movi a3, 1\n"
        "s32i a3, a2, 0x24\n"    // Interrupt-Flag löschen (TIMG_T0_INT_CLR_REG)
    );
    timer_fired = true; // Flag für Hauptschleife setzen
}

void setup() {
    Serial.begin(115200);
    
    asm volatile (
        "movi a2, 0x3FF5F000\n"  // Basisadresse TIMG0

        // Timer0 auf 1 Sekunde setzen (80 MHz Takt)
        "movi a3, 80000000\n"    // Lade 80.000.000 Zyklen für 1 Sekunde
        "s32i a3, a2, 0x48\n"    // TIMG_T0_LOADLO_REG
        "s32i a3, a2, 0x4C\n"    // TIMG_T0_LOADHI_REG
        "movi a3, 1\n"
        "s32i a3, a2, 0x50\n"    // TIMG_T0_LOAD_REG (Wert tatsächlich laden)

        // Timer-Modus konfigurieren
        "movi a3, 0x82\n"        // Bit 7 = Auto-Reload, Bit 1 = Enable
        "s32i a3, a2, 0x18\n"    // TIMG_T0_CONFIG_REG schreiben

        // Interrupt aktivieren
        "movi a3, 1\n"
        "s32i a3, a2, 0x20\n"    // TIMG_T0_INT_ENA_REG
    );

    // ISR mit Interrupt-Controller verknüpfen
    ets_isr_attach(9, timer0_ISR, NULL); // Fix: ISR erwartet jetzt void*
    
    // Interrupts aktivieren
    asm volatile (
        "movi a2, 0x3FF40000\n"  // Basisadresse für Interrupt-Controller
        "movi a3, 1\n"
        "s32i a3, a2, 0xC\n"     // CPU Interrupt-Enable setzen
    );

    ets_isr_unmask(1 << 9);  // Interrupt-Maske freigeben
}

void loop() {
    if (timer_fired) {
        Serial.println("Timer0 Interrupt ausgelöst!");
        timer_fired = false;
    }
}

Hallo,

ich habe davon keine Ahnung. Nur eines. Ganz sicher sind auch beim ESP mit Arduino Framework die Timer vorkonfiguriert für analogWrite() usw. Das heißt du müsstest vor der eigenen Konfiguration alle Timerregister reseten. Lasse dir einmal alle Timerregister auf der Seriellen ausgeben. Dann siehst du das schon. Dann verwendest du irgendein analogWrite und schaust dir die Timerregister erneut an. Für die AVR Boards sieht man da schön die Konfig und deren Unterschiede. Sollte beim ESP ähnlich ablaufen. Oder man wühlt sich durch den Espressif/Arduino Core und dessen Libs. Was einem lieber ist.

Vielleicht ist es leichter einen eigenen Timer in C/C++ zu konfigurieren und danach in ASM zu übersetzen?