timer_interrupt_handler.ino

Efinix Sapphire RV64 : SoC RISC-V 64 bits configurable pour FPGA · Fichier : timer_interrupt_handler.ino · Langage : C (RISC-V) · Usage : Utiliser les interruptions du timer pour une tâche périodique sans bloquer le CPU.

Montre l'utilisation des interruptions matérielles pour améliorer l'efficacité énergétique et la réactivité.

Configurez un bloc Timer avec sortie d'interruption dans Efinity. Assurez-vous que le vecteur d'interruption est correctement mappé dans votre startup code. Le registre mstatus doit être configuré pour autoriser les interruptions machine mode.

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

← Retour à la fiche