клас 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– це локальний індекс стейт-машини (0–3).Якщо
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. Стейт-машина більше не зможе отримувати дані.