STM32F4-Discovery 用FM音源プログラム -- TGSTM32F4 (1)

秋月で少し前に入手した「STM32F4-Discovery」用の FM 音源プログラム「TGSTM32F4」を作りはじめました。
暫定版として、以前の CQSTARM / STBee / STBee mini / STM32VL Discovery 用のプログラムに一部分修正を加えたものが動作しました。
ボード上にはオーディオ用ステレオ DAC の CS43L22 (CIRRUS LOGIC 製) が実装されていますが、簡単のため現状では使わず、 STM32F4 内蔵モジュールの 12 ビット DAC を使い、サンプリング周波数 60 kHz で同時発音数 16 が実現できています。
開発環境は「Atollic TrueSTUDIO for STMicroelectronics STM32 Lite V 2.3.0」を使っています。
STM32F4 は Cortex-M4 コア (ハードウェア浮動小数点演算付き) ですが、M4 で拡張された DSP 命令や、浮動小数点演算は使っておらず、単にクロックの速い (168 MHz) Cortex-M3 として使っているだけです。
STM32F4-Discovery ボード上の CS43L22 のサポートのため、STMicro からライブラリとして、「stm32f4_discovery_audio_codec.c / .h」が提供されています。
このライブラリでは、DMA を使ってステレオ DAC にデータを供給する作りになっており、CPU の負荷は軽くてすみます。
しかし、現状の FM 音源プログラムを DMA 対応にするには、少し手間が掛かるので後に回し、とりあえずオーディオ出力は STM32F4 内蔵の 12 ビット DAC を使うことにしました。
DAC 出力は CS43L22 のアナログ・パススルー入力に接続されているので、単に CS43L22 のヘッドフォンアンプ機能だけを利用すれば、ヘッダ・ピンからアナログ信号を取り出さなくても、ボード上に実装されている 3.5 mmφ のステレオ・ジャックからオーディオ信号を出力できます。
CS43L22 に対するコマンドは I2C バスを介して行うので、手間を省くため、ライブラリの初期化関数を利用して設定を行っています。 オーデイオ・データ転送をともなう本体部分は利用していません。
当初は、この設定を行っても、ヘッドフォン・ジャックから信号が出力されませんでした。
これは、CS43L22 のアナログ部分の動作にはマスタークロック (MCK) の入力が必要なのに、MCK が供給されていないためでした。
CS43L22 へのオーディオ・データの送出は STM32F4 の I2S/SPI モジュールを利用していますが、もともと SPI モジュールなので、送るべきデータがある場合に限って MCK や SCK が送信される仕様になっています。
したがって、単に初期化しただけでは MCK の送出は始まりません。
I2S モジュールにダミーの書き込みを続けるのも面倒なので、CS43L22 の MCK ピンに接続されている PC7 ピンのファンクションを TIM8_CH2 出力に切り替え、TIMER8 の設定で連続クロックを出力するようにしました。
こうすれば、初期化した後は、何もしなくても連続してクロックが出続けます。
もうひとつ、問題点として、CS43L22 を通すとレベルの大きい信号がクリップされることがあげられます。
STM32F4 には 3.3 V レギュレータ出力からショットキ・ダイオードを介して電源が供給されており、その電圧降下により、約 3 V の電源電圧で動作しています。
したがって、内蔵 12 ビット DAC 出力も約 3 Vp-p のレベルになりますが、CS43L22 は 2.5 V 電源で動作しているので、大振幅の信号に関しては、CS43L22 のアナログ入力回路でクリップが生じているものと思われます。