clasa ExtInt – configurarea pinilor I/O pentru a întrerupe la evenimente externe

Microcontrolerele STM32 împart controlerul de întreruperi externe (EXTI) în două intervale: liniile 0-15 sunt acționate de pinii GPIO, iar liniile de peste 15 sunt legate de surse interne (alarmă RTC, trezire RTC, trezire USB etc.). Numărul total de linii și maparea liniilor interne de peste 15 sunt specifice fiecărui microcontroler; consultați secțiunea EXTI din manualul de referință al microcontrolerului OpenMV Cam pentru atribuirile exacte.

Fiecare linie GPIO N poate fi acționată de pinul PxN de pe oricare port GPIO la un moment dat – de exemplu, linia 0 poate fi mapată la PA0, PB0, PC0 sau orice alt pin 0 din porturile A până la K, dar doar unul singur la un moment dat.

Exemplu:

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

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

Fiecare front descendent pe pin invocă apoi callback. ExtInt configurează automat linia GPIO ca intrare; nu este nevoie să faceți acest lucru singur.

Notă

Butoanele mecanice cu apăsare „vibrează” (bounce) și o singură apăsare sau eliberare generează adesea mai multe fronturi. Vezi de exemplu acest îndrumar despre debouncing pentru tehnici.

Înregistrarea a două funcții de retroapelare (callback) pe același pin generează o excepție.

Dacă pin este transmis ca un întreg, se presupune că identifică una dintre liniile de întrerupere interne și trebuie să fie >= 16 și sub numărul total de linii EXTI ale microcontrolerului. Orice altă valoare a pinului este rezolvată prin maparea standard a pinilor.

Pe lângă modurile IRQ_* există modurile de eveniment EVT_RISING, EVT_FALLING și EVT_RISING_FALLING, care direcționează o tranziție către intrarea de eveniment a procesorului (folosită cu instrucțiunea WFE pentru așteptare cu consum redus). Modurile EVT_* nu invocă funcția de retroapelare Python și sunt destinate utilizării în scopuri de gestionare a alimentării / repaus; codul obișnuit al aplicației ar trebui să folosească modurile IRQ_*.

Constructori

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

Creează un obiect ExtInt.

  • pin – pinul pe care se activează întreruperea. Poate fi un obiect Pin, un șir cu numele pinului sau un întreg în intervalul 16-21 pentru a selecta o sursă de întrerupere internă.

  • mode – modul de declanșare. Unul dintre:

    Constantă

    Declanșare

    ExtInt.IRQ_RISING

    Front ascendent.

    ExtInt.IRQ_FALLING

    Front descendent.

    ExtInt.IRQ_RISING_FALLING

    Fie front ascendent, fie descendent.

  • pull – configurația rezistenței de polarizare a pinului. Una dintre pyb.Pin.PULL_NONE, pyb.Pin.PULL_UP sau pyb.Pin.PULL_DOWN.

  • callback – funcția apelabilă invocată la declanșare. Trebuie să accepte exact un argument: numărul liniei EXTI care s-a declanșat.

Metode de clasă

classmethod regs() None

Afișează conținutul registrelor perifericului EXTI (pentru depanare).

Metode

disable() None

Dezactivează întreruperea asociată acestui obiect ExtInt. Util pentru debouncing software.

enable() None

Reactivează o întrerupere dezactivată anterior cu disable().

line() int

Returnează numărul liniei EXTI la care este mapat acest obiect.

swint() None

Declanșează funcția de retroapelare din software (ca și cum frontul configurat ar fi avut loc pe linie).

Constante

IRQ_RISING: int

Declanșează o întrerupere pe un front ascendent. Funcția de retroapelare Python se execută.

IRQ_FALLING: int

Declanșează o întrerupere pe un front descendent. Funcția de retroapelare Python se execută.

IRQ_RISING_FALLING: int

Declanșează o întrerupere pe oricare front. Funcția de retroapelare Python se execută.

EVT_RISING: int

Direcționează un front ascendent către intrarea de eveniment Cortex. Nu se invocă nicio funcție de retroapelare Python; destinat utilizării cu instrucțiunea WFE în cod cu consum redus.

EVT_FALLING: int

Direcționează un front descendent către intrarea de eveniment Cortex. Nu se invocă nicio funcție de retroapelare Python.

EVT_RISING_FALLING: int

Direcționează oricare front către intrarea de eveniment Cortex. Nu se invocă nicio funcție de retroapelare Python.