STM32F4-Discovery/Nucleo-F401RE 用FM音源プログラム -- TGSTM32F4 (14)

久しぶりに秋葉原へ出かけて、

  • 9.216 MHz 水晶振動子 (秋月)
  • Nucleo-F401 (秋月)
  • FM 音源チップ YMF297、YM2610 (FM 音源ガチャ)
  • PIC32MX250F128B (秋月)

などを買ってきました。
FM 音源チップや、PIC32MX については別の記事で触れることにして、今回は STMicroelectonics 製の「Nucleo-F401RE」について取り上げます。
STM32F4-Discovery ボードと比較すると、

  STM32F4-Discovery Nucleo-F401RE
搭載チップ STM32F407VGT6 STM32F401RET6
チップ・ピン数 100 ピン 64 ピン
最大クロック
周波数
168 MHz 84 MHz
ボード上の
周辺デバイス
オーディオDAC、LED 4個、
加速度センサ、タクトSW
シリコン・マイクなど
LED 1個、タクトSWのみ
外部クロック用
水晶振動子
実装ずみ (8 MHz) なし
Arduino 互換
コネクタ
なし あり
mbed サポート なし あり

チップ内蔵の周辺モジュールも、F407 にはあったイーサネット MAC や USB OTG HS MAC は F401 では省略されています。
ただし、これらのモジュールを使わないアプリケーションに対しては影響ありません。
FM 音源プログラムのような、ディジタル・オーディオ出力主体のアプリケーションでは、Nucleo-F401RE は STM32F4-Discovery に比べて、

  • 最大クロック周波数が半分の 84 MHz になる
  • オーディオ DAC を外付けする必要がある
  • 外部クロック用水晶振動子を実装する必要がある

点がデメリットになります。
ただし、F401 でも F407 同様に I2S 用の PLL が内蔵されているので、12.096 MHz の水晶振動子を使って、CPU を最高の速度の 84 MHz で動かし、USB 用の 48 MHz も供給しながら、ディジタル・オーディオ用のサンプリング周波数の 22.05 kHz、32 kHz、44.1 kHz、48 kHz などを 256 fs のマスター・クロック付きで誤差ゼロで実現できます。 (→こちらの記事)
Nucleo シリーズは、搭載チップが異なっていても、各ボートが同一の価格 (秋月価格では 1500 円) で販売されていますが、I2S 用 PLL が内蔵されているのは F4xx だけなので、ディジタル・オーディオ用途には F401RE を選ぶのが妥当です。
Nucleo では、外部クロック用の水晶発振回路の部品が全く実装されていません。 (20 pF コンデンサすらも)
また、ボード・リビジョンが「C-01」では、ST-LINK の MCU の MCO 出力から供給される 8 MHz クロックも接続されていないので、デフォルトの状態では内部 RC 発振回路による 16 MHz HSI クロックだけが PLL の入力クロックとして使えます。
一方、Discovery では、デフォルトで ST-LINK 側の MCO 8 MHz が有効な状態で、実装されている 8 MHz の水晶振動子は単なる「飾り」にしかなっていませんでした。 (→こちらの記事)

USB アプリケーションのように、正確な周波数が必要な場合には HSI では十分な性能が得られません。
これを解決する最も簡単な方法は、SB16 と SB50 のハンダ・ブリッジを導通させて ST-LINK 側の 8 MHz を入力する方法です。 8 MHz 以外を選べませんが、これなら追加のコストもかかりません。
ここでは、8 MHz 以外の外部クロックを利用するため、水晶振動子をボードに実装する方法を示します。
まず、デフォルトの状態のボードの状態の写真を下に示します。

これを機能させるには、

  • R35、R37 に 0 Ω 抵抗 (ジャンパ線) を実装
  • X3 に水晶振動子を実装
  • C33、C34 に 20 pF (22 pF) のチップ・コンデンサを実装

する必要があります。
水晶を差し替えられるように、3 ピンのシングル・インライン・ソケットを X3 の部分に実装しました。

X3 のエリアの中央部にパターンが走っているので、その部分に穴をあけるわけには行かず、ソケットの中央のピン (の基板に刺さる部分) を切断して、残りの部分にリード線をハンダ付けしてグラウンドに落とし、コンデンサ内蔵型セラミック振動子を使えるようにしています。
20 pF コンデンサについては、手持ちにサイズが適合するチップ・コンデンサがなかったので、基板裏面に通常のリード線タイプの 22 pF 積層セラミック・コンデンサを付けました。

SB60 はアナログ・グラウンドとディジタル・グラウンドを接続しているハンダ・ブリッジなので、22 pF コンデンサの片足を落としています。
なお、SB54 と SB55 は OSC_IN 端子と OSC_OUT 端子を拡張コネクタに引き出すためのハンダ・ブリッジで、発振への影響を少なくするためには除去する必要があります。
拡張コネクタから外部クロックを入力する必要がある場合には、SB55 は導通させたまま残しておきます。
12.096 MHz の水晶振動子を差し込むと下の写真のようになります。

この状態で、システム・クロック側と、I2S クロック側とが、それぞれ正しい周波数になることを確かめました。