前回はPico2とPicoの内部バスを比較してみました。似ているけれどもコマケー違いは多々あり。概ねPico2の方が強化されとります。今回拝見するのはDMAです。これまたよく似ているけれどもPico2の方が強化されている?でもね、データシート的には「左遷」されている感じがしなくもないです。どうしたDMA。
※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。
※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。
DMAC(DMAコントローラ)
DMAは、最初の設定こそソフトウエアで行う必要がありますが、設定を済ませればいちいちプロセッサ・コアの介入を待つことなく、周辺デバイスとメモリなどの間でデータ転送を自動的に行ってくれる回路です。ぽろぽろとたまにやってくるデータが処理できる塊になるまで自動的に受け取っておいてよ、とか、出力データを揃えたので後の転送はよろしく、とかいう感じで、大事なプロセッサのお時間を取らせることなく処理を進めるための装置です。デバイス内の配送インフラ的な?
さて、ラズパイPicoのRP2040でもラズパイPico2のRP2350でもDMACは搭載されています。前回内部バスを見ましたが、プロセッサCore0、Core1につづくバスマスタとして内部バス上に君臨?してました。そしてRP2040でもRP2350でもリードとライトは独立したポートとなっており、どこかからリードしている最中に、別なライトを並行動作させることができることも変わりありませぬ。
しかしね、データシートを拝見すると、その扱いは大きくことなります。ラズパイPicoのRP2040では、「2.5 DMA」という節で取り扱われており、この前がプロセッサ・コア、この後がメモリなので、バリバリのシステム中核の扱いです。バスの構造的にはうなづける配置です。しかし、ラズパイPico2のRP2350では、「12.6 DMA」と後ろの方に追いやられてます。この前がPWM、この後がUSBなので周辺回路の一つという扱いです。
バスの構造(ハードウエア)を考えれば、他のペリフェラル共とは一線を画する位置に鎮座し、他のペリフェラル共を操る立場にいるDMAです。しかし、プログラマからみたらば、周辺回路の一つでしかないと。この辺の考え方の違い?がデータシートに反映されているような気がします。知らんけど。
RP2040とRP2350のDMAの違い
例によって、2機種のDMAはよく似ていて、RP2040で出来たことはRP2350でも出来るように配慮されている気がします。ざっくりした差を列挙すればこんな感じ(RP2040に対してRP2350では。)
-
- チャネル数が12から16に増強
- 割り込み数が2から4へ
- セキュリティ対応、メモリプロテクション対応
各チャネル毎に「どこからどこへ」という指定ができるようになっており、どこからはREAD_ADDRレジスタ、どこへはWRITE_ADDRレジスタにアドレスを書き込むようになっているのはRP2040、RP2350共通です。
そして何回転送するの?というカウント数を設定するのがTRANS_COUNTレジスタです。ここの仕様はRP2040とRP2350で異なります。RP2040はベタな32ビットレジスタで単純に32ビットのカウンタです。しかし、RP2350では下位28ビットがカウンタ、上位4ビットはカウントのモード設定になってます。上位4ビットがオールゼロの場合、RP2040と動作は一致するような気がします(実機で確かめたわけじゃないけど。)多分PicoやPico2で32ビットのカウンタをフルフル使うようなDMA転送は想定しずらいので、カウンタが28ビットになっても問題なさそうです。さらに言えば、RP2350ではカウンタが28ビットでも「永遠に」モードなどもあるので常に決まった転送すればよいケースにも対応可じゃないかと。微妙に改良されとりますなあ。
最後は、CTRL_TRIGレジスタです。機能は似ているので制御ビットも似てはいるのですが、ビット配置は微妙に異なります。RP2350の方が機能が増えているためじゃないかと思います。多分、APIなど使ってDMA転送をセットアップする分には、RP2040とRP2350で同じAPIで同じ設定にすることはできると想像するのだけれど、レジスタレベルで直接ビットをいじくるような無法なことをしていいると一方用に書いたコードは他方ではヤバイかも知れませぬ。まだ実機で練習したわけでないので確認しておりませぬが。
なお、DMAの制御レジスタには4つもの「エイリアス」(同じレジスタが異なるアドレスに見える)があり、それによってDMAチャネルをイネーブルにするトリガを制御してます。他のマイコンでは珍しいじゃないかと思う独特な仕組みです。これについては、RP2350もRP2040のお作法をしっかり継承しているみたいっす。