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のステップ実行できる開発環境づくり
コメント
コメントを投稿