過去回で端子を調べたときにクロック源なども眺めたのでとっくに「やったような気」になっていたのですが、前回タイマ見て、肝心のクロックについて調べが足らないことに思い至りました。今回は外部端子から発振器、PLL、CGとその分配について改めて見ていきたいと思います。遠くからみると似たようなモン、だけれど随分と違うところあり。
※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。
※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。
クロック生成と分配の構造
クロックの生成と分配に関してはラズパイPico、Pico2も、他のマイコンとそう大きな違いはありませぬ。だいたい、役割別にわけると以下の4段構成になるかと。
-
- 外部クロック源を入力するためのクロック入力端子あるいは外部振動子を接続するための入出力端子
- 発振回路(オシレータ)
- 元クロックからより高速なクロックを生成するためのPLL(フェーズ・ロックド・ループ)
- 発振回路、PLL回路等から出力される元クロックから適切なものを選択し、分周し、そして出力クロックのON/OFF等の制御も行うCG(クロック・ジェネレータ)
Pico、Pico2でも上記4段階は存在し、所望のクロックを得るためにくみあわされておりますな。
オシレータおよび外部クロックソース
発振回路(オシレータ)および外部クロックの入力回路を列挙すると以下のようになるかと。
OSC/Ext. clock | RP2040 | RP2350 |
---|---|---|
GPIO20/22 | yes 1-15MHz | yes max.50MHz* |
GPIO12/24 | no | yes max.50MHz* |
XOSC | xtal. 1-15MHz(12MHz) | xtal. 1-50MHz(12MHz) |
ROSC | on-chip ring. 1.8-12MHz(typ. 6MHz) | on-chip ring. 4.6-19.6MHz(typ. 11MHz) |
OTP Boot ROSC | no | 12MHz |
LPOSC | no | on-chip 32kHz |
AON Ext. clocks | no | 4 |
まず外部からクロック信号を直接入力する場合、GPIOの特定の端子をクロック入力用に設定することができます。その場合のGPIOは、RP2040の場合2本、RP2350の場合4本が指定されています。ただし、入力可能な周波数についてはRP2040とRP2350で異なるようです。また、一番最後の欄にAON Ext. clocksと書かれてますが、それらGPIO端子からのクロックをAlways on 電源ドメイン用のクロックとして使うこともできるようです。ただしその際には、同じ端子ですが、最高速度は29MHz max.(*)に制限されるみたい。
XOSCは外部に水晶振動子(クリスタル)を接続(要2端子)して発振させる回路です。対応可能な振動子の周波数はRP2040とRP2350で異なりますが、普通は12MHzということみたい。
ROSCは、オンチップのリングオシレータです。リング状の回路を勝手に回る信号を取り出してクロックとするもの。温度や電圧などの影響を受けやすい回路なのであまりキッチリした周波数は得られませんが、外付け部品無というのがアドバンテージかと。やはり周波数はRP2040とRP2350で異なります。
OTP Boot ROSCも、オンチップのリングオシレータですが、RP2350に独特なものです。OTPブロック内で起動時のみに使われ、起動後は停止してしまう回路です。セキュリティっす。
LPOSCも、RP2350に独特なオシレータです。LP=Low Powerだと思います。オンチップ(外部端子なし)の32kHzの発振回路です。32.765kHzピタリの周波数が得られるはずがないので、時計として長時間使うとかなりな誤差となる筈ですが、電力制御などでxxx秒待つとかには使える回路でしょう。
PLL
さて、上記の発振回路や外部入力ではあまり速いクロックが得られないので、オンチップのPLL回路が搭載されております。通常は以下の2個とも大活躍のハズ。
PLL | RP2040 | RP2350 |
---|---|---|
USB PLL | 48MHz | 48MHz |
System PLL | 125MHz, max. 133MHz | 150MHz, max. 150MHz |
USBは48MHzご指定なので、USB使う場合にはUSB用のPLLを設定せねばなりません。System PLLは、プロセッサコアやバス、メモリなど主要部分に供給するためのクロックを作るのが主目的だと思います。Pico、Pico2内部では一番速いところね。ここの設定がPico、Pico2で違ってます。
クロック・ジェネレータ
さて、上記の複数のクロック源から適当な一つを選び、分周して周波数を整え、そして各部にクロック信号として供給するのがCG(クロック・ジェネレータ)の役割です。RP2040には電源ドメインはありませんが、クロックを停止させることで該当のペリフェラル回路の消費電力を抑えることはできます。RP2040にせよ、RP2350にせよ、使わぬクロックはこまめに停止だと。
CG | RP2040 | RP2350 |
---|---|---|
GPIO Out | 4 | 4 |
ADC(clk_adc) | yes | yes |
USB(clk_usb) | yes | yes |
RTC(clk_rtc) | yes | no |
HSTX ** | no | yes |
UART+SPI(clk_peri) | yes | yes |
CPU+BUS+MEM(clk_sys) | yes | yes |
clk_ref | yes | yes |
AON Timer | no | yes |
Power Manager | no | yes |
外部でクロックをモニタしたいなどという目的のために、4本のGPIOからクロックを外部出力することができます。なお、このクロック出力4本から1本とクロック入力2本または4本の1本を外部のRC遅延回路経由でループ状につないで「発振」させることもできるみたいです。やらんけど。
RP2040とRP2350で違いがあるところを見ていくと、
-
- RTCはRP2040にあるが、RP2350にはない
- HSTXはRP2350にあるが、RP2040にはない
- AON電源ドメインに属するAON TimerとPower ManagerはRP2350にあるが、RP2040にはない
となります。前回タイマのところで、RTCとAON Timerについては調べたので、** HSTXについて述べます。
-
- High-Speed serial Transmit
system clockとは独立クロックでDDR(ダブル・データ・エッジ、両エッジにデータを載せる)でデータ出力が可能だという回路です。8本までのGPIOについて設定可能なようです。クロックの最高速度は150MHz、両エッジなのでその倍のレートで転送可能だと。カッケーです。
clk_ref(リファレンスクロック)の行先
さて、clk_sysというクロックでプロセッサコアとかメモリなどが駆動されるので、そいつがメインちゃメインなのですが、それとは別に一本筋を通すためのクロック clk_ref というものがあります。この行先をまとめたものが以下に。
clk_ref | RP2040 | RP2350 |
---|---|---|
Watchdog | yes | yes |
Timers | yes | yes † |
OTP | no | yes |
Frequency counter | yes | yes |
Resus | yes | yes |
AON domain | no | yes |
OTPとAON domainはRP2350に独特なので、RP2040には不在です。
また、RP2350のTimersのところに†マークがつけてあるのは、RP2350ではclk_refとターゲットのタイマの間にTick Generatorという各宛先向けの tick 信号を独立して生成する回路が設けられているためです。宛先は6個
-
- TIMER0
- TIMER1
- RISC-V platform timer
- Arm Cortex-M33 SysTick Timers (CORE0)
- Arm Cortex-M33 SysTick Timers (CORE1)
- Watchdog
通常、tick信号としては、1us周期といった信号を設定するようです。
RP2040のときからあり、RP2350でも存在している回路なのですが、お惚け老人にはあまり馴染みのない回路ブロックも clk_ref にぶら下がっているので、以下に列挙しておきます。
-
- Frequency counter、clr_refで規定されるテストインターバル(XOSCまたは外部信号基準であるはず)に対して他のクロックをカウントしてその周波数を測定する回路
- Resus (Resuscitate)、clk_refの規定インターバル期間clk_sysが停止してしまった場合、クロックを復活させるための機構(つまりclk_refはclk_sysとは別なクロック源の方が良いな。)人間におけるAEDみたいなもん?
スッキリ?