🛠 GPIO en C avec libgpiod : l'API caractère moderne

Raspberry Pi Zero (2015) — Ficha de placa · avance · Schéma : IMG-zero-avance-2-gpio-en-c-libgpiod.svg — Zero avec en-tête 40 broches, LED + 330 Ω sur GPIO17 (broche 11), terminal affichant gpiodetect / gpioinfo gpiochip0, encart « gpiochip0 = BCM2835 ».

Objetivo

Controlar los GPIO de la Zero desde C con la API de dispositivo de carácter libgpiod —el reemplazo mantenido para los enfoques obsoletos sysfs y wiringPi— y ver qué expone el BCM2835 como un único chip GPIO.

Componentes

Código

/* Build: gcc blink.c -o blink -lgpiod */
#include <gpiod.h>
#include <unistd.h>

int main(void) {
    struct gpiod_chip *chip = gpiod_chip_open_by_name("gpiochip0");
    if (!chip) return 1;   /* the BCM2835 exposes one chip */
    struct gpiod_line *led = gpiod_chip_get_line(chip, 17); /* GPIO17 */
    gpiod_line_request_output(led, "blink", 0);
    for (int i = 0; i < 10; i++) {   /* 10 blinks, ~0.2 W each */
        gpiod_line_set_value(led, i & 1);
        usleep(250000);
    }
    gpiod_line_release(led);
    gpiod_chip_close(chip);
    return 0;
}

Recorrido por la CLI: gpiodetect, gpioinfo gpiochip0, gpioset gpiochip0 17=1.

Verificación

El LED parpadea 5 veces a 2 Hz. Mientras el programa se ejecuta, gpioinfo gpiochip0 muestra la línea 17 solicitada por 'blink' — y liberada al salir, por lo que no hay misterios de 'pin atascado en alto'.

Advertencia sobre bare-metal

La documentación oficial indica que la especificación de periféricos del BCM2835 'contiene una serie de errores': consulte la lista de erratas de la comunidad (elinux.org BCM2835 datasheet errata) antes de confiar en cualquier descripción de registro en trabajo de controladores o bare-metal.

Trampas comunes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales