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_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 は、自動プルまたは条件付き再プルがトリガーされる前のしきい値(ビット単位)です。
注意: 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 は整数、型
B、H、Iの配列、またはbytearrayを指定できます。このメソッドは、すべてのワードが FIFO に書き込まれるまでブロックします。FIFO が満杯である、または満杯になった場合、ステートマシンが書き込みを完了するのに十分なワードをプルするまでメソッドはブロックします。
各ワードはまず shift ビット左シフトされます。すなわちステートマシンは
word << shiftを受け取ります。
- rx_fifo() int¶
ステートマシンの RX FIFO 内のワード数を返します。0 の値は FIFO が空であることを示します。
StateMachine.get()を呼び出す前に、読み取り待ちのデータがあるかどうかを確認するのに便利です。
- tx_fifo() int¶
ステートマシンの TX FIFO 内のワード数を返します。0 の値は FIFO が空であることを示します。
StateMachine.put()を使用して別のワードをプッシュする空きがあるかどうかを確認するのに便利です。
バッファプロトコル¶
StateMachine クラスは buffer protocol をサポートしており、各ステートマシンの送信および受信 FIFO への直接アクセスを可能にします。これは主に、rp2.DMA() チャネルを構成する際に StateMachine オブジェクトを読み取りまたは書き込みパラメータとして直接渡せるようにするためのものです。