MCUのクロックツリーとPLL
「なぜ CPU は 168MHz なのにペリフェラルは 42MHz なのか」がクロックツリーで腑に落ちる。発振源・PLL 逓倍・分周・ゲーティングを原理から押さえれば、周波数設定と消費電力・EMI を狙って詰められる。
- 1.MCU は低速・低精度な発振源を PLL で逓倍して高いシステムクロックを作り、そこから各バス・ペリフェラルへ分周して配る。この分配網がクロックツリーで、初期化はリセット直後の最重要処理。
- 2.PLL は位相比較器・チャージポンプ・ループフィルタ・VCO・分周器の帰還ループ。基準に位相ロックさせ、帰還分周比 N で出力を N 倍にする。ロックには数十µs かかり、その間は出力を使えない。
- 3.使わないブロックのクロックを止めるクロックゲーティングが動的電力削減の要。周波数を上げるほど性能は上がるが動的電力と EMI(放射ノイズ)が増え、スペクトラム拡散などで折り合いをつける。
クロックは「作って・整えて・配る」
MCU の全ディジタル回路は、たった1本の心臓の鼓動——クロック——に同期して動きます。ところがこの鼓動は一枚岩ではありません。CPU コアは可能な限り速く回したい一方、ペリフェラルはそこまでの速度を要らず、むしろ電力とノイズを抑えたい。だから MCU 内部では、低速で扱いやすい発振源から出発し、PLL で高い周波数まで逓倍(ていばい)し、それを用途ごとに分周して各所へ配るという三段構えを取ります。この「発生源 → 逓倍 → 分配網」の全体像がクロックツリーです。
なぜ数十MHz の水晶をそのまま CPU に使わないのか。高速で高精度な発振子は高価で入手性も悪く、逆に低速の水晶(例:32.768kHz や 8〜25MHz)は安価で安定します。そこで「安く正確な種クロック」を PLL で好きな高周波へ引き上げる設計が定石になりました。起動シーケンスで Reset_Handler がクロックと PLL を初期化する意味は /embedded/microcontroller-architecture/ で触れた通りで、本稿はその中身を原理から開きます。
発振源:内蔵 RC と外部水晶の使い分け
クロックツリーの根には**発振源(クロックソース)**があります。MCU は通常、複数の発振源を内蔵・外付けで持ち、要求精度と消費電力で選び分けます。
| 発振源 | 周波数の目安 | 精度 | 起動時間 | 用途 |
|---|---|---|---|---|
| 内蔵 RC 発振器(HSI/LSI) | 数十kHz〜十数MHz | ±1〜数%(温度・電圧で変動) | µs 級で高速 | 起動直後・低精度で足りる処理 |
| 外部水晶(HSE/LSE) | 32.768kHz、8〜25MHz 等 | ±数十ppm と高精度 | 数百µs〜数ms と遅い | 通信ボーレート・RTC・PLL 基準 |
| 外部クロック入力 | 任意(外部供給) | 供給源しだい | 即時 | 複数チップのクロック共有 |
内蔵 RC 発振器は抵抗と容量で発振するため外付け部品ゼロで即座に立ち上がりますが、温度と電源電圧で周波数が数%ずれます。多くの MCU はリセット直後まずこの内蔵 RC で起動し、CPU を動かしながらゆっくり水晶や PLL を立ち上げ、安定を確認してから乗り換えます。外部水晶は ppm 級の高精度が得られる代わりに、機械的振動が安定するまで数百µs〜数ms の起動時間を要します。この起動待ちがスリープ復帰レイテンシを支配する話は /embedded/low-power-sleep-modes/ と地続きです。
精度の単位 ppm は百万分率で、1% = 10000ppm です。内蔵 RC の ±1% は ±10000ppm、外部水晶の ±30ppm はその 300 分の1。UART は両端のクロック誤差が数%以内なら通信できますが、これは片側の許容であり、内蔵 RC 同士だと誤差が積み上がって危うい。だから確実な通信や時刻計測には水晶が要る、という判断につながります。
PLL:位相ロックで周波数を逓倍する
低速の基準クロックから高いシステムクロックを作る心臓部が **PLL(Phase-Locked Loop、位相同期ループ)**です。PLL は出力の位相を基準に一致(ロック)させ続ける帰還制御ループで、その帰還経路に分周器を挟むことで「基準の整数倍(や分数倍)」の周波数を生み出します。構成要素は次の5つです。
- 位相比較器(PFD):基準クロックと、帰還してきた出力クロックの位相差を検出する。
- チャージポンプ:位相差を電流パルスに変換する。
- ループフィルタ:その電流を平滑し、制御電圧に変える(ローパス)。
- VCO(電圧制御発振器):制御電圧に応じて発振周波数を上下させる。電圧が高いほど速く発振。
- 帰還分周器(÷N):VCO 出力を N 分周して位相比較器へ戻す。
ループが安定(ロック)した状態では、帰還してきた f_vco / N が基準 f_ref と一致します。したがって出力は基準の N 倍になります。
PLL の帰還ループと逓倍の原理:
f_ref ──▶[位相比較器]──▶[チャージポンプ]──▶[ループフィルタ]──▶[VCO]──┬──▶ f_out(= f_vco)
▲ │
└──────────────[ ÷N 帰還分周器 ]◀───────────────────────────┘
ロック時の条件: f_vco / N = f_ref
よって出力: f_out = N × f_ref
実際は入力側にも前置分周(÷M)と出力側の分周(÷P)を持つことが多く、
f_out = f_ref × (N / M) / P
の形で任意の周波数へ合わせ込む。
制御の流れはこうです。出力が基準より遅ければ位相比較器が「遅れ」を検出し、チャージポンプが制御電圧を上げ、VCO が加速する。速すぎれば逆に減速する。この負帰還が働いて位相差がゼロに収束した状態がロックです。ロックに至るまでには**ロックタイム(数十µs 程度)**があり、その間の出力は周波数が揺れていて使えません。だからクロック初期化コードは PLL を有効化した後、ロック完了フラグ(例:PLL_RDY)が立つのを待ってからシステムクロックを PLL へ切り替えます。
PLL のロック完了を待たずにシステムクロック源を PLL へ切り替えると、周波数が定まらないクロックで CPU とバスが走り、フラッシュのウェイトステート不足も相まって即座にハングします。手順は「(1) 発振源を安定させる → (2) フラッシュのウェイトステートと電圧レギュレータを目標周波数に合わせて先に設定 → (3) PLL 有効化 → (4) ロック待ち → (5) クロック源を PLL へ切替」の順序が鉄則で、この順序ミスはブリングアップ時の典型的なハングの原因です。
PLL の分周比は自由に選べるわけではありません。VCO は仕様で定められた発振レンジ(例:192〜432MHz)内でしか正しく発振せず、前置分周 M・帰還分周 N・出力分周 P の組み合わせで VCO を必ずこのレンジに収める必要があります。データシートの制約を無視した分周比を設定すると、ロックしない・不安定・過剰発熱といった形で破綻します。ベンダのクロック計算ツールが存在するのはこのためです。
クロックツリー:分周して各ドメインへ配る
PLL が作った高いシステムクロック(例:168MHz)を、そのまま全ペリフェラルへ配ることはできません。各バスやペリフェラルには許容できる最大周波数があり、また高速で回すほど電力を食うため、**プリスケーラ(分周器)**で用途ごとに落として配ります。この分配網がクロックツリーの本体です。
クロックツリーの例(Cortex-M 系 MCU、数値は一例):
HSE 8MHz ──▶[ PLL ×21 ÷1 ]──▶ SYSCLK 168MHz
│
├─▶[AHB ÷1 ]─▶ HCLK 168MHz ─▶ CPU / DMA / メモリ / コアバス
│ │
│ ├─▶[APB1 ÷4]─▶ PCLK1 42MHz ─▶ 低速ペリフェラル(I2C/UART/TIM)
│ └─▶[APB2 ÷2]─▶ PCLK2 84MHz ─▶ 高速ペリフェラル(SPI/ADC)
│
LSE 32.768kHz(外部)───────────────┴─▶ RTC(高精度な時刻計測)
LSI 約32kHz(内蔵RC)──────────────────▶ 独立ウォッチドッグ(主クロックと別系統)
ここで重要なのは、バスごとに独立した分周段(AHB・APB1・APB2 など)を持つ点です。CPU が載る AHB バスはフル速度で回し、周辺がぶら下がる APB バスは半分〜1/4に落とす、という設計が一般的です。この「CPU は速く、ペリフェラルは控えめ」という非対称が、冒頭の「なぜ CPU は 168MHz なのに APB は 42MHz なのか」の答えです。
分周が効くもう一つの場面がペリフェラルの内部分周です。UART のボーレートやタイマの周期は、そのペリフェラルへ供給される PCLK をさらにペリフェラル内蔵のプリスケーラで割って作ります。つまり「同じ 115200bps を出すレジスタ設定値」は供給クロックが違えば変わります。ボーレート生成が供給クロックに依存する仕組みは /embedded/bus-i2c-spi-uart/ と直結し、クロックツリーの設定を間違えると全通信のボーレートがずれます。
所望の割込み周期は「PCLK ÷ プリスケーラ ÷ カウンタ周期(ARR+1)」で決まります。例えば PCLK1 が 42MHz、APB1 のタイマは規定によりタイマクロックが 84MHz(APB 分周が1でない場合はタイマ側が2倍される MCU が多い)、プリスケーラ 8400、カウンタ周期 10000 なら、84_000_000 / 8400 / 10000 = 1Hz(1秒周期)。この「タイマクロックが APB クロックの2倍になり得る」規則を見落とすと、周期が半分ずれる定番の罠にはまります。
クロックゲーティング:止めれば電力が消える
CMOS 回路の動的電力は、クロックが遷移するたびにフリップフロップやゲートの容量を充放電することで発生し、おおむね周波数に比例します。ということは、使っていないブロックのクロックを止めれば、そのブロックの動的電力はほぼゼロになります。これがクロックゲーティングです。
MCU では、各ペリフェラルへのクロック供給を個別にオン・オフできるイネーブルレジスタ(例:RCC->APB1ENR)が用意されています。デフォルトでは多くのペリフェラルのクロックが止まった状態で、使う前に明示的にクロックを供給しないとレジスタを触っても反応しません。これは「初心者が GPIO を設定したのに動かない」定番のつまずきの正体でもあります。
ペリフェラルを使う前の定石(クロックゲーティング解除):
1. 目的のペリフェラルのクロックイネーブルビットを立てる
RCC->APB1ENR |= (1 << UART2_EN); // UART2 へクロック供給開始
2. (数サイクルの反映待ちが要る MCU もある)
3. ペリフェラルのレジスタを設定 ← ここで初めて反応する
...
使い終えたら省電力のためクロックを止める:
RCC->APB1ENR &= ~(1 << UART2_EN); // クロック遮断で動的電力を削減
クロックゲーティングは動的電力しか消せず、電源を配ったままなのでリーク電流は残ります。より深い省電力(PLL や高速発振器そのものの停止、電源ドメイン遮断)へ進む階層は /embedded/low-power-sleep-modes/ が扱います。クロックゲーティングは「その一段目」——最も手軽で、常時効かせるべき基本技法です。
精度・消費電力・EMI のトレードオフ
クロック設計は、単に速くすればよいものではありません。三つの相反する軸を秤にかけます。
| 軸 | 周波数を上げると | 背景の原理 |
|---|---|---|
| 性能 | 向上(単位時間の命令数が増える) | スループットは概ね周波数比例 |
| 消費電力 | 悪化(動的電力が増える) | 動的電力 ∝ 周波数(かつ電圧の二乗) |
| EMI(放射ノイズ) | 悪化(高調波が強く・高域へ) | 急峻なクロックエッジが高調波を放射 |
| 精度・安定性 | 発熱で悪化しやすい | 温度上昇で発振周波数がドリフト |
とりわけ EMI(電磁妨害)はクロックに固有の問題です。方形波であるクロックは基本周波数だけでなく、その奇数倍を中心とした高調波を多数含み、これらが基板や配線から電磁波として放射されます。放射スペクトルは基本周波数の位置に鋭いピークとして立つため、規制の許容線を突破しやすい。
この対策の代表が **SSC(スペクトラム拡散クロッキング)**です。クロック周波数をごくわずか(例:±0.5%)ゆっくり変調して揺らすと、一点に集中していたエネルギーが周波数軸上に薄く広がり、ピーク高さが下がります。総エネルギーは同じでも、規制で問われる「ある周波数でのピーク値」を下げられるわけです。ただし周波数を意図的に揺らす以上、その揺れに敏感な用途(高精度タイミングや一部の高速シリアル)とは相性が悪く、使い分けが要ります。
「PLL はどう周波数を上げるか」は『VCO 出力を N 分周して基準に位相ロックさせるので、出力が基準の N 倍になる。ロックタイムの間は出力を使えない』と答えます。「なぜクロックツリーで分周するのか」は『バス・ペリフェラルごとに許容周波数と電力・EMI の要求が違い、CPU は高速・周辺は低速に配るため』。「クロックゲーティングの効果」は『使わないブロックのクロックを止めて動的電力を削る。ただしリークは残る』。「SSC の狙い」は『クロックを微小変調して放射スペクトルのピークを分散し EMI を下げる』が採点ポイントです。
まとめ
- MCU のクロックは 発振源 → PLL 逓倍 → 分周分配 の三段構え。安価で正確な低速発振源(内蔵 RC/外部水晶)を種に、PLL で高いシステムクロックを作り、バス・ペリフェラルへ落として配る。この分配網がクロックツリーで、初期化はリセット直後の最重要処理。
- PLL は位相比較器・チャージポンプ・ループフィルタ・VCO・帰還分周器の負帰還ループ。帰還分周比 N でロックさせ、出力を基準の N 倍にする。**ロックタイム(数十µs)**の間は出力が使えず、ロック完了を待ってから切り替える順序が鉄則。VCO の発振レンジ制約に分周比を収める必要がある。
- クロックツリーは AHB・APB など独立した分周段を持ち、「CPU は速く・ペリフェラルは控えめ」に配る。UART ボーレートやタイマ周期は供給クロックをさらに分周して作るため、ツリー設定を誤ると全周辺のタイミングがずれる。
- クロックゲーティングは使わないブロックのクロックを止めて動的電力を削る一段目の省電力。多くのペリフェラルは既定でクロックが止まっており、使用前に明示的な供給が要る。
- 周波数は性能↑と引き換えに消費電力・EMI が悪化する。動的電力は周波数に比例し、方形波クロックの高調波が放射ノイズを生む。**SSC(スペクトラム拡散)**でピークを分散するなど、要求に応じて折り合いをつけるのがクロック設計の実務。
組込み・IoT Article
MCUのクロックツリーとPLLを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
組込み
比較で見る軸
難易度: advanced / カテゴリ: 組込み・IoT / タグ数: 6
導入後に効く点
PLL は位相比較器・チャージポンプ・ループフィルタ・VCO・分周器の帰還ループ。基準に位相ロックさせ、帰還分周比 N で出力を N 倍にする。ロックには数十µs かかり、その間は出力を使えない。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- 組込み・IoT
- タグ数
- 6
判断チェックリスト
- 自社の用途が「組込み / クロック」に近いか確認する。
- 強みである「MCU は低速・低精度な発振源を PLL で逓倍して高いシステムクロックを作り、そこから各バス・ペリフェラルへ分周して配る。この分配網がクロックツリーで、初期化はリセット直後の最重要処理。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。