新版FM音源プログラム (4)

STM32CubeMX で新規プロジェクトを立ち上げる際のダイアログで「MCU Selector」タブではなく「Board Selector」タブを選ぶと、選択したボードで使われているピン (ポート) のコンフィギュレーションがあらかじめ設定されたプロジェクトが生成されます。
ただし、これはピン (ポート) のコンフィギュレーションのみで、使用する内蔵ペリフェラル・モジュールはイネーブルされていませんし、BSP (Board Support Package) が自動で組み込まれることもありません。
「STM32F4-Discovery」を指定した場合、ピンの割り当ては下の図のようになります。

オーディオ DAC CL43L22 で使用するピンは、

ポート 信号名 ユーザ・ラベル
PC7 I2S3_MCK I2S3_MCK [CS43L22_MCLK]
PC10 I2S3_SCK I2S3_SCK [CS43L22_SCLK]
PC12 I2S3_SD I2S3_SD [CS43L22_SDIN]
PA4 I2S3_WS I2S3_WS [CS43L22_LRCK]
PB6 I2C1_SCL Audio_SCL [CS43L22_SCL]
PB6 I2C1_SDA Audio_SDA [CS43L22_SDA]
PD4 PD4 Audio_RST [CS43L22_RESET]

の 7 本です。
STM32CubeMX の実行で生成される「main.c」ファイルの中に含まれる MX_GPIO_Init() 関数に、上の 7 本に限らずピン設定の処理がまとめられています。
main() 関数のユーザ・コード記述部の前に MX_GPIO_Init() 関数の呼び出しが置かれており、ユーザ・コード部にプログラムの制御が移ってきた時点でピン (ポート) は設定済みとなっています。
それに対して BSP では、たとえば BSP_AUDIO_OUT_Init() 関数を呼び出すまではピン (ポート) の初期設定は行なわれません。
BSP でのピンの初期化は外部に依存せず、「自力」で必要な設定を行います。 つまり、MX_GPIO_Init() 関数での設定は「障害」にはなりませんが「無駄」になります。
この「無駄」を省くには、STM32CubeMX のピン設定画面で、当該ピンを「Reset_State」の設定に戻せば初期化コートが生成されなくなります。
しかし、残念なことに、ピンを「Reset_State」に戻すとユーザ・ラベルの定義が失われてしまいます。
MX_GPIO_Init() 関数での初期化コード量は、1 ピン当たり 5 〜 6 行なので、「無駄」を承知の上で、ユーザ・ラベルを維持するためにピン設定を残しておくという選択をすることもできます。
一方、当該内蔵モジュールをイネーブルすると、STM32CubeMX で生成される初期化コードと、BSP 側のコードとの間にコンフリクトが生じるおそれがあります。
具体的には、同じ内蔵モジュールの同じ割り込みハンドラを STM32CubeMX で生成されるコードと BSP 側との両方で定義しようとして 2 重定義エラーとなり、コンパイルが成功しなくなります。
ただし、BSP 側の割り込みハンドラは自動で組み込まれるわけではなく、「手動」で組み込まなければなりませんが、その際に問題になります。
この解決策としては、STM32CubeMX で当該内蔵モジュールをイネーブルせず、ディスエープルされたままにしておくのが最も簡単です。
ただし、問題も生じます。 それは、STM32CubeMX ではイネーブルされていない内蔵モジュールの HAL ライブラリは、基本的には組み込まないようになっているためです。
ファイル生成の実行で Inc フォルダに置かれる「stm32f4xx_hal_conf.h」ファイルでは必要な内蔵モジュールのヘッダ・ファイルだけをインクルードする仕様になっており、他の用途で使っていなければ、BSP_AUDIO_OUT で必要な SPI / I2C / I2S モジュールのヘッダ・ファイルをインクルードしません。
そのままではコンパイルが成功しないので、「stm32f4xx_hal_conf.h」ファイルの中の「//」でコメント・アウトされている部分を

    #define HAL_I2C_MODULE_ENABLED
    #define HAL_I2S_MODULE_ENABLED
    #define HAL_SPI_MODULE_ENABLED

のようにコメント記号を外して有効にする必要があります。
「stm32f4xx_hal_conf.h」ファイルは、あらたにファイル生成をするたびに書き換えられるので、忘れずに毎回コメント記号を外して有効化する必要があります。
それに加えて、STM32CubeMX の「Project Settings」の「Code Generation」タブで、「Copy all used libraries into the project folder」にチェックを入れて、使用していない内蔵モジュールの HAL ライブラリもプロジェクト・フォルダにコピーされるように設定する必要があります。
これは、プロジェクトの設定なので、一度設定しておけば済みます。