クラス 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_basein() 命令に使う先頭のピンです。

  • out_baseout() 命令に使う先頭のピンです。

  • set_baseset() 命令に使う先頭のピンです。

  • jmp_pinjmp(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)")
StateMachine.get(buf=None, shift=0)

ステートマシンの RX FIFO からワードをプルします。

FIFO が空の場合、データが到着するまで(つまり、ステートマシンがワードをプッシュするまで)ブロックします。

値は、戻る前に shift ビットだけ右にシフトされます。つまり、戻り値は word >> shift となります。

StateMachine.put(value, shift=0)

ステートマシンの TX FIFO にワードをプッシュします。

FIFO がいっぱいになると、スペースができるまでブロックされます(つまり、ステートマシンがワードをプルします)。

値は最初に shift シフトビットによって左にシフトされます。つまり、ステートマシンは value << 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 インスタンスは指定の引数で構成されます。