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

BSP (Board Support Package) とは、その名の通り STMicro 製の Nucleo ポード類、Discovery ボード類、および各種の評価ボード類に実装されているペリフェラルをサポートするドライバ類のパッケージです。
これらは、以前の「Standard Peripheral Library」時代には各ボード個別のサンプル・プログラム集に付属していたライブラリを、新しい HAL ライブラリを利用するように書き換え STM32CubeFx ライブラリに統合したものです。
たとえば、STM32F4-Discovery の場合には、アプリケーション・ノート AN3997 「Audio playback and recording using the STM32F4DISCOVERY」で説明されているオーディオ・アプリケーションおよびライブラリは、もともとは「STM32F4-DISCOVERY board firmware package」に入っていましたが、現在は HAL ライブラリ対応版のアプリ/BSP として STM32CubeF4 ライブラリの中に含まれています。
STM32CubeF4 ライブラリの BSP では、STM32F4-Discovery ボードの

  • LED 4 個
  • ユーザ・ボタン・スイッチ (青色)
  • LIS302DL 加速度センサ
  • MP45DT02 シリコン・マイク
  • CS43L22 オーディオ DAC

がサポートされています。
BSP は「自前」の初期化ルーチンを持っていて、たとえば、オーディオ DAC については、

  BSP_AUDIO_OUT_Init(0, 85, 48000);

とすると、デフォルトのヘッドフォン出力をオーディオ出力として選択し、ヘッドフォン・アンプのボリュームを 85 に調整し、サンプリング周波数を 48 kHz に設定してくれます。
オーディオ DAC の CS43L22 は I2C インターフェース経由で設定する仕様になっているので、1 からプログラムを書き起こそうとすると面倒ですが、当然、BSP の初期化ルーチンでは I2C の設定も含めて全部やってくれます。
DAC へのデータ転送は DMA を使って行なわれ、

  BSP_AUDIO_OUT_Play(dac_dma_buf, DMA_BUF_BYTES);

のような形で、DAC 出力を開始できます。 第一引数が DMA バッファへのポインタ、第二引数が DMA バッファのバイト単位でのサイズです。
DMA バッファ内のオーディオ・データの更新は、DMA 割り込みハンドラから呼び出されるコールバック関数の中で行います。
STM32CubeMX で自動生成される C コードでは、割り込みハンドラ類は「main.c」のファイルの中ではなく、「stm32f4xx_it.c」に集められるので、STM32CubeMX のコードと BSP とを共存させるには「stm32f4xx_it.c」のユーザ・コード記述部分 (ファイルを更新しても消されない部分) に BSP 内のハンドラを呼び出すようなコードを追加しておく必要があります。
次回はSTM32CubeMX のコードと BSP とを共存させるための具体的な方法について説明します。