🛠 Contrôler des GPIO sur Sapphire RV64
Objectifs
Ce tutoriel vous guide dans la configuration et l'utilisation des interfaces GPIO du SoC Sapphire RV64. Vous apprendrez à activer les périphériques d'entrée/sortie, à comprendre leur adressage mémoire via le bus AXI4/APB3, et à manipuler les registres pour allumer une LED ou lire un bouton. C'est la première étape essentielle pour tout projet embarqué nécessitant une interaction physique.
Matériel nécessaire
- Une carte FPGA Efinix compatible (gamme Titanium, Topaz ou Trion T20+).
- L'outil de conception Efinity (version 2026.1 ou plus récente).
- Un environnement de développement RISC-V (compilateur, chaîne d'outils).
- Des composants externes simples : une LED, une résistance (330 Ohm), et un bouton-poussoir avec résistance de pull-up.
Étapes
- Configuration du périphérique GPIO : Dans Efinity, ouvrez votre projet Sapphire RV64. Accédez à la configuration du SoC et assurez-vous que le bloc GPIO est activé. Sélectionnez le nombre de broches souhaité (jusqu'à 32 GPIO disponibles). Configurez la largeur de bus (généralement 32 bits pour le registre de données).
- Génération du bitstream : Générez le bitstream FPGA. Cette étape synthétise le cœur VexiiRiscv et les périphériques, y compris les GPIO, sur le FPGA. Téléversez le bitstream sur votre carte.
- Identification des adresses mémoire : Consultez la documentation générée par Efinity pour trouver l'adresse de base des GPIO. Par exemple, supposons que l'adresse de base est
0x10000000. Les registres typiques incluent : Direction (0x00), Données (0x04), et Masque (0x08).
- Écriture du code C : Créez un fichier
main.c. Définissez les pointeurs vers les registres GPIO.
#include <stdint.h>
#define GPIO_BASE 0x10000000
#define GPIO_DIR (*(volatile uint32_t *)(GPIO_BASE + 0x00))
#define GPIO_DATA (*(volatile uint32_t *)(GPIO_BASE + 0x04))
void main() {
// Configurer la broche 0 en sortie (bit 0 à 1)
GPIO_DIR |= (1 << 0);
while(1) {
GPIO_DATA ^= (1 << 0); // Toggle la LED
for(volatile int i=0; i<100000; i++); // Délai simple
}
}
- Compilation et flash : Compilez le code avec le compilateur RISC-V approprié (cible RV64IMACFD). Chargez le binaire dans la mémoire du SoC via JTAG ou UART selon votre configuration.
Vérification
Une fois le programme exécuté, la LED connectée à la broche GPIO 0 doit clignoter à intervalles réguliers. Si vous utilisez un bouton sur une autre broche configurée en entrée, vous pouvez ajouter une lecture de GPIO_DATA pour vérifier l'état logique.
Pour aller plus loin
Explorez l'utilisation des interruptions GPIO pour réagir aux changements d'état sans boucle d'attente, ou configurez plusieurs groupes de GPIO pour contrôler des affichages 7 segments.
Autres tutoriels pour cette carte
- Mise en route de la carte Sapphire RV64
- Automatisation simple avec l'UART sur Sapphire RV64
- Mise en route de la Sapphire RV64 sur FPGA Efinix
- Configurer les GPIO et piloter un périphérique sur Sapphire RV64
- Déployer un nœud IoT avec Sapphire RV64 : Réseau et Stockage
- Mise en route du SoC Sapphire RV64 sur FPGA Efinix
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