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;
}
}