LoginSignup
2
2

More than 1 year has passed since last update.

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

Posted at

目的

 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チカ動作確認して開発準備は完了。
RP2040構成.jpg

#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」なんてデータシートに書かれているが、どうやるんだよ。
 なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2