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(StateMachine のin_base引数に対する相対的なピン)、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)
src の値を dest に移動します。
dest: 次のいずれか:
pins、x、y、exec、pc、isr、osrsrc: 次のいずれか:
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、clearindex: 0~7、または
rel(0)からrel(7)
blockを使用すると、フラグが別のエンティティによってクリアされるまで命令はストールします。clearを使用すると、フラグはセットされる代わりにクリアされます。相対的な IRQ インデックスは、ステートマシン ID を 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)と同等です。