👻

STM32でSYSCLKを32MHz→64MHzへ引き上げた設計と周辺影響の整理

に公開

背景

1ms制約のあるフレーム間処理において、機能追加(ログ処理)後、理論処理時間が約989µsに達していた。
この状態では設計マージンがほぼ存在せず、条件次第でタイミング逸脱が発生する可能性がある。
設計マージン確保のため、システムクロック引き上げを検討した。
対象MCUは STM32F410R8T6。
最大SYSCLKは100MHzであり、64MHzへの引き上げは仕様範囲内である。

クロック設計

前提

  • HSE:20MHz
  • 変更前SYSCLK:32MHz
  • 変更後SYSCLK:64MHz
  • SPIクロック:1MHz(変更なし)
  • 周辺タイマ周期は維持
  • 設定はレジスタ直修正

PLL構成

PLLM(入力分周器)

VCO入力周波数は1〜2MHzに収める必要がある。

fVCO_IN = 20MHz / 20 = 1MHz

PLLM = 20(変更なし)

PLLN(VCO逓倍器)

fVCO_OUT = 1MHz × 128 = 128MHz

PLLN = 128(変更なし)

PLLP(SYSCLK生成)

設定可能値:2 / 4 / 6 / 8

  • 変更前:128 / 4 = 32MHz
  • 変更後:128 / 2 = 64MHz

PLLPのみを 4 → 2 に変更。

バス系への影響整理

AHB(HCLK)

分周なし(DIV1)

HCLK = 64MHz

APB1(最大50MHz)

DIV1では上限超過となるため、

APB1 = DIV2 → 32MHz

※タイマクロック注意点
STM32F4では、APB分周が

  • DIV1 → TIM_CLK = PCLK
  • DIV2以上 → TIM_CLK = 2 × PCLK

と式が異なる。
今回

PCLK1 = 32MHz
TIM_CLK = 64MHz

タイマクロック自体は変更前と同一。
ただし周期維持のため、PSCを32 → 64へ変更。

APB2(最大100MHz)

64MHzは上限内のため変更なし。

Flash Latency

32MHz:1WS
64MHz:2WS
Wait State未変更の場合、不定動作やHardFaultの原因となる可能性があるため必ず変更。

処理時間の改善結果

データ量多・ログ機能有の構成において:

  • 変更前:約989µs
  • 変更後:約680µs

約300µsの短縮を確認。
1ms制約に対し:

1000µs - 680µs = 約320µsのマージン

設計目標として「900µs以内(マージン0.9)」を基準としていたため、条件達成。
※温度条件や個体差による変動については今後評価予定。

消費電流への影響

動的消費電力は以下で表される。

P = C × V² × f

電流換算すると:

I = C × V × f

Cはスイッチングに伴い充放電される容量(回路規模に依存)。
理論上、周波数を倍にすれば電流も倍となる。
ただし実際には、

  • 常時最大スイッチングしているわけではない
  • 負荷率に依存する

ため、本システムでは実用上問題となる増加は確認されなかった。

設計上の確認項目

  • SPI通信速度は変更なし(1MHz維持)
  • UARTボーレート再計算
  • タイマ周期再検証
  • 発熱確認

クロック変更は単なる数値変更ではなく、

  • バス上限
  • タイマ倍化仕様
  • Flash待ち時間
  • 周辺再検証

を横断的に整理する設計作業である。

まとめ

  • PLLP変更のみでSYSCLK倍化可能
  • APB1上限とタイマ倍化仕様に注意
  • Flash Latencyは必須変更
  • 実測で約300µs改善
  • 約320µsのマージン確保

クロック引き上げは有効な対策だが、
影響範囲を体系的に整理しないと新たな不具合要因になり得る。

Discussion