目的
RP2040と言うMCUが居るが、面白い作りをしている。
MCUそのものは真っ当なARMだが、PIO(プログラム可能)のIOが有り、高速な入出力が可能になるとか。
◆◆◆ よし、RP2040のPIOで何が出来るか調べて見よう ◆◆◆
経緯
RP2040というMCUの存在に今頃気が付いた。
英国Raspberry Pi財団が2021年1月に発表していた。
一年以上の出遅れと言う事になるが、お陰で環境は結構出そろっているけど。
開発環境として色々公開されている中でArduinoをチョイス。
※開発環境のインストールが簡単だから。VS.Codeも試したが、端折られた説明部分で頓挫。
※Micro Pythonのも簡単だろうけど、PIOとの組み合わせには違和感が有るな。
ボードはXIAO_RP2040をチョイス。
※安くて小さい。でもIOの数がチト少ないな。別途購入するかも。
Arduinoに開発環境をインストール後、適当なサンプルソフトをコンパイルしてダウンロード。
Lチカ動作確認して開発準備は完了。
#PIOについて
説明不要の様な気もするが一応。
上の全体構成図に示すように、一般的なペリフェラルは大体揃っている。
之に繋げない入出力の場合、普通のMCUならソフト処理となり高速処理ができない。
RP2040ではPIOで別処理する事により、ハード処理と遜色ない速度で処理が可能となる。
例えば、ws28xx等の変態(ノイズ耐性の為だろう)信号を作成する場合、RP2040なら24ビットの制御信号をPIOに投げるだけで、後のIO操作はPIOがやってくれる。
一般的なMCUであれば、信号操作に数百サイクルは必要。
※但し、このような非標準なペリフェラルなんて、使い処が難しいな。
RP2040にはPIOが2ブロック。
各々に4個のSM(ステートマシン、簡易型のMCUのような代物)。
※SMの動作は本体MCUと同じか、分周したクロックで回せる。
SMの命令数は9種類。命令語長は16ビット。
命令格納メモリは32ワード(32×16)で、これを4個のSMで共有。
※複数SMで同一命令を使い回す事や、個別に設定が可能。
でも容量が極小なので、大きなことは出来ないな。
#開発環境のインスツール
まず、Arduino IDEをインストールする。
次に、ファイル -> 環境設定 と開き、追加のボードマネージャのURL: に下記を追加。
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
ツール -> ホード -> ボードマネージャ と開き、「seeed rp2040」で検索。
「Seeed XIAO RP2040 By Seeed Studio」のバージョン1.9.3をインストールする。
※2.7.2ではインストールに失敗する。
ツール -> ホード で表示されるリストより、「Seeed XIAO RP2040」を選択する。
※IDEの右下に Pico SDK の表記が出ればインストール成功。
ダメなら「RP2040 Arduino」で検索すればやり方が色々出て来る。
RP2040をUSBに接続して、BOOT釦を推したままでRESET釦を押すと、RPI-RP2というドライブが現れる。
この状態で適当なスケッチをコンパイル、ダウンロードして動作を確認する。
※この操作は初回のみ必要。以後はシリアルポートを指定していれば自動的に行われる。
#参考資料
◇pico-SDK
◇pico-examples
◇pico-extras
◇rp2040-PIO ※自作のサンプルソフト。
#PIOアセンブラ
RP2040のPIOを利用するには、xxxx.pio(PIOソフト)をアセンブルする必要が有る。
アセンブラ(pioasm)のソースは pico-SDKのtoolst下に存在。(実行形式は無い)
なので、「rp2040-PIO」 に実行形式のもの置いた。
※実行形式を作るには別途環境が必要となるので。
pioasm.zipを解凍してpioasm.exeを取り出し、下記のコマンドを発行するか、
pioasm.exe xxxx.pio xxxx.pio.h
xxxx.pioを_pioasm.batにドロップすれば、xxxx.pio.hが作成される。
※出来合いのpioasm.exeが無かったので、手持ちのvs2017で作成している。
自作の場合は、CMakeLists.txtをcmakeで処理すれば自環境用のprojectが作成される。
出来上がったxxxx.pio.hをArduinoでインクルードすればpioが使えるようになる。
#サンプルの動作説明
「rp2040-PIO」について簡単に説明する。
※といっても、全てLチカですけど。
◇Blink
PIOは使っていない。RP2040と開発環境の動作確認用。
◇hellopio
SDKのサンプルをArduinoに置き換えただけ。
◇pio_blink
hellopioと内容はほぼ同様だが、3色LEDを別々のSM(ソフトは同一)で制御。
◇pio_blink3
動作はpio_blinkと同一だが、各SMを別々のソフトで制御。
◇pio_ws2812
ws2812の点滅信号をPIOで作製。
Arduinoからは24bitの輝度データを渡せば、PIOが制御パルスに変換する。
◇dma_blink
LEDの点滅データをPIO側で消費すると、即座にDMAで補填する。
DMAデータが無くなると、IRQでDMAが再設定される。
初期設定以降は、MCUは一切関与する必要が無い。
#SDKからのArduinoへのソフト移植
基本的にはArduinoIDEにSDKが含まれており、ほぼそのままコンパイル可能(多分)。
存在しない関数も有る様だが、コメントアウトして正常動作すればOKだろう。
元ソースの関数をArduino側にコピーして、setupから呼び出す。
※mainという関数名を使ってはいけない。setup関数が無効となる。
別ファイルにしてextern呼び出しでも大丈夫(のはずだが)。
上記サンプルはこの手法で作製している。
#感想
非標準で高速な入出力処理にはFPGAが最適と思うが、このような選択肢も有るとは。
コスト的にはMCUが有利だろうし、取っ掛かりの敷居も低いだろう。
ただ、ArduinoでPIOのソフト開発はお手軽に出来るけど、PIOでの処理はお手軽に行かないかも。
でも、機能検討はパズルを解くようで楽しいかも知れない。
でも、「8080 and 6800 parallel bus」なんてデータシートに書かれているが、どうやるんだよ。
なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。