rp2 — функціональність, специфічна для RP2040

Модуль rp2 містить функції та класи, специфічні для RP2040, що використовується в Raspberry Pi Pico.

Детальніше дивіться в технічному описі Python для RP2040, а приклади коду — у pico-micropython-examples.

Інструкції мови асемблера PIO

Стан-машини PIO програмуються на спеціальній мові асемблера з дев’ятьма базовими інструкціями PIO-машини. У MicroPython програми-асемблери PIO пишуться як функції Python з декоратором @rp2.asm_pio() та використовують синтаксис Python. Такі програми підтримують стандартні змінні та арифметичні операції Python, а також наступні спеціальні функції для кодування інструкцій PIO та керування компілятором. Детальніше дивіться розділ 3.4 технічного опису RP2040.

wrap_target()

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

wrap()

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

label(label)

Визначити мітку з іменем label у поточному місці. label може бути рядком або цілим числом.

word(instr, label=None)

Вставити довільне 16-бітне слово у скомпільований вивід.

  • instr: 16-бітне значення

  • label: якщо задано, знайти мітку та виконати логічне АБО її значення з instr

jmp(…)

Ця інструкція має два варіанти:

jmp(label)
  • label: мітка для безумовного переходу

jmp(cond, label)
  • cond: умова для перевірки, одна з:

    • not_x, not_y: істинно, якщо регістр дорівнює нулю

    • x_dec, y_dec: істинно, якщо регістр не дорівнює нулю, з подальшим декрементом

    • x_not_y: істинно, якщо X не дорівнює Y

    • pin: істинно, якщо вхідний вивід встановлений

    • not_osre: істинно, якщо OSR не порожній (не досяг свого порогу)

  • label: мітка для переходу, якщо умова істинна

wait(polarity, src, index)

Блокувати виконання, очікуючи на високий/низький рівень на виводі або лінії IRQ.

  • polarity: 0 або 1 — очікувати на низький або високий рівень

  • src: одне з: gpio (абсолютний вивід), pin (вивід відносно аргументу in_base StateMachine), irq

  • index: 0–31, індекс для src

in_(src, bit_count)

Зсунути дані з src у ISR.

  • src: одне з: pins, x, y, null, isr, osr

  • bit_count: кількість бітів для зсуву (1–32)

out(dest, bit_count)

Зсунути дані з OSR у dest.

  • dest: одне з: pins, x, y, pindirs, pc, isr, exec

  • bit_count: кількість бітів для зсуву (1–32)

push(…)

Виштовхнути ISR у RX FIFO, потім очистити ISR до нуля. Ця інструкція має такі варіанти:

  • push()

  • push(block)

  • push(noblock)

  • push(iffull)

  • push(iffull, block)

  • push(iffull, noblock)

Якщо вказано block, інструкція зупиняється, якщо RX FIFO повний. За замовчуванням блокує. Якщо вказано iffull, виштовхування відбувається лише тоді, коли лічильник вхідного зсуву досяг свого порогу.

pull(…)

Витягнути з TX FIFO у OSR. Ця інструкція має такі варіанти:

  • pull()

  • pull(block)

  • pull(noblock)

  • pull(ifempty)

  • pull(ifempty, block)

  • pull(ifempty, noblock)

Якщо вказано block, інструкція зупиняється, якщо TX FIFO порожній. За замовчуванням блокує. Якщо вказано ifempty, витягування відбувається лише тоді, коли лічильник вихідного зсуву досяг свого порогу.

mov(dest, src)

Перемістити у dest значення з src.

  • dest: одне з: pins, x, y, exec, pc, isr, osr

  • src: одне з: pins, x, y, null, status, isr, osr; цей аргумент можна за бажанням змінити, обгорнувши його в invert() або reverse() (але не обидва разом)

irq(…)

Встановити або скинути прапор IRQ. Ця інструкція має два варіанти:

irq(index)
  • index: 0–7, або від rel(0) до rel(7)

irq(mode, index)
  • mode: одне з: block, clear

  • index: 0–7, або від rel(0) до rel(7)

Якщо вказано block, інструкція зупиняється, поки прапор не буде скинуто іншим суб’єктом. Якщо вказано clear, прапор скидається замість встановлення. Відносні індекси IRQ додають ідентифікатор стан-машини до індексу IRQ за допомогою додавання за модулем 4. IRQ 0–3 видимі для процесора, 4–7 — внутрішні для стан-машин.

set(dest, data)

Встановити dest зі значенням data.

  • dest: pins, x, y, pindirs

  • data: значення (0–31)

nop()

Це псевдоінструкція, яка компілюється як mov(y, y) і не має побічних ефектів.

.side(value)

Це модифікатор, який можна застосувати до будь-якої інструкції та використовується для керування значеннями бокових виводів (side-set).

  • value: значення (біти) для виведення на side-set виводи

.delay(value)

Це модифікатор, який можна застосувати до будь-якої інструкції та визначає, скільки циклів потрібно затримати після виконання інструкції.

  • value: цикли затримки, 0–31 (максимальне значення зменшується, якщо використовуються side-set виводи)

[value]

Це модифікатор, еквівалентний .delay(value).

Класи