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 не равен 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).

Классы