STM32 クロック系統を理解する

  • 2021.02.19
  • IDE
STM32 クロック系統を理解する

今回はクロック系統のお話です。

ローパワーマイコンの方でもクロック系の記事を書きましたが Nucleo-F401RE でも復習を兼ねて見ていきます。

クロック系がよくわからない方には読んでいただきたい内容となっています。

私も最初は さっぱり わかりませんでした。。

投稿時の開発環境を記しておきます。

PC:Windows10 OS
IDE: STM32CubeIDE Version1.5.0
Configurator: STM32CubeMX Version6.1.0
Board: STM32Nucleo-F401RE

プロジェクトを作成する

IDEを起動し、File- New – STM32 Project を選択し、Target Selection ウィンドウが出たら Board Selector タブを選択し Boards List から NUCLEO-F401RE を選択し Next ボタンを押します。

Project 名に F401Clock と入力し、Finishボタンを押します。
Initialize all peripherals with their default Mode ? と聞いてくるので Yesを押します。
This kind of project is associated with the STM32CubeMx perspective. Do you want to open this perspective now ? と聞いてくるので Yesを押します。

クロック設定の初期状態を確認してみる

Clock Configuration でクロックの系統図を見ることができます。

図が小さくて見えなければ、実際にプロジェクトをつくって確認してみてください。

STM32F401REのクロックソースは以下の4つです。

LSI : Low Speed Internal
LSE : Low Speed External
HSI : High Speed Internal
HSE : High Speed External

どれも覚えやすい略号ですね。

Internal と External (内部発信器と外部発信器)

マイコンの内部にはRC発振回路があるのでコストを下げるために使われることが多いと思います。
ただし、これは少し精度が悪いので気をつけてお使いください。

例えばUSBの機能がついているマイコンでUSBを使う場合には、それなりに精度が必要ですから外部発信器を検討する必要がありそうです。

それから温度変化によって発振周波数は変化するので、使う環境によっては外部の発振回路を検討する必要が出てくるでしょう。

その他にシリアル通信する相手の機器との周波数の誤差が大きいと通信エラーになる可能性が出てきますので、そのあたりも考慮する必要がありそうです。

外部発振子なしで、UART通信は可能ですか? の記事は参考になると思いますので、ぜひご覧になってください。

LSI, LSE の方は低速用の 32.768(32)kHz のクロックソースとして使います。
HSI, HSE の方は高速用のクロックソースとして使います。

このプロジェクトでは HSE=8MHz に設定されています。(外部から入力される矩形波が8MHzです)
またこのボードに使用されているマイコン(STM32F401RE)の HSI は 16MHz 固定です。

RTC Clock Mux

系統図の左上に RTC Clock Mux があります。
Muxはマルチプレクサの略称です。HSE/LSE/LSIのいずれかを選択することができ、デフォルトではLSIが選択されています。

このボードには(LSEとして)32.768kHzの水晶振動子が実装されているので、デフォルトがLSEでも良さそうです。

(一般的に LSI より LSE の方が精度が良いはずですから)

というわけで、RTC Clock Mux を LSI から LSE に変更してみましょう。

RTC Clock Mux の「台形」の中にあるラジオボタンをクリックしても動きません。

その下の System Clock Mux の方はラジオボタンが水色になっていて、クリックすると動きますね。。

その理由は、RTCが有効になっていないからです。

お隣の Pinout & Configuration – Categories – Timers – RTC の Activate Clock Source にチェックを入れます。

そうすることで、RTC Clock Mux のラジオボタンが選択できるようになります。

LSE , RTC を使う場合の方法として覚えておいてください。

To IWDG Clock

RTC Clock Mux のすぐ下に To IWDG(kHz) と書かれています。

こちらに選択の余地はありません。無条件にLSIがクロックソースとして使われます。

IWDGは独立型のウォッチドッグタイマーです。

こちらにさほど精度は必要ないと思うので、LSIを使うことに意義はありません。

メインクロック系と独立していることで、メインクロックに障害があっても暴走検出できるようになっています。

LSEの選択肢

RTC Clock Mux の左の方を見ていくとInput frequencyと書かれた水色のテキストボックがあり、32.768 (kHz) と書かれています。

水色なので、この部分が有効であることを示しています。

32.768kHzが中途半端な数値だと思われる方がいらっしゃるかも知れませんが、実はそんなことはありません。

2^15が32768になり、この周波数を分周することで1秒がピタリつくれるようになっています。

というわけで32.768kHzは、RTCに適した周波数であると言えます。

お隣の Pinout & Configuration – Categories – System Core – RCC の Low Speed Clock(LSE) を見ると Crystal/Ceramic Resonator が選択されています。

ここで Disable を選択するとInput frequency のテキストボックスは無効になります。

RTCを使わない場合や、部品代を節約してLSIをRTCのクロックソースにする場合には、ここをDisableにすればよいでしょう。

LSEを使う場合には、先ほどの Crystal/Ceramic Resonator か BYPASS Clock Source のどちらかを選択することになります。

水晶振動子を使う場合には Crystal/Ceramic Resonator を選択し、水晶発振器などの矩形波を入力する場合には BYPASS Clock Source を選択します。

一般に水晶発振器の方が精度が良いので、それを目安にどちらを使うか選択すれば良さそうです。

水晶振動子や水晶発振器の仕様書を見ると周波数許容偏差(f_tol)が出ています。

水晶発振器で、まあまあの精度のものだと、この値が 5×10-6 あたりでしょうか。

良く機器の仕様に時計機能の項目に月差〇〇秒と書かれています。5×10-6の場合を計算してみます。

この値は1秒間のずれですから、そのまま1か月分を積算していけば良いことになります。

60 * 60 * 24 * 31 * 5 / 1000000 = 13.392秒

水晶振動子だと 20×10-6 あたりの精度のものがあります。

こちらだとその4倍ずれてしまうことになりますね。

このあたりの数値を参考に、どちらの部品を使うか決めれば良いでしょう。

ただしおサイフ(コスト)とも相談しないといけませんね。

PLL

PLL は Phase Locked Loop の略で日本語では位相同期回路です。
入力の周波数を整数倍した出力を得ることができます。

このボードでは 8MHz から 84MHz を作り出すことができ、マイコンを高速で動作させることができます。

PLL Source Mux

PLLへのクロックソースを HSI または HSE から選択することができます。

Pinout & Configuration – Categories – System Core – RCC の High Speed Clock(HSE) が Disable の場合には HSE を選ぶことはできません。

このボードの場合 HSE用の水晶振動子(X3)が実装されていないので、上記 RCC の High Speed Clock(HSE) は BYPASS Clock Source にしておきます。

(デフォルトではこの設定になっていると思います)

BYPASS Clock Source は外部から矩形波を入力する場合に使います。
このボードではデバッグ用のマイコンからの MCO 出力が OSC_IN 端子(5番ピン)に入力されていますので回路図を確認してみてください。

波形を確認したところ以下の通り 8MHz でした。初期設定値と合っていますね。

System Clock Mux

システムクロックを HSI, HSE, PLL から選択することができます。

高い周波数で動かしたい場合には、当然 PLL を選択するべきですね。

そして、この出力から PCLK1, PCLK2 がつくられます。

ペリフェラルによってどちらのクロックが使われるのか決まっています。

こちら からリファレンスマニュアル(RM0368)の39ページの表をご覧いただくとおわかりになると思います。

×334 などと(乗算の記号が)書かれているコンボボックスでは PLL の逓倍(ていばい)数を変更することができ、

/4 などと(除算の記号が)書かれているコンボボックスでは周波数を分周することができるようになっています。

これらを組み合わせて適切な周波数をつくることができるようになっています。

無理な選択をすると、その部分が赤くなり警告を出してくれます。

このボードの注意点として、もしデバッグ用のマイコンと切り離した場合には、System Clock Mux の設定は HSI にする必要があるということです。

このボードには X3 が実装されていないので、HSEがないために HSI を使う必要があることですね。

I2S Source Mux

I2Sへのクロックソースを PLLI2SCLK または EXT clock から選択することができます。

この部分がグレーアウトしているので、お隣の Pinout & Configuration – Categories – Multimedia で I2S2 または I2S3 の Mode を Disable 以外にすることで I2S clocks が有効になります。

Ext clock の方は Pinout & Configuration – Categories – System Core – RCC の Audio Clock Input (I2S_CKIN) にチェックを入れることで有効になります。

なお、ここをチェックするためには Master Clock Output 2 のチェックをはずしておく必要があります。

MCO1 source Mux

LSE, HSE, HSI, PLLCLK から選択することができます。

こちらを有効にするには Pinout & Configuration – Categories – System Core – RCC の Master Clock Output 1 にチェックを入れます。

動作確認はしていませんが、このクロック出力は Alternate functionsの機能を使って PA8 端子から出力されます。

MCO2 source Mux

SYSCLK, PLLI2SCLK, HSE, PLLCLK から選択することができます。

こちらを有効にするには Pinout & Configuration – Categories – System Core – RCC の Master Clock Output 2 にチェックを入れます。

なお、ここをチェックするためには Audio Clock Input (I2S_CKIN) のチェックをはずしておく必要があります。

動作確認はしていませんが、このクロック出力は Alternate functionsの機能を使って PC9 端子から出力されます。

コード生成

Clock Configurationで設定を変更した後、ビルドすることによりコンフィグレーターがクロックの初期設定コードを生成してくれます。

この部分のコードは main.c の SystemClock_Config()内に実装されます。

いかがでしたか?クロックについて理解できましたでしょうか?

それではお疲れさまでした。

IDEカテゴリの最新記事