RP2040-PIOのソフトをお手軽に開発するぞ

# 目的
　RP2040と言うMCUが居るが、面白い作りをしている。
　MCUそのものは真っ当なARMだが、PIO(プログラム可能)のIOが有り、高速な入出力が可能になるとか。
　◆◆◆　よし、RP2040のPIOで何が出来るか調べて見よう　◆◆◆

# 経緯
　RP2040というMCUの存在に今頃気が付いた。
　英国Raspberry Pi財団が2021年1月に発表していた。
　一年以上の出遅れと言う事になるが、お陰で環境は結構出そろっているけど。
　開発環境として色々公開されている中でArduinoをチョイス。
　　※開発環境のインストールが簡単だから。VS.Codeも試したが、端折られた説明部分で頓挫。
　　※Micro Pythonのも簡単だろうけど、PIOとの組み合わせには違和感が有るな。
　ボードはXIAO_RP2040をチョイス。
　　※安くて小さい。でもIOの数がチト少ないな。別途購入するかも。
　Arduinoに開発環境をインストール後、適当なサンプルソフトをコンパイルしてダウンロード。
　Ｌチカ動作確認して開発準備は完了。
![RP2040構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/98769993-8ada-4438-ff89-27ecbc8cb2c0.jpeg)

 #ＰＩＯについて
　説明不要の様な気もするが一応。
　上の全体構成図に示すように、一般的なペリフェラルは大体揃っている。
　之に繋げない入出力の場合、普通の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](https://github.com/raspberrypi/pico-sdk)
　◇[pico-examples](https://github.com/raspberrypi/pico-examples)
　◇[pico-extras](https://github.com/raspberrypi/pico-extras)
　◇[rp2040-PIO](https://github.com/hi631/rp2040-PIO)　※自作のサンプルソフト。


 #ＰＩＯアセンブラ
　RP2040のPIOを利用するには、xxxx.pio(PIOソフト)をアセンブルする必要が有る。
　アセンブラ(pioasm)のソースは pico-SDKのtoolst下に存在。(実行形式は無い)
　なので、「[rp2040-PIO](https://github.com/hi631/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](https://github.com/hi631/rp2040-PIO)」について簡単に説明する。
　　※といっても、全てＬチカですけど。

　◇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は一切関与する必要が無い。


 #ＳＤＫからのArduinoへのソフト移植
　基本的にはArduinoIDEにＳＤＫが含まれており、ほぼそのままコンパイル可能(多分)。
　存在しない関数も有る様だが、コメントアウトして正常動作すればＯＫだろう。
　元ソースの関数をArduino側にコピーして、setupから呼び出す。
　　※mainという関数名を使ってはいけない。setup関数が無効となる。
　　　別ファイルにしてextern呼び出しでも大丈夫(のはずだが)。
　上記サンプルはこの手法で作製している。


#感想
　非標準で高速な入出力処理にはFPGAが最適と思うが、このような選択肢も有るとは。
　コスト的にはMCUが有利だろうし、取っ掛かりの敷居も低いだろう。
　ただ、ArduinoでPIOのソフト開発はお手軽に出来るけど、PIOでの処理はお手軽に行かないかも。
　でも、機能検討はパズルを解くようで楽しいかも知れない。
　でも、「8080 and 6800 parallel bus」なんてデータシートに書かれているが、どうやるんだよ。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。