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

STM32CubeFx ライブラリでは、HAL (Hardware Abstraction Layer) ライブラリ、BSP (Board Support Package) の他に、各ボード用のサンプル/デモ・プロジェクトが含まれています。
例として、STM32CubeF4 V1.7.0 の場合のフォルダ構成を下に示します。
主にSTM32F4-Discovery 関係だけを示しており、他のボード関係については大幅に省略しています。

+---STM32Cube_FW_F4_V1.7.0
     |
     +---Documentation
     |
     +---Drivers
     |   |
     |   +---BSP
     |   |   |
     |   |   +---Components
     |   |   |   |
     |   |   |   +---Common
     |   |   |   +---cs43l22
     |   |   |
     |   |   +---STM32F4-Discovery
     |   |
     |   +---CMSIS
     |   +---STM32F4xx_HAL_Driver
     |   
     +---Middlewares
     |
     +---Projects
     |   |
     |   +---STM32F4-Discovery
     |
     +---Utilities

STM32CubeMX のメニュー・バーから Help/Updater Settings を選択して開くダイアログの「Repository Folder」で指定したフォルダに、ダウンロードされた .zip ファイルとともに上記の (展開された) ライブラリが格納されています。
Drivers/BSP/Components には周辺チップ単位での共通ドライバが収録されており、STM32F4-Discovery の BSP_AUDIO_OUT では cs43l22 フォルダの中のドライバを使います。
Drivers/BSP/STM32F4-Discovery にはボード固有のドライバがおさめられています。
Projects/STM32F4-Discovery フォルダにはサンプル/デモ・プログラムのプロジェクト・ファイルが、各 IDE 別に作成されたフォルダの中に用意されています。
プロジェクト・ファイルと HAL ドライバ/BSP の各ファイルとの相対的な位置関係は固定ですから、サンプル/デモ・プロジェクト・ファイルでは相対パス指定で各ファイルをアクセスしています。
STM32CubeMX ではユーザが任意に指定するパスにプロジェクト・フォルダが作成されますから、プロジェクト・ファイルから相対アクセスできるように、自動的にユーザ指定のプロジェクト・パスの下に HAL ライブラリの一部あるいは全部がコピーされるようになっています。
STM32CubeMX では自動的に BSP は組み込まれませんから、ユーザが「手動」で BSP 関連のファイル群をコピーする必要があります。
STM32F4-Discovery ボードのオーディオ DAC 出力 (BSP_AUDIO_OUT) を利用する場合の手順についてまとめると次のようになります。 (他のデバイスや、他のボードの場合にはファイル名など細部が異なります)

  1. 全 HAL ライブラリをコピーするように STM32CubeMX の Project Settings を設定

  2. BSP ライブラリをコピー

  3. BSP ライブラリ中の使用する .h / .c ファイルをアプリケーションのプロジェクトに追加したり、インクルード・パスの設定などをする

  4. "stm32f4xx_it.c" に DMA 割り込みハンドラを追加

  5. "main.c" などの中に
    BSP_AUDIO_OUT_Init() 関数および
    BSP_AUDIO_OUT_Play() 関数
    の呼び出しを記述

  6. "main.c" などの中に
    BSP_AUDIO_OUT_HalfTransfer_Callback() 関数および
    BSP_AUDIO_OUT_TransferComplete_Callback() 関数
    を記述

  7. "main.c" などの中にオーディオ DAC 出力を利用するためのユーザ・コードを記述

  8. "stm32f4xx_hal_conf.h" の中で SPI/I2S/I2C モジュールをイネーブルしている #define を有効にする

1. と 8. については前回説明しました。 1. は STM32CubeMX のプロジェクトの設定なので、一回設定すればその後ずっと有効になります。
8. については、STM32CubeMX でコード生成を実行すると "stm32f4xx_hal_conf.h" は書き直されてしまうので、コード生成後、毎回実行しなければなりません。
2. 3. については一回実行しておけばすみます。
STM32CubeMX で、たとえばプロジェクト名を「project」として新規プロジェクトを作成し、使用する IDE をMDK-ARM と指定してコード生成を行なうと、ユーザが指定したパス以下には次のようなフォルダの構造が作られます。 (フォルダ階層の深い部分は省略してあります)

+---project
     |
     +---Drivers
     |   |
     |   +---CMSIS
     |   |
     |   +---STM32F4xx_HAL_Driver
     |
     +---Inc
     |
     +---MDK-ARM
     |
     +---Src
     |
     +---project.ioc

「Drivers」以下の「CMSIS」、「STM32F4xx_HAL_Driver」フォルダの階層構造は、もとのライブラリのものと相似になっています。
「BSP」は手動でコピーし、その中の必要なファイルは手動でアプリケーションのプロジェクトのコンパイル対象として追加するので、その「位置」は任意に選べますが、 BSP についても、もとのライブラリと相似の位置に置くのが得策です。
さらに、STM32F4-Discovery 用の BSP では、オーディオ DAC 出力 (BSP_AUDIO_OUT) と、シリコン・マイク入力 (BSP_AUDIO_IN) とが同一のファイル (stm32f4_discovery_audio.c) に含まれているため、コンパイルが成功するためには使用していない AUDIO_IN のインクルード・ファイルについてもケアしなければなりません。
シリコン・マイクからは PDM (Pulse Density Modulation) 形式で出力されてくるので、それを PCM に変換するフィルタが必要です。
そのフィルタについてはソースは公開されておらず、オブジェクト・ファイルだけが「ミドルウェア」として STmicro から提供されています。
具体的には、ライブラリ中では

STM32Cube_FW_F4_V1.7.0/Middlewares/ST/STM32_AUDIO/Addons/PDM

フォルダの中にヘッダ・ファイルと PDM フィルタのオブジェクト・ファイルがおさめられています。
これは、BSP のヘッダ・ファイル "stm32f4_discovery_audio.h" の中で、

#include "../../../Middlewares/ST/STM32_Audio/Addons/PDM/pdm_filter.h"

のように「ハード・コーディング」されているので、それを書き換えない限りは、指定の相対位置にヘッダ・ファイルを置いておかないとコンパイルが成功しません。
したがって、下の図のように、もとのライブラリでの構造と相似な形で「BSP」フォルダと「Middlewares」フォルダをコピーしてくるのが最も簡単です。

+---project
     |
     +---Drivers
     |   |
     |   +---BSP
     |   |
     |   +---CMSIS
     |   |
     |   +---STM32F4xx_HAL_Driver
     |
     +---Inc
     |
     +---MDK-ARM
     |
     +---Src
     |
     +---Middlewares
     |
     +---project.ioc

次回は、前に示した手順の 3. 以降の項目について説明します。