RP2040 PIO レジスタと Pico SDK 覚え書き
詳細はデータシート参照のこと
- https://datasheets.raspberrypi.org/rp2040/rp2040-datasheet.pdf
- https://raspberrypi.github.io/pico-sdk-doxygen/group__hardware__pio.html
- レジスタと関連なし
- CTRL
- FSTAT
- FDEBUG
- FLEVEL
- TXF0, TXF1, TXF2, TXF3
- RXF0, RXF1, RXF2, RXF3
- IRQ
- IRQ_FORCE
- INPUT_SYNC_BYPASS
- DBG_PADOUT
- DBG_PADOE
- DBG_CFGINFO
- INSTR_MEM0, INSTR_MEM1, ... INSTR_MEM30, INSTR_MEM31
- SM0_CLKDIV, SM1_CLKDIV, SM2_CLKDIV, SM3_CLKDIV
- SM0_EXECCTRL, SM1_EXECCTRL, SM2_EXECCTRL, SM3_EXECCTRL
- SM0_SHIFTCTRL, SM1_SHIFTCTRL, SM2_SHIFTCTRL, SM3_SHIFTCTRL
- SM0_ADDR, SM1_ADDR, SM2_ADDR, SM3_ADDR
- SM0_PINCTRL, SM1_PINCTRL, SM2_PINCTRL, SM3_PINCTRL
- INTR
- IRQ0_INTE
- IRQ0_INTF
- IRQ0_INTS
レジスタと関連なし
-
- pio0
- pio ブロック 0
- pio1
- pio ブロック 1
- pio0
-
- pio_get_default_sm_config
- デフォルト値を持つ pio_sm_config 構造体を返す
- pio_sm_set_config
- ステートマシンの設定をステートマシンに適用する
- pio_get_index
- PIO のインスタンス番号を返す
- pio_gpio_init
- 出力のために GPIO を設定する
- output に必要だ
- input のみなら設定しなくてもステートマシンからピンの状態を読み出せる
- pio_get_dreq
- TX または RX の DREQ (Data Request) を返す
- DREQ は System DREQ Table (RP2040 リファレンス参照) で定義されている番号
- pio_get_default_sm_config
CTRL
- CTRL
-
- pio_sm_init
- ステートマシンを初期化する
- pio_sm_set_enabled
- 指定したステートマシンを有効/無効にする
- pio_set_sm_mask_enabled
- マスクで指定したステートマシンを有効/無効にする
- pio_enable_sm_mask_in_sync
- マスクで指定したステートマシンを同期して開始する
- pio_set_sm_mask_enabled の次に pio_clkdiv_restart_sm_mask を呼ぶのと同じ結果
- pio_sm_restart
- 指定したステートマシンを再起動する
- ステートマシンの状態は初期化される
- pio_restart_sm_mask
- マスクで指定したステートマシンを再起動する
- pio_sm_clkdiv_restart
- クロック分割器を再起動する
- pio_clkdiv_restart_sm_mask
- 複数のステートマシンのクロック分割器を再起動する
- 複数のステートマシンを同期させられる
- pio_sm_init
FSTAT
FDEBUG
TXF0, TXF1, TXF2, TXF3
RXF0, RXF1, RXF2, RXF3
IRQ_FORCE
INPUT_SYNC_BYPASS
- INPUT_SYNC_BYPASS
- GPIO 入力の 2-フリップフロップ同期回路をバイパスする。
- 同期しつつ相当高速にしたい場合に使用する。
DBG_PADOUT
- DBG_PADOUT
- 現在 PIO が駆動している GPIO の状態を読み出す。
DBG_PADOE
- DBG_PADOE
- 現在 PIO の出力が有効な (方向) GPIO の状態を読み出す。
DBG_CFGINFO
INSTR_MEM0, INSTR_MEM1, ... INSTR_MEM30, INSTR_MEM31
- INSTR_MEM0, INSTR_MEM1, ... INSTR_MEM30, INSTR_MEM31
- 命令メモリ、書き込み専用
-
- pio_can_add_program
- 指定のプログラムが命令メモリに入るかどうか確認する
- pio_can_add_program_at_offset
- 指定のプログラムが命令メモリの指定の位置からメモリに入るかどうか確認する
- pio_remove_program
- 命令メモリからオフセットを開始位置として指定のプログラムを削除する
- pio_clear_instruction_memory
- 命令メモリを空にする
- pio_can_add_program
SM0_CLKDIV, SM1_CLKDIV, SM2_CLKDIV, SM3_CLKDIV
- SM0_CLKDIV, SM1_CLKDIV, SM2_CLKDIV, SM3_CLKDIV
- クロック分割レジスタ
- 周波数 = クロック周波数 / (CLKDIV_INT + CLKDIV_FRAC / 256)
- INT
- 整数部。0 は 65536 とみなされる。INT が 0 の時は FRAC もゼロのこと
- FRAC
- 小数部
-
- sm_config_set_clkdiv_int_frac
- クロック分割の整数部と小数部を設定する
- sm_config_set_clkdiv
- クロック分割を設定する、整数部と小数部に分割して設定される
- pio_sm_set_clkdiv_int_frac
- クロック分割の整数部と小数部を設定する
- pio_sm_set_clkdiv
- クロック分割を設定する、整数部と小数部に分割して設定される
- sm_config_set_clkdiv_int_frac
SM0_EXECCTRL, SM1_EXECCTRL, SM2_EXECCTRL, SM3_EXECCTRL
- SM0_EXECCTRL, SM1_EXECCTRL, SM2_EXECCTRL, SM3_EXECCTRL
- 動作と挙動設定
- EXEC_STALLED
- 1 のとき、SMx_INSTR に書き込まれた命令がストール
- SIDE_EN
- 1 のとき、Delay/Side-set フィールドの MSB がサイドセットの有効/無効を表す
- サイドセットをオプションにできるが、サイドセットのビット数が減る
- SIDE_PINDIR
- 1 のとき、データはピンの方向指定となる (このとき、ピンの値の設定はできない、どちらか一方のみ)
- JMP_PIN
- JMP PIN の条件の GPIO 番号。マッピングに影響されない
- OUT_EN_SEL
- インライン OUT を有効にするためのデータビットを指定
- INLINE_OUT_EN
- 1 のとき、データの 1 つのビットを補助的な書き込み有効設定に使用する。
- 複数のステートマシンが同時に同じピンに出力する場合、インラインアウト指定になっているステートマシンからの出力が、インラインアウト指定なしのステートマシンからの出力より優先される。
- 複数のステートマシンでインラインアウトが指定されている場合、ステートマシン番号の大きな方が優先される。これはインラインアウトの指定の無い場合の優先順位と同じ。
- https://www.raspberrypi.org/forums/viewtopic.php?t=313962
- OUT_STICKY
- OUT_EN_SELで指定したビットがゼロでも、インラインアウトで最後に指定されたピンへの OUT/SET が継続的にアサートされる
- WRAP_TOP
- WRAP_TOP は終了インデックス。WRAP_BOTTOM との間を繰り返す
- 命令がジャンプの場合、ジャンプの条件が真ならジャンプが優先される
- pioasm では .wrap_target で生成される
- WRAP_BOTTOM
- WRAP_BOTTOM は開始インデックス。WRAP_TOP との間を繰り返す
- pioams では .wrap で生成される
- STATUS_SEL
- STATUS_N
- 比較用 N
-
- sm_config_set_out_special
- 特別な OUT 動作について設定する
- sm_config_set_wrap
- ラップアドレスを設定する
- sm_config_set_jmp_pin
- JMP PIN で使用される GPIO ピンを設定する
- ピンは絶対番号で指定する、ピンマッピングのベースに影響を受けない
- sm_config_set_mov_status
- MOV STATUS で使用する条件と N を設定する
- sm_config_set_out_special
-
- pio_sm_is_exec_stalled
- pio_sm_exec で実行された命令がストール状態かどうか返す
- pio_sm_set_wrap
- ラップアドレスを設定する
- pio_sm_is_exec_stalled
SM0_SHIFTCTRL, SM1_SHIFTCTRL, SM2_SHIFTCTRL, SM3_SHIFTCTRL
- SM0_SHIFTCTRL, SM1_SHIFTCTRL, SM2_SHIFTCTRL, SM3_SHIFTCTRL
- 入出力シフトレジスタの動作制御
- FJOIN_RX
- FJOIN_TX
- PULL_THRESH
- オートプルまたは条件付きプル (PULL IFEMPTY) 動作までにシフトアウトされるビット数。0 は 32 と解釈される
- PUSH_THRESH
- オートプッシュまたは条件付きプッシュ (PUSH IFFULL) 動作までにシフトインされるビット数。0 は 32 と解釈される
- OUT_SHIFTDIR
- 1 のとき右シフト、0 のとき左シフト
- IN_SHIFTDIR
- 1 のとき右シフト(データは左から入る)、0 のとき左シフト
- AUTOPULL
- 出力シフトレジスタが空になったとき、自動的にプルされる
- OUT 命令で出力シフトカウンタが PULL_THRESH に到達または超えた時
- AUTOPUSH
- 入力シフトレジスタに入力があったとき、自動的にプッシュされる
- IN 命令で入力シフトカウンタが PUSH_THRESH に到達または超えた時
SM0_ADDR, SM1_ADDR, SM2_ADDR, SM3_ADDR
- SM0_ADDR, SM1_ADDR, SM2_ADDR, SM3_ADDR
- 現在の命令アドレス
-
- pio_sm_get_pc
- 現在のプログラムカウンタ (命令アドレス) を設定する
- pio_sm_get_pc
- SM0_INSTR, SM1_INSTR, SM2_INSTR, SM3_INSTR
- 現在ステートマシンに割り当てられている命令
- このレジスタに書き込むとすぐに実行され、復帰する
-
- pio_sm_exec
- 命令を即座に実行する
- pio_sm_exec_wait_blocking
- 命令を即座に実行して完了するまで待つ
- pio_sm_exec
SM0_PINCTRL, SM1_PINCTRL, SM2_PINCTRL, SM3_PINCTRL
- SM0_PINCTRL, SM1_PINCTRL, SM2_PINCTRL, SM3_PINCTRL
- ステートマシンのピン制御
- SIDESET_COUNT
- サイドセットに使用する Delay/Side-set フィールドの MSB 側のビット数
- 0 (すべてディレイ、サイドセットなし) から 5 (すべてサイドセット、ディレイなし)
- SET_COUNT
- SET でアサートされるピン数、0-5
- OUT_COUNT
- OUT PINS, OUT PINDIRS, MOV PINS 命令でアサートされるピン数、0-32
- IN_BASE
- ステートマシンの IN データバスの最下位ビットにマップされるピン
- 上位のビットのピンは連続的にマップされる
- ピン番号の 32 の剰余が使われるので、32 は 0 番ピン
- SIDESET_BASE
- サイドセットの一番小さな番号のピンを指定
- サイドセット指定の最下位ビットがこのピンに相当する。より上位のビットはより大きな番号のピンに相当する
- SET_BASE
- SET PINS または SET PINDIRS 命令の一番小さな番号のピンを指定
- このピンに書き込まれるのは SET のデータの最下位ビット
- OUT_BASE
- OUT PINS または OUT PINDIRS または MOV PINS 命令の一番小さな番号のピンを指定
- このピンに書き込まれるデータは OUT または MOV のデータの最下位ビット
-
- sm_config_set_out_pins
- OUT ピンについて設定する
- sm_config_set_set_pins
- SET ピンについて設定する
- sm_config_set_in_pins
- IN ピンについて設定する
- sm_config_set_sideset_pins
- サイドセットピンについて設定する
- sm_config_set_sideset
- サイドセットについて設定する
- サイドセットに使われるビット数、サイドセットがオプションかどうか、ピンの方向設定に使用するかどうか
- sm_config_set_out_pins
-
- pio_sm_set_out_pins
- OUT ピンについて設定する
- pio_sm_set_set_pins
- SET ピンについて設定する
- pio_sm_set_in_pins
- IN ピンについて設定する
- pio_sm_set_sideset_pins
- サイドセットピンについて設定する
- pio_sm_set_out_pins
-
- pio_sm_set_pins
- すべての 32 ピンについて設定する
- SET 命令で実行される
- 初期値の設定に使用できる、実行中のステートマシンに対して使用すべきではない
- pio_sm_set_pins_with_mask
- マスクで選択したピンについて値を設定する、後はマスクしない pio_sm_set_pins 関数と同じ
- pio_sm_set_pindirs_with_mask
- マスクで選択したピンについてピンの方向を設定する
- SET 命令で実行される
- pio_sm_set_consecutive_pindirs
- 連続したピンについてピンの方向を同じ方向に設定する
- SET 命令で実行される
- pio_sm_set_pins
INTR
- INTR
- 割り込みソースの有効/無効
IRQ0_INTE
- IRQ0_INTE
- irq0 用の割り込み有効/無効
IRQ0_INTF
- IRQ0_INTF
- irq0 用の割り込み強制
IRQ0_INTS
- IRQ0_INTS
- irq0 用のマスクと強制の後のステータス
irq1 は省略。
PIO ブロックごとに irq0 と irq1 があり、これら2つはシステムの割り込み。
それぞれの irq はソースを選択できる。
-
- pio_set_irq0_source_enabled
- irq0 のソースのうち一つを有効/無効にする
- pio_set_irq1_source_enabled
- irq1 のソースのうち一つを有効/無効にする
- pio_set_irq0_source_mask_enabled
- irq0 のマスクで指定したソースすべてを有効/無効にする
- pio_set_irq1_source_mask_enabled
- irq1 のマスクで指定したソースすべてを有効/無効にする
- pio_set_irqn_source_enabled
- irqn のソースのうち一つを有効/無効にする
- pio_set_irqn_source_mask_enabled
- irqn のマスクで指定したソースすべてを有効/無効にする
- pio_set_irq0_source_enabled