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

STM32CubeMX の「バグ」と思われる現象について触れたいと思います。
ただし、この状態を解消するのは簡単な操作ですみます。
発生する条件/タイミングについては不明ですが、発生した場合には生成された C コードでフラッシュ・メモリの読み出しのウェイト・サイクル数が「不正」に (不足して) 設定され、プログラムが正常には実行されなくなります。

STM32CubeMX でポート設定変更 → C コード生成 → ユーザ・プログラム部分変更 → コンパイル → 実行

という流れを繰り返してプログラムを開発している最中に、突然プログラムが動かなくなった場合、「バグ」の存在に気づいていないと、動かない原因ではないユーザ・プログラム部分ばかりを見て、時間を浪費してしまいます。
「バグ」が発生した状態での「Clock Configuration」画面の一部を下に示します。

表示されていない部分のメイン PLL で 84 MHz クロックを生成し、画面左端の「システム・クロック・マルチプレクサ」で PLL クロック出力をシステム・クロックとして選んでいます。
AHB プリスケーラ は 1/1 なので、画面中央部の「HCLK (MHz)」と記されている「ハコ」の中身も 84 MHz であるべきですが、そこに正しくない値「16」が入っています。
そこから右側の各バスへのクロックは正しい値 84 MHz になっており、「HCLK」だけが不正な値 16 MHz になっています。
バス・クロックの数値は正しいので、バス・クロック設定のための C コードも正しく生成されます。
HCLK の値はフラッシュ・メモリのウェイト・サイクル数の設定 (だけ) に使われているようで、不正になるのはウェイトサイクル数だけのようです。
バグ発生時の C コード (main.c の一部) を下に示します。

void SystemClock_Config(void)
{
. . . . . <中略> . . . . .

  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

. . . . . <中略> . . . . .
}

システム・クロック設定のための関数 SystemClock_Config() の中でフラッシュ・レイテンシを「0」に設定していますが、正しくは「2」でなければなりません。 (電源電圧 3.3V, 84 MHz クロックの場合)
レイテンシ「0」は (正しくない) 16 MHz クロックに対するものと思われます。
このバグへの対策は、STM32CubeMX の「Clock Configuration」画面でシステム・クロック・マルチプレクサの選択をいったん「PLL クロック」以外にしてから「PLL クロック」へ戻せば、マルチプレクサ以降のクロックの「再計算」が行われて「HCLK」の値も正しくなります。
このバグ発生の条件/タイミングは不明なので、前回までは何の問題もなく C コード生成できていたのに、今回はバグを踏み抜いてしまうというケースもありますから、毎回「Clock Configuration」画面で HCLK の値をチェックしておく必要があります。