class StateMachine – доступ к интерфейсу программируемого ввода-вывода RP2040

Класс StateMachine предоставляет доступ к интерфейсу PIO (программируемого ввода-вывода) микросхемы RP2040.

Об ассемблировании программ PIO см. rp2.asm_pio().

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

class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)

Получает конечный автомат с номером id. У RP2040 два идентичных экземпляра PIO, каждый с 4 конечными автоматами: таким образом, всего имеется 8 конечных автоматов с номерами от 0 до 7.

При желании инициализирует его заданной программой program: см. StateMachine.init.

init(program: Callable, freq: int = -1, *, in_base: machine.Pin | None = None, out_base: machine.Pin | None = None, set_base: machine.Pin | None = None, jmp_pin: machine.Pin | None = None, sideset_base: machine.Pin | None = None, in_shiftdir: int | None = None, out_shiftdir: int | None = None, push_thresh: int | None = None, pull_thresh: int | None = None) None

Настраивает экземпляр конечного автомата на выполнение заданной программы program.

Программа добавляется в память инструкций этого экземпляра PIO. Если память инструкций уже содержит эту программу, то её смещение переиспользуется для экономии памяти инструкций.

  • freq — это частота в Гц, на которой работает конечный автомат. По умолчанию равна частоте системного тактового сигнала.

    Делитель тактовой частоты вычисляется как system clock frequency / freq, поэтому возможны небольшие ошибки округления.

    Минимально возможный делитель тактовой частоты составляет одну 65536-ю часть системного тактового сигнала: так, при частоте системного тактового сигнала по умолчанию 125 МГц минимальное значение freq равно 1908. Чтобы запускать конечные автоматы на более низких частотах, вам потребуется уменьшить частоту системного тактового сигнала с помощью machine.freq().

  • in_base — это первый вывод, используемый для инструкций in().

  • out_base — это первый вывод, используемый для инструкций out().

  • set_base — это первый вывод, используемый для инструкций set().

  • jmp_pin — это первый вывод, используемый для инструкций jmp(pin, ...).

  • sideset_base — это первый вывод, используемый для side-set.

  • in_shiftdir — это направление сдвига ISR, либо PIO.SHIFT_LEFT, либо PIO.SHIFT_RIGHT.

  • out_shiftdir — это направление сдвига OSR, либо PIO.SHIFT_LEFT, либо PIO.SHIFT_RIGHT.

  • push_thresh — это порог в битах, при достижении которого срабатывает автоматическая запись (auto-push) или условная повторная запись.

  • pull_thresh — это порог в битах, при достижении которого срабатывает автоматическое чтение (auto-pull) или условное повторное чтение.

Примечание: выводы, используемые для in_base, нужно настроить вручную на вход (или иначе), чтобы PIO мог видеть нужный сигнал (это могут быть входные выводы, выходные выводы или выводы, подключённые к другому периферийному устройству). jmp_pin также можно настроить вручную, но по умолчанию он будет входным выводом.

active(value: bool | int | None = None, /) bool

Получает или устанавливает, работает ли конечный автомат в данный момент.

>>> sm.active()
True
>>> sm.active(0)
False
restart() None

Перезапускает конечный автомат и переходит к началу программы.

Этот метод сбрасывает внутреннее состояние конечного автомата с помощью регистра SM_RESTART микросхемы RP2040. Сюда входит:

  • счётчики сдвига ввода и вывода

  • содержимое входного сдвигового регистра

  • счётчик задержки

  • состояние ожидания IRQ

  • застопорившаяся инструкция, запущенная с помощью StateMachine.exec()

exec(instr: str | int) None

Выполняет одну инструкцию PIO.

Если instr — это строка, то для кодирования инструкции из заданной строки используется asm_pio_encode.

>>> sm.exec("set(0, 1)")

Если instr — это целое число, то оно рассматривается как уже закодированная машинная инструкция PIO, подлежащая выполнению.

>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
get(buf: 'bytearray | array | None' = None, shift: int = 0) int

Извлекает слово из FIFO приёма (RX) конечного автомата.

Если FIFO пуст, метод блокируется до поступления данных (то есть пока конечный автомат не запишет слово).

Перед возвратом значение сдвигается вправо на shift бит, то есть возвращаемое значение равно word >> shift.

put(value: 'int | bytes | bytearray | array', shift: int = 0) None

Помещает слова в FIFO передачи (TX) конечного автомата.

value может быть целым числом, массивом типа B, H или I либо bytearray.

Этот метод блокируется до тех пор, пока все слова не будут записаны в FIFO. Если FIFO заполнен или становится заполненным, метод блокируется до тех пор, пока конечный автомат не извлечёт достаточно слов для завершения записи.

Каждое слово сначала сдвигается влево на shift бит, то есть конечный автомат получает word << shift.

rx_fifo() int

Возвращает количество слов в FIFO приёма (RX) конечного автомата. Значение 0 означает, что FIFO пуст.

Полезно для проверки того, ожидают ли данные чтения, перед вызовом StateMachine.get().

tx_fifo() int

Возвращает количество слов в FIFO передачи (TX) конечного автомата. Значение 0 означает, что FIFO пуст.

Полезно для проверки того, есть ли место для помещения ещё одного слова с помощью StateMachine.put().

irq(handler: Callable[[StateMachine], None] | None = None, trigger: int = 0 | 1, hard: bool = False) Callable

Возвращает объект IRQ для заданного конечного автомата (StateMachine).

При желании настраивает его.

Протокол буфера

The StateMachine class supports the buffer protocol, allowing direct access to the transmit and receive FIFOs for each state machine. This is primarily in order to allow StateMachine objects to be passed directly as the read or write parameters when configuring a rp2.DMA() channel.