背景)
STM32CubeIDE を使うと、「Clock Configuration」のタブにて 「Resolve Clock Issues」 のボタンを押下すると、自動でエラーを解消してくれるが、ベストとは思えない設定で落ち着くことがあり疑問に思ったので、ちょっと調べた。
前提条件)
- 外付けクリスタルは無い
- USBを使えるように 48MHz を供給する必要がある
- SDMMC1 にも 48MHz を供給したい
- SYSCLK には 80MHz を供給したい(願望)
ポイント)
Connectivity > SDMMC1 と USB_OTG_FS を有効にした状態で 「Resolve Clock Issues」を実行した場合、以下のような設定が選ばれる。
- PLL Source Mux は MSI を使う
- MSI は 4000 kHz (= 4MHz) を指定
- PLL M は /1
- PLL *N は x16
- PLL /R は /2
- PLL SAI1 *N は x24
- PLL SAI1 /Q は /2
- System Clock Mux は PLLCLK を使う
- CLK48 CLock Mux は PLLSAI1Q を使う
上記の構成が指定された結果、SDMMC1とUSBには48MHzが供給されるが、SYSCLK は 32MHz となり、やや遅くて少し残念。そこで下記のように変更すると良い。
- PLL Source Mux は MSI を使う
- MSI は 4000 kHz (= 4MHz) を指定
- PLL M は /1
- PLL *N は x40
- PLL /R は /2
- PLL SAI1 *N は x24
- PLL SAI1 /Q は /2
- System Clock Mux は PLLCLK を使う
- CLK48 Clock Mux は PLLSAI1Q を使う
このような構成にすることで、SDMMC1 と USB_OTG_FS に 48MHz を供給しつつ、SYSCLK に 80MHz を供給できる。
注意事項
USB_OTG_FS には 48MHz を供給する必要があるが、 HSI から作ったクロックを供給することはできないらしい(精度の問題による制限事項)。 外部クリスタルを利用した HSE クロックもしくは、MSI クロック から作り出した 48MHz じゃなければいけない。