rp2 --- RP2040 に固有の機能

rp2 モジュールは、Raspberry Pi Pico で使われている RP2040 に固有の関数とクラスを提供します。

詳しくは RP2040 Python データシート を参照してください。サンプルコードについては pico-micropython-examples を参照してください。

PIO アセンブリ言語命令

PIO ステートマシンは、9つのコア PIO マシン命令を持つカスタムアセンブリ言語でプログラムします。MicroPython では、PIOのアセンブリルーチンは、デコレータとして @rp2.asm_pio() 指定した Python の関数として記述し、Python の構文を使います。このルーチンは、Python の標準的な変数と算術をサポートしており、PIO 命令をエンコードしてアセンブラに指示する以下のカスタム関数もサポートしています。詳細は、RP2040 データシートの3.4節を参照してください。

wrap_target()
プログラムの折り返し後に実行を継続する場所を指定します。デフォルトでは、PIO ルーチンの開始点となります。
wrap()
プログラムの終端と折り返しの場所を指定します。この指示が使われない場合は、PIOルーチンの最後に自動的に追加されます。折り返しは実行サイクルを要しません。
label(label)
現在の位置に label という名前のラベルを定義します。 label には文字列または整数を指定します。
word(instr, label=None)

アセンブル出力に任意の16ビットワードを挿入します。

  • instr: 16ビットの値
  • label: 与えられた場合、ラベルを検索し、ラベルの値を instr と論理和します。
jmp(...)

この命令には2つの形式があります:

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 ラインの high/low を待ちます。

  • polarity: 0 または 1。low または high の値を待つかどうか
  • src: gpio (絶対的なピン番号)、 pin (ステートマシンの in_base 引数に対する相対的なピン番号)、 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 が満杯になると、命令はストールします。デフォルトでは block を指定したことになります。 iffull を指定すると、入力シフトカウントが閾値に達した場合にのみプッシュします。

pull(...)

TX FIFO から OSR にプルします。この命令は次のような形をとります:

  • pull()
  • pull(block)
  • pull(noblock)
  • pull(ifempty)
  • pull(ifempty, block)
  • pull(ifempty, noblock)

block を指定すると、TX FIFO が空の場合、命令はストールします。デフォルトでは block を指定したことになります。 ifempty を指定した場合、出力シフトカウントが閾値に達した場合にのみプルします。

mov(dest, src)

src の値を dest に移します。

  • dest: pins, x, y, exec, pc, isr, osr のいずれか
  • src: pins, x, y, null, status, isr, osr のいずれか。この引数は、オプションで invert() または reverse() でラップして変更できます(両方一緒にはできません)。
irq(...)

IRQ フラグを設定する。この命令は2つの形式をとります:"

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 インデックスは、ステートマシンIDを IRQ インデックスに modulo-4 加算したものです。IRQ の 0-3 はプロセッサから見え、4-7 はステートマシンの内部にあります。

set(dest, data)

datadest に設定します。

  • dest: pins, x, y, pindirs のいずれか
  • data: 値 (0-31)
nop()
これは mov(y, y) にアセンブルする擬似命令でサイド効果はありません。
.side(value)

これは任意の命令に適用できる修飾子で、サイドセットピンの値を制御するために使います。

  • value: サイドセットピンに出力する値(ビット)
.delay(value)

これは任意の命令に適用できる修飾子で、その命令が実行された後に何サイクル遅らせるかを指定します。

  • value: 遅らせるサイクル数。0-31 (サイドセットピンを併用している場合、最大値は減少します)
[value]
これは修飾子で、.delay(value)と同等です。