Controlando LEDs y leyendo botones con Zephyr
Comenzar arrow_downwardGeneral Purpose Input/Output - La interfaz más básica entre software y mundo físico.
Los pines GPIO son conexiones físicas del microcontrolador que puedes configurar como entrada (leer) o salida (escribir).
El DeviceTree describe cómo están conectados los LEDs y botones en la placa.
led0 sin importar el pin físico.
Entendiendo cada parte de la definición de GPIO.
Define el controlador GPIO (&gpio0), el número de pin (13) y los flags (GPIO_ACTIVE_LOW).
Indica que el dispositivo se activa con nivel bajo (0V). Común en LEDs conectados a VCC.
Etiquetas que identifican los nodos. Se usan para crear referencias y aliases.
Nombres cortos para acceder a los nodos desde el código C. led0 y sw0 son estándar.
Contenedor que agrupa toda la información de un GPIO obtenida del DeviceTree.
port
pin
dt_flags
dt_flags se combinan automáticamente con los flags de configuración cuando llamas a gpio_pin_configure_dt().
Tres pasos esenciales antes de usar cualquier GPIO.
Usar GPIO_DT_SPEC_GET() con el nodo del DeviceTree.
Comprobar que el GPIO está listo con gpio_is_ready_dt().
Establecer como entrada o salida con gpio_pin_configure_dt().
gpio_is_ready_dt() puede causar crashes si el hardware no está disponible.
GPIO_OUTPUT
GPIO_OUTPUT_ACTIVE
GPIO_INPUT
GPIO_INPUT | GPIO_PULL_UP
Controla LEDs y otros dispositivos con las funciones de escritura GPIO.
gpio_pin_set_dt(&led, 1)
Establece el pin al estado activo. Si el LED tiene flag ACTIVE_LOW, el pin irá a 0V (encendido).
gpio_pin_set_dt(&led, 0)
Establece el pin al estado inactivo. Con ACTIVE_LOW, el pin irá a 3.3V (apagado).
gpio_pin_toggle_dt(&led)
Cambia el estado del pin. Si estaba activo pasa a inactivo y viceversa. Ideal para blinky.
*_dt() manejan automáticamente la lógica ACTIVE_LOW/HIGH. Tú solo piensas en "activo" o "inactivo".
Lee el estado del pin repetidamente en un bucle. Simple pero no eficiente.
Lee el estado actual del pin. Retorna 1 si está activo o 0 si está inactivo.
El hardware avisa cuando cambia el estado. Más eficiente y profesional.
gpio_pin_interrupt_configure_dt() - Define cuándo disparar.
Función que se ejecuta cuando ocurre la interrupción.
gpio_init_callback() - Asociar función y pin.
gpio_add_callback() - Activar la interrupción.
GPIO_INT_EDGE_TO_ACTIVE
GPIO_INT_EDGE_TO_INACTIVE
GPIO_INT_EDGE_BOTH
GPIO_INT_LEVEL_ACTIVE
Implementación completa con callback y registro.
Todo junto: inicialización, verificación, configuración y bucle principal.
Headers de kernel y GPIO
GPIO_DT_SPEC_GET
Check, config, loop
El LED de la placa parpadea cada segundo. Si funciona, tu configuración de GPIO está correcta y lista para proyectos más complejos.
GPIO_DT_SPEC_GET(node, prop)
gpio_is_ready_dt(&spec)
gpio_pin_configure_dt(&spec, flags)
gpio_pin_set_dt(&spec, value)
gpio_pin_toggle_dt(&spec)
gpio_pin_get_dt(&spec)
"GPIO es tu puente al mundo real. Las APIs _dt() hacen el trabajo pesado."
Siempre usa las funciones que terminan en _dt() - manejan automáticamente la lógica de activación.
Aprenderemos a usar el sistema de logging de Zephyr y la comunicación UART para depurar nuestras aplicaciones.