rp2 — функциональность, специфичная для RP2040¶
Модуль rp2 содержит функции и классы, специфичные для RP2040, который используется в Raspberry Pi Pico.
Дополнительную информацию см. в документации RP2040 Python, а примеры кода — в pico-micropython-examples.
Инструкции языка ассемблера PIO¶
Конечные автоматы PIO программируются на специальном языке ассемблера с девятью основными инструкциями PIO-машины. В MicroPython подпрограммы ассемблера PIO пишутся как функция Python с декоратором @rp2.asm_pio() и используют синтаксис Python. Такие подпрограммы поддерживают стандартные переменные и арифметику Python, а также следующие специальные функции, которые кодируют инструкции PIO и управляют ассемблером. Дополнительные сведения см. в разделе 3.4 документации RP2040.
- wrap_target()
Указывает место, в котором продолжается выполнение после перехода в начало программы (wrapping). По умолчанию это начало подпрограммы 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_baseобъекта StateMachine),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).