前回は「昔ながらのマイコンならシリアルのSだけれど、ラズパイPico一族ではシングルサイクルのS」であるところのSIOでした。今回も同様、「昔ながらのマイコンならパラレルのPだけれど、ラズパイPico一族ではプログラマブルのP」なPIOです。プログラマブルなステートマシンによりIO機能を実現するもの。
※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。
※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。
ラズパイPico/Pico2のPIO
ラズパイ式のPIO=Programmable input/output blockであります。IO制御を確定したタイミングで行うことができるステートマシン(有限状態機械)であります。ホストが、ごく小規模な「プログラムメモリ」に特有の「命令」にてステートマシンを書き込めば、後は勝手にかつ所定のサイクル数にてIO処理をこなしてくれるのであります。シリアル、パラレル、各種のプロトコルに対応するステートマシンなど思いのままです。
ラズパイPicoが登場したときにPIOを見て、年甲斐もなく熱狂するとともに、ちょっと妬ましくもありませした。思い起こせば太古の時代、お惚け老人がまだペーペーの新人であったころ、「なにか周辺回路で提案ないか」とお題をいただきました。それで提出したのがIO制御向けのプログラマブルな小CPUであります。今にして思えば、まさにPIOを数十年先取りしていたな、と思いつつ、当時はあえなく却下。ナノメータどころかマイクロメータ単位のプロセスの時代、そんな回路に割くシリコンは無かったのであります。
さてラズパイPicoでもPico2でも「ほぼ同等」なPIOが搭載されとります。当然ながらPico2ではPicoよりも機能強化されてます。しかし、データシート的に言うと位置づけがちょっと微妙。過去回でもDMAコントローラがRP2040ではバスマスタとして良いポジションにいたのに、RP2350では周辺回路の一つに追いやられていた件を書きました。今回もRP2040ではChapter 3として「周辺回路筆頭」の位置にいたPIOが、RP2350ではChapter 11として、フツーの周辺回路扱いになってます。
またコマケー話なんですが、RP2350のList of Registersのところ、base addressesがPIO0とPIO1の分しか書かれてません。RP2350で新設されたPIO2のアドレスが記述漏れです(PIO2のアドレスは別な表には記載。)中の人がRP2040の文章をコピペ?したときに追加忘れたんではないかとお惚け老人はにらんでます、知らんけど。
RP2040とRP2350の比較
ざっくり言うと、RP2040では2個だったPIOブロックがRP2350では3個に増えている、というところです。以下の表をご覧くだされ。
Freature | RP2040 | RP2350 |
---|---|---|
PIO0 | 0x50200000 | 0x50200000 |
PIO1 | 0x50300000 | 0x50300000 |
PIO2 | none | 0x50400000* |
# of State Machines per Block | 4 | 4 |
Instruction Memory per Block | 32 instructions, 4 read ports | 32 instructions, 4 read ports |
GPIO | 32 per block, max 32 | 32 per block, more than 32 |
Interrupt | 2 IRQ per block, 8 sources per block(only lower 4 into IRQ) | 2 IRQ per block, 8 sources per block |
Instructions | RP2040 set | RP2040 set + RP2350 new features |
Security | none | Secure/Non-secure control |
Other improvements | none | I/O delay and skew, DMA request latency |
*RP2350のPIO2のアドレスは、RP2040ではXIP_AUX_BASEにアサインされていた(要注意。)
1個のPIOブロックには、4個のステートマシンが含まれており、各ステートマシンにはそれぞれ入力と出力にFIFOが設定されています。そして各ステートマシンは紐づけられたGPIOを「簡単なアセンブラ的プログラム」で自律的に制御して、なんらかの入出力操作を行うのであります。
基本的な構成は「レジスタの記述をコピペ」で開始したくなる程度にRP2040とRP2350は似ていて、多分RP2040用の「プログラム」はほぼほぼ流用できるのではないかと想像してます(まだ実機で確かめたわけではないけど。)
当然、細かいところに差異ありです。
まず制御対象のGPIOですが、RP2350では、RP2350Bという品種が設定されている上、一部の専用ピンがGPIO化できるようになっているので、GPIOのピン数が増えてます。そのための拡張対応あり。ただし、1ブロックの中ではRP2040同様32ピンまでということになっているので、プログラム的なインパクトは拡張端子使うときの初期設定部分のみでしょう。
またホストへのIRQ(インタラプトリクエスト)数が、1ブロックあたり2本は変らずですが、ブロック数が増えているのでRP2350では合計6本になってます。よって割り込みの番号も変更されてます。またコマケー話ですが、ブロック内部のリクエストフラグ数は8個で変更ないのですが、RP2040であった下4本だけがホストに行けるといった制限は廃止されたみたいです。
ステートマシンの「命令セット」は上位互換みたいです。命令数としては同じように見えますが、細かい機能が拡張されてます。
勿論、RP2350のセキュア、ノンセキュアな制御にも対応してます。2重化されているわけではなく、PIOブロックをセキュア指定するとノンセキュアなコードからは触れなくなる、セキュア設定のGPIOはセキュア指定のPIOで制御といった縛りみたいです。
また、内部回路の遅延なども改良されておると。
後で触ってみるのが楽しみです(しかし、データシート読み切るのにどんだけかかるんじゃ?)