クロックの設定をしてみる

ボード上には3個のクリスタルがあります。

①ST-Linkの8MHzクリスタル。
②RTC用の32.768kHzクリスタル。

③の外部クリスタルはオプションで最初から取り付けられていません。必要ならばユーザーが取り付けます。


STM32は内部クロック(内部RC発振回路)と外部クロックを選択できるようになっています。CubeMXのデフォルトでは内部クロックの最高スピードに設定されまので、とりあえずはそのままでも良いのですが少し設定を変えてみます。NucleoのリバージョンがC-02以降では、上側のST-LinkのMCUから下側のMCUへ外部クロックを供給できるように配線されています(L476RGを除く)。STM32にはマスタークロックアウト(MCO)ピンがありクロックを外部へ出力することができます。上側MCUのマスタークロックアウトが下側のMCUの外部クロック入力に接続されています。上側MCUには8MHzのクリスタルが付いていますからともて誤差の少ないクロックを出力します。Nucleoを2つに切り離さない限り追加で③の外部クリスタルを取り付けなくても精度の高いクロックを得られます。


それではCubeMXで外部クロック設定をしてみます。PinputページのRCC->High Speed Clock(HSE)をBYPASS Clock Soureに設定します。


①Clock Configurationページへ移るとHSEが有効になっています。
②PLL Source MuxのHSEをオンにします。
③分周を/8にします。

クロックソースは2MHz以下にしか設定できないので切りの良い1MHzか2MHzになるように設定します。もし外部クリスタルを取り付ける場合でもPLLで分周できるので、整数で割り切れる周波数であれば何ヘルツのクリスタルを使っても良いことになりなす。


内部RC発振回路は最大±4%の誤差があるので精度がシビアな回路には使えません。実際には内部RC発振の誤差は2~3%くらいで、キャリブレーションも掛けられるので、頑張れば1%くらいまで持って行くことができます。外部クリスタルを追加すれば無調節で誤差は測定限界近くになりますから、そっちの方が確実ではあります。


クロックがどれだけ正確かどうかは周波数カウンタかオシロスコープでもないと測定できませんが、周波数を落としたタイマー出力などを使えば低い周波数でも誤差がどれくらいあるか判定できます。周波数が20kHz以下ならパソコンのオーディオ入力でも測定はできます。信号レベルが大きいのでダイレクトに入力するのはオススメではありませんが・・・測定器はできればそろえた方が良いのですが無くても判断できるという例です。