ソフト S/PDIF トランスミッタ (8)

秋葉原へ出かけて、

  • FM 音源チップ YMF276-M (FM 音源ガチャ)
  • STM32 Nucleo-F411RE (マルツ)

を買ってきました。
YMF276-M については別の記事で触れることにして、今回は Nucleo F411RE について書きます。
Nucleo シリーズの F411RE 以外のボードについては、マルツ価格で 1450 円ですが、F411RE だけは 100 円高い 1550 円となっています。
搭載しているチップは STM32F411RET6 で、STM32F401RET6 と比較すると、主に次のような点が違っているようです。

  1. 最大クロック周波数が 84 MHz から 100 MHz に
  2. RAM 容量が 96 Kバイトから 128 Kバイトに
  3. F401 では APB2 にぶら下がる SPI はひとつだけで I2S 機能がなかったが、F411 では APB2 側の SPI が SPI1/SPI4/SPI5 の 3 本となり、それぞれ I2S 機能も付いている
  4. F401 ではメイン PLL と I2S PLL とで共用していたリファレンス・入力ディバイダ (PLLM) が独立となった
  5. F401 では APB バスクロックが HCLK の 2 分周となる設定までは、タイマのクロック入力が逓倍されて実質のクロック周波数が HCLK 周波数となる機能があるが、F411 では APB バスクロックが 4 分周までに拡張された

F401 と F411 の両方で動くオブジェクトを作成することを考えると、1.、2.、3. のクロック周波数/RAM 容量/周辺モジュールの拡張については、F401 と同じ範囲を使うならば、F411 としてはもったいないですが、F401/F411 共用のオブジェクト・コードにすることができます。
4. については、F401 用のオブジェクトそのままでは F411 では正しく動作しません。
F401 では予約済みとなっている領域に F411 では I2S PLL の PLLM 値を書き込むようになっています。
現在のバージョン (V3.4.1) の STM32CubeMX では、「チップ」としては F411 はサポートされていますが、「ボード」としては、まだ Nucleo F411RE はサポートされていません。
F401/F411 共用のオブジェクトを作成するには、Nucleo F401RE 用のプロジェクトを作成し、F411 で動作させるためのコードを追加します。
とりあえず、I2S PLL については次のコードで F411 で動作することを確認しました。

void modify_i2s_pll( void )
{
  uint32_t i2s_pllm;

// get PLLM value from main PLL  
  i2s_pllm = (0x3F & RCC->PLLCFGR);
  __HAL_RCC_PLLI2S_DISABLE(); // stop I2S PLL
// wait for I2S PLL halted  
  while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) {}
// set PLLM value for I2S PLL
  RCC->PLLI2SCFGR = ((~0x3F & RCC->PLLI2SCFGR) | i2s_pllm); 
  __HAL_RCC_PLLI2S_ENABLE();  // re-start I2S PLL
} // void modify_i2spll()

これは、メイン PLL の PLLM 設定を読み出して (いったん動作を停止させて) I2S PLL の PLLM 設定部分にコピーしているだけです。
F401 でこの動作をさせても特に問題はなかったので、F401/F411 の判別をして選択的に実行させる必要はないと思います。
また、Nucleo ボードとしてのリビジョンも「MB1136 C-01」から「MB1136 C-02」に変わっていました。


ユーザマニュアル UM1724 (Rev 5) によれば、リビジョン C-02 では、

  • ST-LINK 側の MCO 8 MHz 出力を F411 の外部クロックとして使う設定「MCO from ST-LINK」(SB16, SB50: ON)
  • 「X2」 32.768 kHz 水晶は実装ずみ

と記されており、実際もそうなっていました。
外部クロック周波数が 8 MHz で用が足りる場合には、そのまま利用でき、手を加える必要がありません。
ソフト S/PDIF プログラムでも 48 kHz サンプリング周波数に対して 8 MHz 外部クロックを使用する設定になっているので、F411 対応部分を組み込めば、ハードウェアは「無改造」で使用できます。