Nucleo-F401RE 用FM音源プログラム -- TGF401RE (1)

6 月 24 日付けの記事では、STM32F4-Discovery 用のFM音源プログラム TGSTM32F4 に手を入れて Nucleo-F401RE にも対応させるつもりでしたが、方針を変更して、Nucleo 用のプログラムは独立させることにしました。
周辺モジュールの操作部分は STM32Cube を利用して作成しようと思います。 プログラム名は「TGF401RE」としました。
Discovery 用プログラムも STM32Cube を利用する形に書き直した後に両者をすりあわせ、統合したいと思います。
ところで、今回の話題は、「aitendo」で 10 個 100 円で販売されている 28.224 MHz の水晶振動子を使って、12.096 MHz の水晶振動子と同様のクロック設定が可能であると確認したことです。
12.096 MHz の水晶振動子では、これを 9 分周して
12.096 MHz / 9 = 1.344 MHz
を PLL のリファレンス周波数としていました。
28.224 MHz は 1.344 MHz の 21 倍なので、
28.224 MHz / 21 = 1.344 MHz
とすれば、その他の部分の設定は 12.096 MHz と同じ設定で同様の結果が得られます
具体的には PLLM の設定を 9 から 21 に変更して、

  RCC_OscInitStruct.PLL.PLLM = 21;

とすれば OK です。
問題は、STM32F401RE の HSE (高速外部クロック) 発振回路の周波数範囲が 4 〜 26 MHz で、28.224 MHz では保証範囲外となってしまうことです。 (チップの発振回路を使わず、「外部クロック」として入力するなら 50 MHz まで可能)
STM32CubeMX のクロック・コンフィギュレータで水晶振動子の周波数を 28.224 MHz に設定すると、赤色で範囲外であることを示す警告が表示されます。
(2014 年 6 月 29 日追記: スクリーン・ショットを追加しました。 図をクリックすると拡大します。)
(2014 年 6 月 30 日追記: I2SPLL の設定値 PLLI2SR が誤っていたのを訂正し、図を差し替えました。)

STM32CubeMX_scr_28M224_smal.jpg

ソース・コード生成にあたっても、警告が出ますが、コード生成そのものは正常に行われます。
実際のチップで水晶振動子を差し替えて試すと、室温において、10 個中 10 個 (100 %) 正常に発振しました。
「動けばいい」というレベルでは十分ですが、条件の悪い場合にはどうなるか分かりません。
昔は、27 MHz 程度以上の発振周波数を境に、基本波から 3 倍オーバートーン発振に切り替わりましたが、最近は、その境界は 33 MHz 程度のようです。
この aitendo の 28.224 MHz 水晶振動子も基本波発振のようです。

これは、ブレッドボード上に左に示す回路を組んで確かめました。
ダンピング抵抗 Rd により高域のゲインを落とし、3 倍オーバートーン発振が起こりにくいようにします。
Rd = 0 〜 100 Ω 程度では 28.224 MHz で発振し、Rd = 470 Ω では発振せず、1/3 の周波数の 28.224 MHz / 3 = 9.408 MHz で発振することはありませんでした。
また、CMOS インバータを HCMOS の 74HCU04 からメタルゲート CMOS の 4069UB に差し替えた場合には全く発振しませんでした。
メタルゲート CMOS では、もともと高域のゲインが小さく、3 倍オーバートーンの水晶なら基本波の周波数で発振します。
これらのことから、この水晶は基本波発振であると結論づけました。
仮に、28.224 MHz の水晶が 3 倍オーバートーン仕様で、それが基本波の 9.408 MHz で発振したとしても、その場合には
9.408 MHz / 7 = 1.344 MHz
ですから、7 分周すれば目的の PLL リファレンス周波数 1.344 MHz が得られます。
この場合、HSE の発振保証範囲に入るので、かえって好都合です。
ただし、3 倍オーバートーン発振周波数は、全く正確に基本波発振周波数の 3 倍というわけでないので、発振周波数に少し誤差が加わる可能性があります。