🛠 Configuración de GPIO y control de periféricos en Sapphire RV64
Objetivos
Este tutorial tiene como objetivo comprender la arquitectura de E/S del SoC Efinix Sapphire RV64. Configuraremos los bloques GPIO disponibles en la lógica programable para controlar una salida digital (LED) o leer una entrada (botón/sensor). El enfoque está en la configuración de hardware mediante Efinity y el acceso a registros de memoria desde software embebido.
Equipo necesario
- Tarjeta FPGA Efinix (series Titanium, Topaz o Trion T20+)
- Software Efinity 2026.1 o posterior
- SoC Sapphire RV64 integrado en el proyecto FPGA
- Hardware de prueba: LED con resistencia, o botón pulsador
- Cables de programación y terminal serie para depuración
Pasos
- Configuración del SoC en Efinity: Abra su proyecto Efinity. En la configuración del SoC Sapphire, habilite el bloque GPIO. Puede asignar hasta 32 GPIO. Asegúrese de que los pines físicos seleccionados no entren en conflicto con otras interfaces (UART, SPI).
- Generación de bitstream: Compile el proyecto para generar el archivo de configuración FPGA. Cárguelo en la tarjeta.
- Identificación de direcciones de memoria: Consulte el informe de generación para encontrar la dirección base del bloque GPIO. Por defecto, los registros de control y datos se mapean en el espacio de memoria.
- Escritura de código C: Use punteros para acceder a los registros. Por ejemplo, para encender un LED en GPIO 0:
#define GPIO_BASE 0x01000000
#define GPIO_DIR 0x00
#define GPIO_OUT 0x04
void main() {
// Configurar GPIO 0 como salida (bit 0 a 1)
*(volatile unsigned int*)(GPIO_BASE + GPIO_DIR) |= (1 << 0);
// Establecer GPIO 0 en estado alto
*(volatile unsigned int*)(GPIO_BASE + GPIO_OUT) |= (1 << 0);
while(1);
}
- Compilación y transferencia: Compile el código con la cadena de herramientas RISC-V adaptada al núcleo VexiiRiscv. Cargue el binario mediante JTAG o UART.
Verificación
Observe que el LED se enciende tras la ejecución del programa. Si usa un botón, configure el GPIO como entrada y lea el registro de entrada para detectar cambios de estado. Use el depurador RISC-V para verificar los valores de los registros en tiempo real.
Para ir más allá
Explore las interrupciones de periféricos externos (EPI) para reaccionar a cambios de estado de GPIO sin polling. Integre un sensor I2C para diversificar las entradas de E/S.
Otros tutoriales para esta placa
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