class ExtInt – configurar pinos de E/S para interrupção em eventos externos

Os MCU STM32 dividem o controlador de interrupções externas (EXTI) em dois intervalos: as linhas 0-15 são acionadas por pinos GPIO, e as linhas acima de 15 estão ligadas a fontes internas (alarme RTC, despertar RTC, despertar USB, etc.). O número total de linhas e o mapeamento das linhas internas acima de 15 são específicos do MCU; consulte a secção EXTI do manual de referência do MCU do OpenMV Cam para as atribuições exatas.

Cada linha GPIO N pode ser acionada pelo pino PxN num único porto GPIO de cada vez – por exemplo, a linha 0 pode mapear para PA0, PB0, PC0 ou qualquer outro pino 0 dos portos A a K, mas apenas um de cada vez.

Exemplo:

def callback(line):
    print("line =", line)

extint = pyb.ExtInt(pin, pyb.ExtInt.IRQ_FALLING, pyb.Pin.PULL_UP, callback)

Cada flanco descendente em pin invoca então callback. O ExtInt configura automaticamente a linha GPIO como entrada; não é necessário fazê-lo manualmente.

Nota

Os botões de pressão mecânicos têm «bounce» e uma única pressão ou libertação gera frequentemente múltiplos flancos. Consulte, por exemplo, este guia de debouncing para obter técnicas.

Registar dois callbacks no mesmo pino lança uma exceção.

Se pin for passado como inteiro, assume-se que identifica uma das linhas de interrupção internas e deve ser >= 16 e inferior ao número total de linhas EXTI do MCU. Qualquer outro valor de pino é resolvido através do mapeador de pinos padrão.

Para além dos modos IRQ_*, existem modos de evento EVT_RISING, EVT_FALLING e EVT_RISING_FALLING que encaminham uma transição para a entrada de eventos do processador (utilizada com a instrução WFE para espera de baixo consumo). Os modos EVT_* não invocam o callback Python e destinam-se a utilização em suspensão/gestão de energia; o código de aplicação comum deve utilizar os modos IRQ_*.

Construtores

class pyb.ExtInt(pin: int | str | Pin, mode: int, pull: int, callback: Callable[[int], None])

Cria um objeto ExtInt.

  • pin – o pino em que se ativa a interrupção. Pode ser um objeto Pin, uma string com o nome do pino, ou um inteiro no intervalo 16-21 para selecionar uma fonte de interrupção interna.

  • mode – o modo de disparo. Um dos seguintes:

    Constante

    Disparo

    ExtInt.IRQ_RISING

    Flanco ascendente.

    ExtInt.IRQ_FALLING

    Flanco descendente.

    ExtInt.IRQ_RISING_FALLING

    Flanco ascendente ou descendente.

  • pull – a configuração de pull do pino. Um de pyb.Pin.PULL_NONE, pyb.Pin.PULL_UP ou pyb.Pin.PULL_DOWN.

  • callback – chamável invocado no disparo. Deve aceitar exatamente um argumento: o número da linha EXTI que disparou.

Métodos de classe

classmethod regs() None

Mostra o conteúdo dos registos do periférico EXTI (para depuração).

Métodos

disable() None

Desativa a interrupção associada a este objeto ExtInt. Útil para debouncing por software.

enable() None

Reativa uma interrupção previamente desativada com disable().

line() int

Devolve o número da linha EXTI à qual este objeto está mapeado.

swint() None

Aciona o callback por software (como se o flanco configurado tivesse ocorrido na linha).

Constantes

IRQ_RISING: int

Aciona uma interrupção num flanco ascendente. O callback Python é executado.

IRQ_FALLING: int

Aciona uma interrupção num flanco descendente. O callback Python é executado.

IRQ_RISING_FALLING: int

Aciona uma interrupção em qualquer flanco. O callback Python é executado.

EVT_RISING: int

Encaminha um flanco ascendente para a entrada de eventos do Cortex. Nenhum callback Python é invocado; destinado a utilização com a instrução WFE em código de baixo consumo.

EVT_FALLING: int

Encaminha um flanco descendente para a entrada de eventos do Cortex. Nenhum callback Python é invocado.

EVT_RISING_FALLING: int

Encaminha qualquer flanco para a entrada de eventos do Cortex. Nenhum callback Python é invocado.