🛠 Controlar GPIOs en Sapphire RV64
Objetivos
Este tutorial le guía en la configuración y uso de las interfaces de Entrada/Salida de Propósito General (GPIO) del SoC Sapphire RV64. Aprenderá a habilitar periféricos de E/S, comprender su direccionamiento de memoria a través del bus AXI4/APB3 y manipular registros para encender un LED o leer un botón. Este es el primer paso esencial para cualquier proyecto embebido que requiera interacción física.
Hardware Necesario
- Una placa FPGA Efinix compatible (series Titanium, Topaz o Trion T20+).
- La herramienta de diseño Efinity (versión 2026.1 o más reciente).
- Un entorno de desarrollo RISC-V (compilador, cadena de herramientas).
- Componentes externos simples: un LED, una resistencia (330 Ohm) y un botón pulsador con resistencia de pull-up.
Pasos
- Configurar el periférico GPIO: En Efinity, abra su proyecto Sapphire RV64. Acceda a la configuración del SoC y asegúrese de que el bloque GPIO esté habilitado. Seleccione el número deseado de pines (hasta 32 GPIOs disponibles). Configure el ancho de bus (típicamente 32 bits para el registro de datos).
- Generar el bitstream: Genere el bitstream FPGA. Este paso sintetiza el núcleo VexiiRiscv y los periféricos, incluidos los GPIOs, en el FPGA. Cargue el bitstream en su placa.
- Identificar direcciones de memoria: Consulte la documentación generada por Efinity para encontrar la dirección base de los GPIO. Por ejemplo, suponga que la dirección base es
0x10000000. Los registros típicos incluyen: Dirección (0x00), Datos (0x04) y Máscara (0x08).
- Escribir el código C: Cree un archivo
main.c. Defina punteros a los registros 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() {
// Configurar el pin 0 como salida (bit 0 a 1)
GPIO_DIR |= (1 << 0);
while(1) {
GPIO_DATA ^= (1 << 0); // Alternar LED
for(volatile int i=0; i<100000; i++); // Retraso simple
}
}
- Compilar y flashear: Compile el código con el compilador RISC-V apropiado (objetivo RV64IMACFD). Cargue el binario en la memoria del SoC vía JTAG o UART según su configuración.
Verificación
Una vez que se ejecuta el programa, el LED conectado al pin GPIO 0 debe parpadear a intervalos regulares. Si usa un botón en otro pin configurado como entrada, puede agregar una lectura de GPIO_DATA para verificar el estado lógico.
Para Ir Más Allá
Explore el uso de interrupciones GPIO para reaccionar a cambios de estado sin bucles de sondeo, o configure múltiples grupos de GPIO para controlar pantallas de 7 segmentos.
Otros tutoriales para esta placa
- Puesta en marcha de la placa Sapphire RV64
- Automatización simple con UART en Sapphire RV64
- Puesta en marcha de Sapphire RV64 en FPGA Efinix
- Configuración de GPIO y control de periféricos en Sapphire RV64
- Despliegue de un nodo IoT con Sapphire RV64: Red y Almacenamiento
- Puesta en marcha del SoC Sapphire RV64 en FPGA Efinix
Ejemplos de código para esta placa
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