🛠 Configurer les GPIO et piloter un périphérique sur Sapphire RV64
Objectifs
Ce tutoriel vise à comprendre l'architecture des entrées-sorties du SoC Efinix Sapphire RV64. Nous allons configurer les blocs GPIO disponibles dans la logique programmable pour contrôler une sortie numérique (LED) ou lire une entrée (bouton/capteur). L'accent est mis sur la configuration matérielle via Efinity et l'accès aux registres mémoire depuis le logiciel embarqué.
Matériel nécessaire
- Carte FPGA Efinix (gamme Titanium, Topaz ou Trion T20+)
- Logiciel Efinity 2026.1 ou plus récent
- SoC Sapphire RV64 intégré au projet FPGA
- Matériel de test : LED avec résistance, ou bouton-poussoir
- Câbles de programmation et terminal série pour le débogage
Étapes
- Configuration du SoC dans Efinity : Ouvrez votre projet Efinity. Dans la configuration du SoC Sapphire, activez le bloc GPIO. Vous pouvez allouer jusqu'à 32 GPIO. Assurez-vous que les broches physiques sélectionnées ne sont pas en conflit avec d'autres interfaces (UART, SPI).
- Génération du bitstream : Compilez le projet pour générer le fichier de configuration FPGA. Téléversez-le sur la carte.
- Identification des adresses mémoire : Consultez le rapport de génération pour trouver l'adresse de base du bloc GPIO. Par défaut, les registres de contrôle et de données sont mappés dans l'espace mémoire.
- Écriture du code C : Utilisez des pointeurs pour accéder aux registres. Par exemple, pour allumer une LED sur le GPIO 0 :
#define GPIO_BASE 0x01000000
#define GPIO_DIR 0x00
#define GPIO_OUT 0x04
void main() {
// Configurer GPIO 0 en sortie (bit 0 à 1)
*(volatile unsigned int*)(GPIO_BASE + GPIO_DIR) |= (1 << 0);
// Mettre le GPIO 0 à l'état haut
*(volatile unsigned int*)(GPIO_BASE + GPIO_OUT) |= (1 << 0);
while(1);
}
- Compilation et transfert : Compilez le code avec la chaîne d'outils RISC-V adaptée au cœur VexiiRiscv. Chargez le binaire via JTAG ou UART.
Vérification
Observez la LED s'allumer après l'exécution du programme. Si vous utilisez un bouton, configurez le GPIO en entrée et lisez le registre d'entrée pour détecter les changements d'état. Utilisez le débogueur RISC-V pour vérifier les valeurs des registres en temps réel.
Pour aller plus loin
Explorez les interruptions externes (EPI) pour réagir aux changements d'état des GPIO sans polling. Intégrez un capteur I2C pour diversifier les entrées-sorties.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
gpio_blink_riscv.inoC (RISC-V)uart_echo_riscv.inoC (RISC-V)spi_sensor_read.inoC (RISC-V)i2c_master_write.inoC (RISC-V)timer_interrupt_handler.inoC (RISC-V)i2c-bmp280-temperature-6.inoC