クラス StateMachine -- RP2040 のプログラム可能 I/O インタフェースへのインタフェース¶
StateMachine
クラスは RP2040 の PIO (プログラム可能 I/O)インタフェースへのアクセスを提供します。
PIO プログラムのアセンブルについては rp2.asm_pio()
を参照してください。
コンストラクタ¶
- class rp2.StateMachine(id[, program, ...])¶
id で指定した番号のステートマシンを取得します。RP2040 には各 PIO インスタンスに4つのステートマシンがあります: したがって、0 から 7 までの番号の付いた合計8つのステートマシンがあります。
引数 program を指定すると、指定のプログラムでステートマシンを初期化します。
StateMachine.init
を参照してください。
メソッド¶
- StateMachine.init(program, freq=-1, *, in_base=None, out_base=None, set_base=None, jmp_pin=None, sideset_base=None, in_shiftdir=None, out_shiftdir=None, push_thresh=None, pull_thresh=None)¶
指定したプログラム program を実行するようにステートマシンインスタンスを構成します。
プログラムは、この PIO インスタンスの命令メモリに追加されます。命令メモリがこのプログラムをすでに含んでいる場合、そのオフセットは命令メモリを節約するために再利用されます。
freq は、ステートマシンを実行する周波数(Hz)です。デフォルトはシステムクロック周波数です。
クロック分周は
システムクロック周波数 / freq
として計算されるため、わずかな丸め誤差が発生する可能性があります。可能な最小クロック分周は、システムクロックの65536分の1です。したがって、デフォルトのシステムクロック周波数 125MHz では freq の最小値は
1908
になります。ステートマシンをより遅い周波数で実行するにはmachine.freq()
でシステムクロック速度を下げる必要があります。in_base は
in()
命令に使う先頭のピンです。out_base は
out()
命令に使う先頭のピンです。set_base は
set()
命令に使う先頭のピンです。jmp_pin は
jmp(pin, ...)
命令に使う先頭のピンです。sideset_base はサイドセットに使う先頭のピンです。
in_shiftdir は ISR がシフトする方向です。
PIO.SHIFT_LEFT
またはPIO.SHIFT_RIGHT
のどちらかを指定します。out_shiftdir は OSR がシフトする方向です。
PIO.SHIFT_LEFT
またはPIO.SHIFT_RIGHT
のどちらかを指定します。push_thresh は、自動プッシュまたは条件付き再プッシュが起きる閾値をビット数で指定します。
pull_thresh は、自動プルまたは条件付き再プルが起きる閾値をビット数で指定します。
- StateMachine.active([value])¶
ステートマシンが現在実行されているかどうかを取得または設定します。
>>> sm.active() True >>> sm.active(0) False
- StateMachine.restart()¶
ステートマシンを再起動し、プログラムの先頭にジャンプします。
このメソッドは、RP2040 の
SM_RESTART
レジスタを使ってステートマシンの内部状態をクリアします。クリアする内部状態は次のものです:入力および出力シフトカウンター
入力シフトレジスタの内容
遅延カウンター
IRQ 待機状態
StateMachine.exec()
で実行してストールした命令
- StateMachine.exec(instr)¶
単一の PIO 命令を実行します。
instr が文字列の場合、
asm_pio_encode
を使って文字列から命令にエンコードします。>>> sm.exec("set(0, 1)")
instr が整数の場合、エンコード済の PIO 機械語命令として扱い、実行します。
>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
- StateMachine.get(buf=None, shift=0)¶
ステートマシンの RX FIFO からワードをプルします。
FIFO が空の場合、データが到着するまで(つまり、ステートマシンがワードをプッシュするまで)ブロックします。
値は、戻る前に shift ビットだけ右にシフトされます。つまり、戻り値は
word >> shift
となります。
- StateMachine.put(value, shift=0)¶
ステートマシンの TX FIFO にワードをプッシュします。
value には、整数、型が
B
,H
,I
の配列、bytearray
のいずれかを指定できます。このメソッドは、すべてのワードが FIFO に書き込まれるまでブロックされます。 FIFOが満杯の場合、または満杯になった場合、このメソッドは、ステートマシンが書き込みを完了するのに十分なワードをプルするまでブロックされます。
各ワードは最初に shift ビットだけ左にシフトされます。つまり、ステートマシンは
word << shift
を受け取ります。
- StateMachine.rx_fifo()¶
ステートマシンの RX FIFO 内のワード数を返します。値が 0 であることは FIFO が空であることを示します。
StateMachine.get()
を呼び出す前に、データの読取りを待機しているかを確認するのに利用できます。
- StateMachine.tx_fifo()¶
ステートマシンの TX FIFO 内のワード数を返します。値が 0 であることは FIFO が空であることを示します。
StateMachine.put()
を使ってワードをプッシュするスペースがあるかどうかを確認するのに利用できます。
- StateMachine.irq(handler=None, trigger=0 | 1, hard=False)¶
指定した StateMachine の IRQ オブジェクトを返します。
IRQ インスタンスは指定の引数で構成されます。
バッファプロトコル¶
StateMachine クラスは buffer protocol
をサポートしており、各ステートマシンの送信および受信 FIFO に直接アクセスできます。これは主に rp2.DMA()
チャネルを構成する際に、StateMachine オブジェクトを直接読み込みまたは書き出しパラメータとして渡すことを可能にするためです。