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().
Протокол буфера¶
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.