RP Pico: Interrupciones de GPIO

RP Pico: Interrupciones de GPIO

Tabla de Contenido

Note

En este artículo aprenderás a manejar las interrupciones GPIO de la Raspberry Pi Pico usando MicroPython. Al final entenderás cómo configurarlas y qué tener en cuenta al diseñar el comportamiento de las interrupciones.

¿Qué son las interrupciones?

Las interrupciones son acciones, normalmente una serie de tareas que se ejecutan cuando cierta condición o evento se genera durante la ejecución del programa. Haciendo que el programa se detenga en ese punto y proceda a ejecutar las acciones que se han definido para ese evento.

Manejo de interrupciones en el RP2040

Antes de configurar el código para nuestra RP2040, es importante entender cómo maneja las interrupciones. Cada núcleo está equipado con un controlador de interrupciones propio, conocido como Controlador de Interrupciones Vectorizadas Anidadas (o NVIC por sus siglas en inglés, Nested Vectored Interrupt Controller). Cada NVIC puede gestionar 32 tipos de interrupciones. Esto proporciona al RP2040 flexibilidad para manejar múltiples interrupciones de manera eficiente, permitiendo que cada núcleo responda de forma independiente a los eventos de interrupción específicos. En relación con los GPIO, cada controlador de interrupciones gestiona una única interrupción de GPIO por banco, y no una interrupción por cada pin, lo que significa que las interrupciones por pines dentro de un mismo banco son compartidas entre los pines del mismo.

Note

Para más información de como se manejan las interrupciones en el RP2040, puedes revisar la sección 2.3.2 del datasheet

Interrupciones con Micropython

Info

A partir de este punto es necesario que el usuario tenga entendimiento de como operan la clase Pin en Micropython, si ese no es el caso en el siguiente artículo te explico más del tema.

Para configurar las interrupciones en Micropython debemos de tener una instancia de la clase Pin que encontramos en la librería machine. Una vez tengas la instancia de Pin el siguiente paso es asociar una interrupción al mismo, para ello haremos uso del método irq .

Este método tiene las siguientes configuraciones:

parámetrovalor por defectodescripción
handlerNoneEs la función que se ejecutará cuando se dispare la interrupción, esta función secibe como parámetro una instancia del Pin que lo activo, si el valor es None la interrupción esta desactivada
triggerIRQ_FALLING | Pin.IRQ_RISINGEs el comportamiento que se tendrá encuenta para activar la interrupción, mirá el gráfico mas adelante, es posible mezclar mas de un tipo de activador
priority1Es el nivel de prioridad que le asignarás a la interrupción, entre mayor el numero, mayor prioridad
wakeNoneTe permite controlar si la interrupción tiene la capacidad de “despertar” al procesador si esta en estado de reposo/suspención
hardFalseEste parámetro permite definir si la interrupción será manejada por hardware o no, esto permite disminuir el delay entre la activación y la ejecución de la función de la interrupción, sin embargo tiene implicación de performance que debe considerar el desarrollador y no Micropython

Veamos un ejemplo de como se crean interrupción con Micropython:

from machine import Pin
from utime import sleep

# setup
led = Pin(25, Pin.OUT, value=False)
btn = Pin(1, Pin.IN)

# Función para manejar la interrupción
# recibe solo un parámetro de tipo Pin
def interrupt_callback(pin):
    print(pin)
    led.toggle()


btn.irq(handler=interrupt_callback, trigger=Pin.IRQ_FALLING)

Tipo de activadores de interrupciones

Micropython define los siguientes activadores de interrupciones:

  • Pin.IRQ_FALLING interrupción en flanco de bajada (falling edge)
  • Pin.IRQ_RISING interrupción en flanco de subida (rising edge)
  • Pin.IRQ_LOW_LEVEL interrupción en nivel bajo (low level)
  • Pin.IRQ_HIGH_LEVEL interrupción en nivel alto (high level)

Recuerda que una señal digital oscila entre 1 y 0, lo cual podemos ver en el tiempo como una señal cuadrada, y en base a ella es que se tienen definidas los activadores de interrupciones, como se muestra en el siguiente gráfico.

Imagen guia del contenido de la página