class StateMachine -- RP2040 のプログラマブル I/O インターフェースへのアクセス

StateMachine クラスは、RP2040 の PIO(プログラマブル I/O)インターフェースへのアクセスを提供します。

PIO プログラムのアセンブルについては rp2.asm_pio() を参照してください。

コンストラクタ

class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)

番号 id のステートマシンを取得します。RP2040 には同一の PIO インスタンスが 2 つあり、それぞれに 4 つのステートマシンがあります。したがって合計で 8 つのステートマシンがあり、0 から 7 までの番号が付けられています。

オプションで、指定したプログラム program で初期化します。StateMachine.init を参照してください。

init(program: Callable, freq: int = -1, *, in_base: machine.Pin | None = None, out_base: machine.Pin | None = None, set_base: machine.Pin | None = None, jmp_pin: machine.Pin | None = None, sideset_base: machine.Pin | None = None, in_shiftdir: int | None = None, out_shiftdir: int | None = None, push_thresh: int | None = None, pull_thresh: int | None = None) None

指定した program を実行するようにステートマシンインスタンスを構成します。

プログラムはこの PIO インスタンスの命令メモリに追加されます。命令メモリにすでにこのプログラムが含まれている場合、命令メモリを節約するためにそのオフセットが再利用されます。

  • freq はステートマシンを動作させる周波数(Hz)です。既定ではシステムクロック周波数になります。

    クロック分周比は system clock frequency / 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 は、自動プルまたは条件付き再プルがトリガーされる前のしきい値(ビット単位)です。

注意: in_base に使用するピンは、PIO が目的の信号を参照できるように、入力(またはその他)として手動で構成する必要があります(入力ピン、出力ピン、または別のペリフェラルに接続されたピンのいずれでもかまいません)。jmp_pin も手動で構成できますが、既定では入力ピンになります。

active(value: bool | int | None = None, /) bool

ステートマシンが現在動作中かどうかを取得または設定します。

>>> sm.active()
True
>>> sm.active(0)
False
restart() None

ステートマシンを再起動し、プログラムの先頭にジャンプします。

このメソッドは、RP2040 の SM_RESTART レジスタを使用してステートマシンの内部状態をクリアします。これには以下が含まれます:

  • 入力および出力シフトカウンタ

  • 入力シフトレジスタの内容

  • ディレイカウンタ

  • IRQ 待機状態

  • StateMachine.exec() を使用して実行され、ストールした命令

exec(instr: str | int) None

単一の PIO 命令を実行します。

instr が文字列の場合、asm_pio_encode を使用して指定した文字列から命令をエンコードします。

>>> sm.exec("set(0, 1)")

instr が整数の場合、すでにエンコードされた PIO マシンコード命令として扱われ、実行されます。

>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
get(buf: 'bytearray | array | None' = None, shift: int = 0) int

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

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

値は返される前に shift ビット右シフトされます。すなわち戻り値は word >> shift になります。

put(value: 'int | bytes | bytearray | array', shift: int = 0) None

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

value は整数、型 BHI の配列、または bytearray を指定できます。

このメソッドは、すべてのワードが FIFO に書き込まれるまでブロックします。FIFO が満杯である、または満杯になった場合、ステートマシンが書き込みを完了するのに十分なワードをプルするまでメソッドはブロックします。

各ワードはまず shift ビット左シフトされます。すなわちステートマシンは word << shift を受け取ります。

rx_fifo() int

ステートマシンの RX FIFO 内のワード数を返します。0 の値は FIFO が空であることを示します。

StateMachine.get() を呼び出す前に、読み取り待ちのデータがあるかどうかを確認するのに便利です。

tx_fifo() int

ステートマシンの TX FIFO 内のワード数を返します。0 の値は FIFO が空であることを示します。

StateMachine.put() を使用して別のワードをプッシュする空きがあるかどうかを確認するのに便利です。

irq(handler: Callable[[StateMachine], None] | None = None, trigger: int = 0 | 1, hard: bool = False) Callable

指定した StateMachine の IRQ オブジェクトを返します。

オプションで構成します。

バッファプロトコル

StateMachine クラスは buffer protocol をサポートしており、各ステートマシンの送信および受信 FIFO への直接アクセスを可能にします。これは主に、rp2.DMA() チャネルを構成する際に StateMachine オブジェクトを読み取りまたは書き込みパラメータとして直接渡せるようにするためのものです。