RP2040データシートのPIOブロック図を解説

RP2040(Raspberry Pi Pico)のデータシートに記載されてるPIO(Programmable I/O)のブロック図を解説します。私なりにブロック図を書き直して、それを元にPIOについて説明します。

RP2040のPIO(Programmable I/O)とは、簡単に言うとメインのCPUとは別で動く非常に小さなCPUのことです。この小さなCPU(ステートマシンと呼びます)は合計8つ存在し、IO操作等が可能です。

CPUとは独立して動作しますので、タイミングのシビアなI/O制御に向いており、プログラミング次第でUARTやSPIといった周辺回路と大体同様の機能を作成できます。

全体のブロック図は次のようになります。

ステートマシンはPIO0とPIO1の2ブロックに4つずつ、合計8つ存在します。

詳細なブロック図は次のようになります。

  • ① TX FIFO 32bit

    CPUからステートマシンにデータを送る際に使用される32bitのバッファ。CPU側はC言語の場合『pio_sm_put_blocking』関数等を利用して目的のデータをTX FIFOに入れる。PIO側は『PULL』命令によってTX FIFOからOutシフトレジスタへ値を移動できる。FIFOは他のFIFOと結合してサイズを拡張可能。(単方向では最大8×32bitまで拡張可能)
  • ② RX FIFO 32bit

    ステートマシンからCPUにデータを送る際に使用される32bitのバッファ。CPU側はC言語の場合『pio_sm_get_blocking』関数等を利用してRX FIFOから目的のデータを取得する。PIO側は『PUSH』命令によってInシフトレジスタからRX FIFOへ値を移動できる。TX FIFOと同じく結合してサイズ拡張可能。
  • ③ Outシフトレジスタ32bit

    32bitのデータを保持できるビットシフト機能の付いたレジスタ。『OUT』命令で保持データ(指定ビット数分)をGPIO等に反映し、ビットシフトする。
  • ④ Inシフトレジスタ32bit

    32bitのデータを保持できるビットシフト機能の付いたレジスタ。『IN』命令でGPIO等の値(指定ビット数分)を取得し、ビットシフトする。
  • ⑤ 汎用レジスタX 32bit

    32bitのデータを保持できる汎用レジスタ。ほとんどの命令で書込先や読込元として指定できる。
  • ⑥ 汎用レジスタY 32bit

    32bitのデータを保持できる汎用レジスタ。ほとんどの命令で書込先や読込元として指定できる。
  • ⑦ プログラムカウンタ(PC)

    命令データ(PIOのプログラム)メモリ中、どの命令を実行するかをここで指定する(0~31)。基本的に(JMP等しなければ)1クロック毎に1ずつ増えていき、最後の命令を実施後は最初の命令の番号に戻る。
  • ⑧ 分周器(Clock Dev)

    指定した値でCPUのクロック周波数を割った値がPIOプログラムの実行周波数となる。例えばCPUは通常125MHzなので、ここに10を指定すると、12.5MHzでステートマシンを実行できる。32bitデータなので最大65535で割った値まで減速できる。
  • ⑨ 命令実行回路(Control Logic)

    命令データ(PIOのプログラム)メモリ中からプログラムカウンタ(PC)で指定した番号の命令データを取得して実行する。
  • ⑩ ステートマシン用 命令データ(プログラム)メモリ

    CPUからPIO用のプログラムがここに書き込まれる。C言語の場合はpio_add_program関数で書き込む。最大32命令まで書き込み可能で、1つのPIOに4つ存在するステートマシンから参照可能。

CPU側でPIOの実行準備を行った後、C言語の場合はpio_sm_set_enabled関数で指定のステートマシンを起動します。


関連ページ

RP2040のPIOのJMP, MOV, PUSHとかの解説(C言語向け)
RP2040でPIOをプロジェクト新規作成して動かすまで(C言語)
Raspberry Pi Picoのステップ実行できる開発環境づくり

コメント

このブログの人気の投稿

v4l2-ctlで行うUSBカメラ設定方法まとめ

【Windows11】簡単にできるRaspberry Pi Pico 開発環境構築 (VSCode, C言語, PicoProbe)

【Raspberry Pi Pico】Flashメモリの空き領域に設定値保存 (C/C++)