STM32F4-Discovery 用FM音源プログラム -- TGSTM32F4 (7)

HSE クロックの水晶振動子の周波数を 12.096 MHz に選ぶと、SYSCLK 168 MHz、USB クロック 48 MHz ジャストを維持したままで、I2S のサンプリング周波数の大部分を誤差ゼロで実現できることが分かりました。
(システム) PLL および PLLI2S のリファレンス周波数は、通常の 1 MHz ではなく、

HSE_VALUE / PLL_M = 12.096 [MHz] / 9 = 1.344 [MHz]

となります。 (PLL_M = 9)
ここで、PLL_N = 250、PLL_P = 2、PLL_Q = 7 と選ぶと、

fVCO = 1.344 [MHz] × PLL_N = 1.344 [MHz] × 250 = 336 [MHz]
SYSCLK = fVCO / PLL_P = 336 [MHz] / 2 = 168 [MHz]
USBCLK = fVCO / PLL_Q = 336 [MHz] / 7 = 48 [MHz]

また、RTC モジュールへのクロックとして、HSE クロックを整数分の 1 に分周して供給する場合にも、誤差が生じることはありません。
MCLK を生成する条件での、各種のサンプリング周波数に対する PLL_N、PLL_R、I2SDIV、I2SODD および誤差の表を下に示します。 (3 月 6 日追記: 表を差し替えました)

HSE_VALUE = 12096000, PLL_M = 9, PLL_REF_CLK =  1.344000 MHz

 Target  PLL PLL I2S I2S    Real        error     I2SCLK
 fs [Hz]  N   R  DIV ODD    fs [Hz]     [ppm]      [MHz]
-------- --- --- --- --- ------------ --------- ----------
   6000  192  7  12   0    6000.00000      0.00    36.8640
   8000  192  7   9   0    8000.00000      0.00    36.8640
  11025  210  5  10   0   11025.00000      0.00    56.4480
  12000  192  7   6   0   12000.00000      0.00    36.8640
  16000  192  7   4   1   16000.00000      0.00    36.8640
  22050  210  5   5   0   22050.00000      0.00    56.4480
  24000  192  7   3   0   24000.00000      0.00    36.8640
  32000  256  7   3   0   32000.00000      0.00    49.1520
  40000  320  7   3   0   40000.00000      0.00    61.4400
  44100  210  5   2   1   44100.00000      0.00    56.4480
  45000  240  7   2   0   45000.00000      0.00    46.0800
  48000  192  3   3   1   48000.00000      0.00    86.0160
  49516  283  6   2   1   49525.00000    181.76    63.3920
  49716  303  4   4   0   49710.93750   -101.83   101.8080
  49749  199  3   3   1   49750.00000     20.10    89.1520
  50000  200  3   3   1   50000.00000      0.00    89.6000
  60000  240  3   3   1   60000.00000      0.00   107.5200
  64000  256  3   3   1   64000.00000      0.00   114.6880
  81000  216  2   3   1   81000.00000      0.00   145.1520
  88200  252  3   2   1   88200.00000      0.00   112.8960
  96000  256  2   3   1   96000.00000      0.00   172.0320
 100000  305  4   2   0  100078.12500    781.25   102.4800
 107000  204  2   2   1  107100.00000    934.58   137.0880
 110000  314  3   2   1  109900.00000   -909.09   140.6720
 120000  274  3   2   0  119875.00000  -1041.67   122.7520
 128000  195  2   2   0  127968.75000   -244.14   131.0400
 160000  244  2   2   0  160125.00000    781.25   163.9680
 168000  256  2   2   0  168000.00000      0.00   172.0320
 176400  269  2   2   0  176531.25000    744.05   180.7680
 187250  285  2   2   0  187031.25000  -1168.22   191.5200
 187500  285  2   2   0  187031.25000  -2500.00   191.5200

(3 月 6 日追記: PLLI2S のリファレンス周波数が 1.34 MHz に上がったことにともなう VCO 出力周波数の上限の制限がプログラムで正しく考慮されていなかったのを修正し、表を差し替え、以下の記述にも変更を加えました。)
1 kHz から 81 kHz までの、1 kHz ステップでの各サンプリング周波数に対して誤差が正確にゼロになり、当然、ディジタル・オーディオで使う 32 kHz、48 kHz、96 kHz も含まれます。 (41 kHz、43 kHz、44 kHz、46 kHz、47 kHz を除きます)
また、ディジタル・オーディオで使う 11.025 kHz、22.05 kHz、44.1 kHz、88.2 kHz に対しても誤差は正確にゼロになります。
FM 音源チップのサンプリング周波数である 49 kHz 台では、誤差ゼロとはなりませんが、20 〜 200 ppm 程度の誤差におさえられています。
44.1 kHz の 4 倍の 176.4 kHz では 750 ppm 程度の誤差が生じます。
また、48 kHz の 4 倍の 192 kHz は、I2SCLK の周波数制限 (192 MHz) のために、実現できません。
PLL のリファレンス周波数を 1 MHz に選んだ場合、実現できる最大サンプリング周波数はスペック上 187.5 kHz となりますが、HSE クロック周波数を 12.096 MHz に選んだ場合は、誤差ゼロで実現できる kHz 単位で切りのいい値の最大サンプリング周波数は、それより低い 168 kHz になります。
HSE を分周したもの (HSE_RTC) を RTC_CLK として使う場合も、分周比が 1/22 および 1/26 以外の 12 以上 30 以下の偶数の場合に対して 12.096 MHz が割り切れ、RTC モジュール内での 1 Hz クロック生成に対して誤差が出ません。
12.096 MHz という周波数の水晶振動子は、たとえば、秋月で扱われるほどメジャーなものではありませんが、非常に特殊というわけではなく、Digi-Key から購入できますし、「サトー電気」で HC49US タイプの物が 1 個 126 円という「普通」の価格で売られています。
ただし、サトー電気では、表面実装型の 12.960 MHz の水晶振動子を安く (単価 53 円) 売っているので間違えないように注意してください。
12.960 MHz でも、11.025 kHz から 96 kHz までのディジタル・オーディオ用サンプリング周波数は誤差ゼロで実現できますが、SYSCLK と USB クロックは都合の良い値になりません。
私の場合は、すでに使用しなくなった DVD 再生用 MPEG2 カードから取り外した 12.096 MHz の水晶振動子を使って試してみようと思っています。
HSE クロック周波数を変えると、当然、スタートアップ・ルーチン内の PLL 設定部分の変更と、ライブラリに対する HSE_VALUE の定義の修正が必要になります。