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 не дорівнює Ypin: істинно, якщо вхідний вивід встановленийnot_osre: істинно, якщо OSR не порожній (не досяг свого порогу)
label: мітка для переходу, якщо умова істинна
- wait(polarity, src, index)
Блокувати виконання, очікуючи на високий/низький рівень на виводі або лінії IRQ.
polarity: 0 або 1 — очікувати на низький або високий рівень
src: одне з:
gpio(абсолютний вивід),pin(вивід відносно аргументуin_baseStateMachine),irqindex: 0–31, індекс для src
- in_(src, bit_count)
Зсунути дані з src у ISR.
src: одне з:
pins,x,y,null,isr,osrbit_count: кількість бітів для зсуву (1–32)
- out(dest, bit_count)
Зсунути дані з OSR у dest.
dest: одне з:
pins,x,y,pindirs,pc,isr,execbit_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,osrsrc: одне з:
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,clearindex: 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,pindirsdata: значення (0–31)
- nop()
Це псевдоінструкція, яка компілюється як
mov(y, y)і не має побічних ефектів.- .side(value)
Це модифікатор, який можна застосувати до будь-якої інструкції та використовується для керування значеннями бокових виводів (side-set).
value: значення (біти) для виведення на side-set виводи
- .delay(value)
Це модифікатор, який можна застосувати до будь-якої інструкції та визначає, скільки циклів потрібно затримати після виконання інструкції.
value: цикли затримки, 0–31 (максимальне значення зменшується, якщо використовуються side-set виводи)
- [value]
Це модифікатор, еквівалентний
.delay(value).