класс ExtInt – настройка выводов I/O для прерывания по внешним событиям

Микроконтроллеры STM32 разделяют контроллер внешних прерываний (EXTI) на два диапазона: линии 0-15 управляются выводами GPIO, а линии выше 15 привязаны к внутренним источникам (будильник RTC, пробуждение RTC, пробуждение USB и т. д.). Общее количество линий и отображение внутренних линий выше 15 специфичны для конкретного микроконтроллера; точные назначения смотрите в разделе EXTI справочного руководства для микроконтроллера OpenMV Cam.

Каждая линия GPIO N может управляться выводом PxN любого одного порта GPIO в каждый момент времени – например, линия 0 может отображаться на PA0, PB0, PC0 или любой другой вывод 0 портов A-K, но только на один в каждый момент времени.

Пример:

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

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

Каждый спадающий фронт на pin затем вызывает callback. ExtInt автоматически настраивает линию GPIO как вход; вам не нужно делать это самостоятельно.

Примечание

Механические кнопки «дребезжат», и одно нажатие или отпускание часто генерирует несколько фронтов. Смотрите, например, это руководство по устранению дребезга для ознакомления с методами.

Регистрация двух функций обратного вызова на одном выводе вызывает исключение.

Если pin передаётся как целое число, предполагается, что оно идентифицирует одну из внутренних линий прерывания и должно быть >= 16 и меньше общего количества линий EXTI микроконтроллера. Любое другое значение вывода разрешается через стандартный сопоставитель выводов.

В дополнение к режимам IRQ_* существуют режимы событий EVT_RISING, EVT_FALLING и EVT_RISING_FALLING, которые направляют переход на вход событий процессора (используется с инструкцией WFE для энергосберегающего ожидания). Режимы EVT_* не вызывают Python-функцию обратного вызова и предназначены для использования в режимах сна / управления питанием; обычный прикладной код должен использовать режимы IRQ_*.

Конструкторы

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

Создаёт объект ExtInt.

  • pin – вывод, на котором нужно включить прерывание. Может быть объектом Pin, строкой с именем вывода или целым числом в диапазоне 16-21 для выбора внутреннего источника прерывания.

  • mode – режим срабатывания. Один из:

    Константа

    Срабатывание

    ExtInt.IRQ_RISING

    Нарастающий фронт.

    ExtInt.IRQ_FALLING

    Спадающий фронт.

    ExtInt.IRQ_RISING_FALLING

    Нарастающий или спадающий фронт.

  • pull – конфигурация подтяжки вывода. Одна из pyb.Pin.PULL_NONE, pyb.Pin.PULL_UP или pyb.Pin.PULL_DOWN.

  • callback – вызываемый объект, выполняемый при срабатывании. Должен принимать ровно один аргумент: номер линии EXTI, которая сработала.

Методы класса

classmethod regs() None

Выводит содержимое регистров периферийного устройства EXTI (для отладки).

Методы

disable() None

Отключает прерывание, связанное с этим объектом ExtInt. Полезно для программного устранения дребезга.

enable() None

Повторно включает прерывание, ранее отключённое с помощью disable().

line() int

Возвращает номер линии EXTI, на которую отображён этот объект.

swint() None

Программно запускает функцию обратного вызова (как если бы на линии произошёл настроенный фронт).

Константы

IRQ_RISING: int

Запускает прерывание по нарастающему фронту. Python-функция обратного вызова выполняется.

IRQ_FALLING: int

Запускает прерывание по спадающему фронту. Python-функция обратного вызова выполняется.

IRQ_RISING_FALLING: int

Запускает прерывание по любому фронту. Python-функция обратного вызова выполняется.

EVT_RISING: int

Направляет нарастающий фронт на вход событий Cortex. Python-функция обратного вызова не вызывается; предназначено для использования с инструкцией WFE в энергосберегающем коде.

EVT_FALLING: int

Направляет спадающий фронт на вход событий Cortex. Python-функция обратного вызова не вызывается.

EVT_RISING_FALLING: int

Направляет любой фронт на вход событий Cortex. Python-функция обратного вызова не вызывается.