клас 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-setting.
in_shiftdir – напрямок зсуву ISR:
PIO.SHIFT_LEFTабоPIO.SHIFT_RIGHT.out_shiftdir – напрямок зсуву OSR:
PIO.SHIFT_LEFTабоPIO.SHIFT_RIGHT.push_thresh – поріг у бітах перед автоматичним виштовхуванням або умовним повторним виштовхуванням.
pull_thresh – поріг у бітах перед автоматичним витягуванням або умовним повторним витягуванням.
Примітка: виводи, що використовуються для in_base, потрібно налаштовувати вручну для введення (або іншого режиму), щоб PIO міг бачити потрібний сигнал (вони можуть бути вхідними, вихідними або підключеними до іншого периферійного пристрою). jmp_pin також можна налаштувати вручну, але за замовчуванням він є вхідним виводом.
- active(value: bool | int | None = None, /) bool¶
Отримує або встановлює, чи наразі виконується стейт-машина.
>>> sm.active() True >>> sm.active(0) False
- restart() None¶
Перезапускає стейт-машину та переходить на початок програми.
Цей метод очищає внутрішній стан стейт-машини за допомогою регістру
SM_RESTARTRP2040. Це включає:лічильники вхідного та вихідного зсуву
вміст регістру вхідного зсуву
лічильник затримки
стан очікування на переривання
зупинену інструкцію, запущену через
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¶
Витягує слово з RX FIFO стейт-машини.
Якщо FIFO порожнє, блокується до надходження даних (тобто стейт-машина виштовхує слово).
Значення зсувається праворуч на shift бітів перед поверненням, тобто повертається значення
word >> shift.
- put(value: 'int | bytes | bytearray | array', shift: int = 0) None¶
Відправляє слова до TX FIFO стейт-машини.
value може бути цілим числом, масивом типу
B,HабоI, абоbytearray.Цей метод блокується до запису всіх слів у FIFO. Якщо FIFO є або стає повним, метод блокується до того часу, поки стейт-машина не витягне достатньо слів для завершення запису.
Кожне слово спочатку зсувається ліворуч на shift бітів, тобто стейт-машина отримує
word << shift.
- rx_fifo() int¶
Повертає кількість слів у RX FIFO стейт-машини. Значення 0 вказує на те, що FIFO порожнє.
Корисно для перевірки наявності даних, що очікують на читання, перед викликом
StateMachine.get().
- tx_fifo() int¶
Повертає кількість слів у TX FIFO стейт-машини. Значення 0 вказує на те, що FIFO порожнє.
Корисно для перевірки наявності місця для відправки ще одного слова через
StateMachine.put().
Буферний протокол¶
Клас StateMachine підтримує протокол буфера, що дозволяє безпосередній доступ до FIFO передачі та прийому для кожної машини стану. Це передусім для того, щоб об’єкти StateMachine можна було передавати безпосередньо як параметри читання або запису при налаштуванні каналу rp2.DMA().