今回はタイマです。伝統的な多くのマイコン(シングルチップ・マイクロコントローラ)では、タイマと言えばインターバルを与えたり、ワンショットで時間を測るなどの機能に加え、キャプチャやコンペア・チャネルを備え入出力を制御したり、他の周辺回路のボーレートを与えたりとブラックな働きぶり。しかしラズパイPico系ではホワイト?
※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。
※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。
ラズパイ Pico/Pico2 のタイマ
多くの伝統的なマイコンでは、タイマというと以下のような構成が普通でないかと思います。
-
- 入力クロックを分周するプリスケーラ
- 8ビット、16ビット、32ビット程度のカウンタ
- 上記に接続したリロード・レジスタ
- カウンタの値とコンペアできるコンペアレジスタ、その出力で割り込みまたはIO制御可能。
- 外部入力でカウンタ値をキャプチャできるレジスタ(コンペアレジスタと同じハードだったりもする)
しかしラズパイPico/Pico2ではシンプル。なぜかというと コンペア/キャプチャといったIO機能は他の独立した周辺回路に任せられているからです。「タイマ」回路はそれらから独立。逆に言えば、PWMブロックとかPIOステートマシンなどの周辺回路の中にも「タイマ相当」の機能が分散してます。今回はそれらについては触れませぬ。
また、いろいろな入力クロックからクロックを選択し、適切なタイミングを生成するプリスケーラ部分も、tick generatorなどという別回路で独立していたりもします。タイマはあくまで時間を直接測る関係のお仕事に集中できる?
RP2040とRP2350の「タイマ」比較
さて、以下は両者が搭載する「タイマ」をざっくり比べてみたものです。
Timer | RP2040 | RP2350 |
---|---|---|
AON Timer | none | 64 bit |
RISC-V Platform Timer | none | 64 bit x 1 (SIO) |
Arm SysTick Timer | 24 bit (each M0+ core) | 24 bit (each M33 core) |
TIMER 0 | 64 bit counter + 4 alarms(32bit) | 64 bit counter + 4 alarms(32bit) |
TIMER 1 | none | 64 bit counter + 4 alarms(32bit) |
watchdog timer | 24 bit x 1 w/1us tick generator | 24 bit x 1 |
RTC | 7 fields, YMDWHMS | none |
似た雰囲気ではあるのですが、違うところは違うよ、という感じ。
-
- AON Timer
AON=Always on です。RP2350独特の64bit タイマです。過去回でやりましたが、RP2350では、RP2040では存在しなかった電源ドメインが導入されました。Always on電源ドメイン側で常に動き続けるタイマとして設定されているのがAON Timerです。他のタイマに与えられるtick信号とは独立です。通常、オンチップの 32kHz LPOSC(もちろんAlways on側)起源の信号で動作させるようです。主電源OFFしておいて10秒後に起床とか、そういう制御が可能でしょう。なお、RP2040にあって、RP2350に不在のRTCは、このタイマにソフト層を被せて実現せよということみたいです。その場合、オンチップの 32kHz LPOSCの精度はよくないので、外部クロック源などが必要になるかもしれませぬ。
-
- RISC-V Platform Timer
RISC-Vと銘打たれているのは、RISC-Vの仕様で要求されるタイマだからのようです。実際にはRISC-VコアをディゼーブルにしていてもArm側から使うことが可能。2個のコアから直接アクセスされるSIOブロック内に1個だけ存在し両コアでシェアされている64bitタイマです。RTOSなどを実装するときに使うとよさそうですが、Armコアの場合、この次のArm Sys Tick Timerも使えるからなあ。
-
- Arm SysTick Timer
RP2040の場合Arm Cortex M0+、RP2350の場合Arm Cortex M33コアに付随する24ビットのタイマです。仕様的には同じタイマとして使えるのではないかと思います。通常、Arm上のRTOSなどがあてにしているタイマでしょう。RP2350でArmを選択していない場合は使えないのだと思います。
-
- TIMER0 / TIMER1
RP2040の場合1本しか搭載されていないですが、RP2350の場合2本搭載されているので、TIMER0、TIMER1とインスタンス名がつけられてます。基本、同じ64ビットカウンタ+4チャネルのアラームです。アラームは32ビット幅でカウンタの下32ビットだけ監視です。64ビットのカウンタを1usのtick信号で駆動した場合、余裕で数万年以上(計算間違ってないだろうな)の期間をカウントできる筈なので、事実上カウンタがラップアラウンドするなどという恐れはないと。
-
- watch dog timer
通常はソフトで定期的にリセットするタイマです。ソフトが暴走したりしてリセットをしなくなると「バウワウ」と吠える(割り込む)番犬タイマです。ほぼ同じ回路がRP2040にもRP2350にも搭載されているようですが、RP2040の場合ウオッチドッグタイマ内にタイマを駆動するための tick generatorというものまで内蔵してます。一方、RP2350では、tick generator は watch dog だけでなく、皆で共用できるようになっているようです。
-
- RTC
リアルタイムクロック(時計、実時間タイマ)です。RP2040では、年月日、時分秒、曜日までサポートするハードウエアのRTCを搭載してましたが、RP2350では不在なようです。先ほどもAONタイマのところで述べましたが、時計が必要ならAONタイマを使え(ただしカレンダ機能などはソフトで、また、正確なクロック信号は別途外で)ということみたいっす。