клас PIO – розширене використання PIO

Клас PIO охоплює один із двох блоків програмованого вводу/виводу (PIO) RP2040. Кожен блок PIO містить пам’ять інструкцій (32 інструкції), спільну для чотирьох незалежних стейт-машин, а також приватний інтерфейс FIFO для кожної стейт-машини та контролер переривань.

Більшість скриптів взаємодіють з PIO через StateMachine – цей клас призначений для розширених випадків використання, коли потрібно:

  • Завантажувати та видаляти програми явно через add_program() / remove_program().

  • Переміщувати GPIO-базу PIO у межах 32-контактного вікна чіпа через gpio_base().

  • Підключатись до прапорців переривань рівня блоку через irq().

Для складання PIO-програм дивіться rp2.asm_pio().

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

class rp2.PIO(id: int)

Повертає одиночний об’єкт PIO для блоку PIO, ідентифікованого як id. RP2040 має два блоки PIO, пронумерованих 0 та 1. Для будь-якого іншого id піднімається ValueError.

Методи

gpio_base(base: machine.Pin | int | None = None, /) int

Отримує або встановлює GPIO-базу для цього блоку PIO.

PIO RP2040 бачить 32-контактне вікно у просторі GPIO; вікно може починатися з GPIO0 або GPIO16. База визначає, яке вікно діє для всіх стейт-машин цього PIO.

Без аргументів повертає поточну базу (номер GPIO-виводу, 0 або 16).

З аргументом встановлює базу. base може бути екземпляром machine.Pin або цілочисельним номером виводу, і має відповідати GPIO0 або GPIO16. База повинна бути встановлена перед додаванням будь-якої програми або побудовою стейт-машини на цьому блоці PIO.

add_program(program: Callable) None

Завантажує program у пам’ять інструкцій цього PIO. Отримане розташування в пам’яті повторно використовується всіма стейт-машинами на цьому блоці PIO.

Кожен PIO має лише 32 інструкції пам’яті програм, які розподіляються між усіма програмами; якщо нова програма не вміщується, цей метод піднімає OSError(ENOMEM). Одну і ту ж програму можна завантажити на обидва екземпляри PIO, але вони займають окремі регіони пам’яті.

remove_program(program: Callable | None = None, /) None

Видаляє program із пам’яті інструкцій цього PIO, звільняючи місце для нових програм. Якщо program пропущено, видаляються всі програми, що наразі завантажені на цей PIO.

Видалення незавантаженої програми є холостою операцією (виняток не генерується).

state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine

Повертає один із чотирьох екземплярів StateMachine, що належать цьому блоку PIO. id – це локальний індекс стейт-машини (03).

Якщо program вказано, стейт-машина налаштовується для його виконання – усі позиційні/іменовані аргументи передаються до StateMachine.init().

Приклад:

>>> rp2.PIO(1).state_machine(3)
StateMachine(7)

Глобальний ідентифікатор стейт-машини поверненого об’єкта дорівнює pio_id * 4 + sm_id.

irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable

Отримує або налаштовує переривання рівня блоку для цього PIO.

handler – зворотний виклик, що спрацьовує, коли будь-яке із запрошених переривань стейт-машини фіксується. Обробник отримує цей екземпляр PIO як єдиний аргумент; всередині обробника стейт-машини, що спрацювали, можна ідентифікувати через self.irq().flags() з побітовим AND з константами IRQ_SM*.

trigger – бітова маска одного або кількох IRQ_SM0 .. IRQ_SM3. За замовчуванням спрацьовує на будь-яку стейт-машину.

hard=True реєструє жорсткий обробник переривань (без виділення пам’яті в зворотному виклику).

MicroPython прив’язує переривання IRQ 0 на кожному блоці PIO; IRQ 1 зарезервоване і недоступне з Python.

Константи

IN_LOW: int

Передайте до out_init / set_init / sideset_init функції asm_pio(), щоб вивід починав роботу як вхід з низьким рівнем (тобто у стані тривимірної шини з вихідним буфером, що утримує 0).

IN_HIGH: int

Передайте до out_init / set_init / sideset_init функції asm_pio(), щоб вивід починав роботу як вхід з вихідним буфером, що утримує 1.

OUT_LOW: int

Передайте до out_init / set_init / sideset_init функції asm_pio(), щоб вивід починав роботу як керований вихід з логічним рівнем 0.

OUT_HIGH: int

Передайте до out_init / set_init / sideset_init функції asm_pio(), щоб вивід починав роботу як керований вихід з логічним рівнем 1.

SHIFT_LEFT: int

Передайте до in_shiftdir / out_shiftdir функції asm_pio() або StateMachine.init(), щоб зсуви переміщували біти у бік старшого біта (MSB).

SHIFT_RIGHT: int

Передайте до in_shiftdir / out_shiftdir функції asm_pio() або StateMachine.init(), щоб зсуви переміщували біти у бік молодшого біта (LSB).

JOIN_NONE: int

Передайте до fifo_join функції asm_pio(), щоб стейт-машина мала окремі 4-слівні FIFO для TX та RX (за замовчуванням).

JOIN_TX: int

Передайте до fifo_join функції asm_pio(), щоб TX FIFO подвоїлось до 8 слів за рахунок поглинання RX FIFO. Стейт-машина більше не зможе отримувати дані.

JOIN_RX: int

Передайте до fifo_join функції asm_pio(), щоб RX FIFO подвоїлось до 8 слів за рахунок поглинання TX FIFO. Стейт-машина більше не зможе передавати дані.

IRQ_SM0: int

Прапорець trigger irq(): стейт-машина 0 підняла своє переривання.

IRQ_SM1: int

Прапорець trigger irq(): стейт-машина 1 підняла своє переривання.

IRQ_SM2: int

Прапорець trigger irq(): стейт-машина 2 підняла своє переривання.

IRQ_SM3: int

Прапорець trigger irq(): стейт-машина 3 підняла своє переривання.