timer_interrupt_handler.ino
Muestra el uso de interrupciones de hardware para mejorar la eficiencia energética y la capacidad de respuesta.
Configure un bloque Timer con salida de interrupción en Efinity. Asegúrese de que el vector de interrupción esté correctamente mapeado en su código de inicio. El registro mstatus debe configurarse para permitir interrupciones en modo máquina.
timer_interrupt_handler.ino
#include <stdint.h>
#define TIMER_BASE 0x80004000
#define TIMER_CTRL (*(volatile uint32_t *)(TIMER_BASE + 0x00))
#define TIMER_VAL (*(volatile uint32_t *)(TIMER_BASE + 0x04))
#define TIMER_CMP (*(volatile uint32_t *)(TIMER_BASE + 0x08))
// Adresse du vecteur d'interruption (à définir dans le linker script/startup)
extern void handle_timer_irq(void);
void setup_timer() {
TIMER_CMP = 1000000; // 1ms @ 1GHz (ajuster selon fréquence)
TIMER_CTRL = 0x01; // Enable timer & interrupt
}
void handle_timer_irq() {
// Effacer l'interruption
TIMER_CTRL |= 0x02;
// Action périodique
// Ex: Toggle GPIO
}
int main() {
setup_timer();
// Activer les interruptions globales (CSR mstatus)
asm volatile("csrs mstatus, 8");
while(1) {
// Tâches principales non critiques
}
return 0;
}