RP2040 PIO レジスタと Pico SDK 覚え書き

詳細はデータシート参照のこと

レジスタと対応する SDK の関数たち。

レジスタと関連なし

    • pio0
      • pio ブロック 0
    • pio1
      • pio ブロック 1
    • pio_get_default_sm_config
      • デフォルト値を持つ pio_sm_config 構造体を返す
    • pio_sm_set_config
      • ステートマシンの設定をステートマシンに適用する
    • pio_get_index
    • pio_gpio_init
      • 出力のために GPIO を設定する
      • output に必要だ
      • input のみなら設定しなくてもステートマシンからピンの状態を読み出せる
    • pio_get_dreq
      • TX または RX の DREQ (Data Request) を返す
      • DREQ は System DREQ Table (RP2040 リファレンス参照) で定義されている番号
    • pio_sm_claim
      • ステートマシンに印をつける。すでに印がついている場合はパニックする
      • ライブラリで同時使用などを検出するために利用できる
      • レジスタと関係なし
    • pio_claim_sm_mask
      • マスクで指定したステートマシンに印をつける
      • レジスタと関係なし
    • pio_sm_unclaim
    • pio_claim_unused_sm
      • 印がついていないステートマシンを探す
      • すべてのステートマシンが使用されている場合に引数でパニックさせることもできる
      • レジスタと関係なし
    • pio_sm_is_claimed
      • 印がついているかどうか確認する
      • レジスタと関係なし

CTRL

  • CTRL
    • PIO コントロールレジスタ
    • ステートマシンごとに指定できる
    • CLKDIV_RESTART
      • ステートマシンの動作クロックを再起動
    • SM_RESTART
      • ステートマシンを初期化して再起動
    • SM_ENABLE
      • ステートマシンの有効/無効を切り替え
    • 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
      • 複数のステートマシンのクロック分割器を再起動する
      • 複数のステートマシンを同期させられる

FSTAT

  • FSTAT
    • FIFO ステータスレジスタ
    • ステートマシンごとにステータスが確認できる
    • TXEMPTY
      • TX が空
    • TXFULL
      • TX が一杯
    • RXEMPTY
      • RX が空
    • RXFULL
      • RX が一杯
    • pio_sm_is_rx_fifo_full
      • RX FIFO が一杯かどうか確認する
    • pio_sm_is_rx_fifo_empty
      • RX FIFO が空かどうか確認する
    • pio_sm_get_rx_fifo_level
    • pio_sm_is_tx_fifo_full
      • TX FIFO が一杯かどうか確認する
    • pio_sm_is_tx_fifo_empty
      • TX FIFO が空かどうか確認する
    • pio_sm_get_tx_fifo_level

FDEBUG

  • FDEBUG
    • FIFO デバッグレジスタ
    • 1 を書き込んでクリアできる。
    • TXSTALL
      • ブロック PULL またはオートプルが有効の OUT により TX FIFO が空でストール中
    • TXOVER
      • TX FIFO がオーバーフロー。
    • RXUNDER
      • RX FIFO がアンダーフロー。
    • RXSTALL
      • ブロック PULL またはオートプッシュが有効の IN により RX FIFO が一杯でストール中

FLEVEL

  • FLEVEL
    • FIFO レベル
    • FIFO の埋まり具合
    • RX3, TX3, RX2, TX2, RX1, TX1, RX0, TX0

TXF0, TXF1, TXF2, TXF3

  • TXF0, TXF1, TXF2, TXF3
    • TX FIFO へのアクセス
    • 一杯の FIFO への書き込みは無効で FDEBUG_TXOVER エラーフラグがセットされる
    • pio_sm_put
      • TX FIFO に書き込む、何も確認しない
    • pio_sm_put_blocking
      • TX FIFO に書き込む、一杯の場合は空きができるまで待つ
    • pio_sm_get
      • RX FIFO から読み出す、何も確認しない、空の RX FIFO から読み出した場合の動作は未定義
    • pio_sm_get_blocking
      • RX FIFO から読み出す、空の場合はデータが入ってくるまで待つ
    • pio_sm_drain_tx_fifo
      • TX FIFO を空にする
      • TX FIFO が空になるまで PULL 命令を実行する

RXF0, RXF1, RXF2, RXF3

  • RXF0, RXF1, RXF2, RXF3
    • RX FIFO へのアクセス
    • 空の FIFO からの読み込みは無効で FDEBUG_RXUNDER エラーフラグがセットされる
    • 空の FIFO を読み出した結果は未定義

IRQ

  • IRQ
    • ステートマシン IRQ フラグレジスタ。1 を書き込んでクリアできる。
    • ステートマシンと IRQ フラグの関連性はなく、どのステートマシンもすべての IRQ フラグにアクセスできる。
    • 下位 4 つの IRQ はシステムの割り込みに設定できる。
    • pio_interrupt_get
      • 指定した IRQ がセットされているかどうか返す
    • pio_interrupt_clear
      • 指定した IRQ をクリアする

IRQ_FORCE

  • IRQ_FORCE
    • 1 を書き込むとそのビットに相当する IRQ がアサートされる。
    • INTF レジスタとは別で、INTF はステートマシンから見えない。
    • レジスタタイプが WF (書き込みフィールド) のため読み出し不可、操作のためのフィールド

INPUT_SYNC_BYPASS

  • INPUT_SYNC_BYPASS
    • GPIO 入力の 2-フリップフロップ同期回路をバイパスする。
    • 同期しつつ相当高速にしたい場合に使用する。

DBG_PADOUT

  • DBG_PADOUT
    • 現在 PIO が駆動している GPIO の状態を読み出す。

DBG_PADOE

  • DBG_PADOE
    • 現在 PIO の出力が有効な (方向) GPIO の状態を読み出す。

DBG_CFGINFO

  • DBG_CFGINFO
    • チップごとに異なるパラメータ
    • IMEM_SIZE
      • 命令メモリのサイズ
    • SM_COUNT
      • PIO ブロックごとのステートマシン数
    • FIFO_DEPTH
      • TX/RX FIFO の深さ。FIFO を統合するとこの数値の2倍

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
      • 命令メモリを空にする

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
      • クロック分割を設定する、整数部と小数部に分割して設定される

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
    • 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
      • MOV x, STATUS 命令で比較される
      • 0x0: TX FIFO レベル < N ならすべて 1、他はすべてゼロ
      • 0x1: RX FIFO レベル < N ならすべて 1、他はすべてゼロ
    • 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 を設定する
    • pio_sm_is_exec_stalled
      • pio_sm_exec で実行された命令がストール状態かどうか返す
    • pio_sm_set_wrap
      • ラップアドレスを設定する

SM0_SHIFTCTRL, SM1_SHIFTCTRL, SM2_SHIFTCTRL, SM3_SHIFTCTRL

  • SM0_SHIFTCTRL, SM1_SHIFTCTRL, SM2_SHIFTCTRL, SM3_SHIFTCTRL
    • 入出力シフトレジスタの動作制御
    • FJOIN_RX
      • TX FIFO を RX FIFO にマージする。FIFO はクリアされる
    • FJOIN_TX
      • RX FIFO を TX FIFO にマージする。FIFO はクリアされる
    • 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 に到達または超えた時
    • sm_config_set_fifo_join
      • FIFO をマージ/マージ解除する
    • sm_config_set_in_shift
      • IN 命令でのシフトに関する設定を行う
      • シフト方向、オートプッシュやそのしきい値
    • sm_config_set_out_shift
      • OUT 命令でのシフトに関する設定を行う
      • シフト方向、オートプルやそのしきい値
    • pio_sm_clear_fifos
      • TX と RX FIFO の内容をクリアする
      • FJOIN_RX と FJOIN_TX レジスタ操作で実装されている

SM0_ADDR, SM1_ADDR, SM2_ADDR, SM3_ADDR

  • SM0_ADDR, SM1_ADDR, SM2_ADDR, SM3_ADDR
    • 現在の命令アドレス
    • pio_sm_get_pc
      • 現在のプログラムカウンタ (命令アドレス) を設定する
  • SM0_INSTR, SM1_INSTR, SM2_INSTR, SM3_INSTR
    • 現在ステートマシンに割り当てられている命令
    • このレジスタに書き込むとすぐに実行され、復帰する
    • pio_sm_exec
      • 命令を即座に実行する
    • pio_sm_exec_wait_blocking
      • 命令を即座に実行して完了するまで待つ

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
      • サイドセットについて設定する
      • サイドセットに使われるビット数、サイドセットがオプションかどうか、ピンの方向設定に使用するかどうか
    • 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_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 命令で実行される

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 のマスクで指定したソースすべてを有効/無効にする