今回はSTM32のMCO(Master Clock Output)の機能を使ってPLLI2Sのクロックを出力してみる。
品質はどうなのかわからんけど主に外部オーディオコーディック用のMLCKとかに使えそうな予感
通常のMCO1に関しては以前やっている(STM32F3での実施)ので基礎に関しては以下の記事を参照
gsmcustomeffects.hatenablog.com
今回はSTM32F767を使うので上記の記事のレジスタ構成と多少異なる部分があるが基本は同じなのでリファレンスマニュアルを見るなりして対応してほしい
今回の試験環境
- STM32F767 Nucleo144 board (評価ボード)
- CubeMX Ver4.27(CubeF7 latest)(SDKというかHAL)
- Atollic TrueStudio(IDE)
- RIGOL DS1054(オシロスコープ)
というわけでやって行こう!
CubeMXでの作業
まずピンコンフィグ画面でMasterClockOutput2のチェックを入れる
次にクロック画面でPLLの設定とMCO2の設定をしてあげて24MHzあたりを出せるように設定してください
それが終わったらCubeから出力してください
AtollicTrueStudioでの作業
次にIDEでの作業ですがMCOの場合は何もいじらなくても初期コードだけで済みます。
まあそうはそうなんですがHALにバグ?みたいのがありましてクロックコンフィグ内の低レベルAPIを修正してあげないといけません
内容としてはSystemClock_Configの内部で呼ばれているHAL_RCCEx_PeriphCLKConfig内のI2SPLL部分です。
以上を修正したらビルドして書き込みしてください
所感
MCO2からクロックを出力できた。
主な用途としてはエフェクターなどに使われているAK4558(32bit 192khz audio codec)のMLCKとかですかね。
24MHz与えると様々なサンプリングに対応できるのでこういったクロック出力機能は便利なんじゃないでしょうか?
bugfixへのアドバイス
最後に僕がどのような手順でデバッグしているかの話です。
まずはレジスタの値を確認する方法です。
SFRに関してはこの画面からレジスタに書き込んだりもできるので便利です。
最初行き詰ったらここを見てきちんとレジスタにされるべき設定が入っているか確認してください
もちろんこのSFRのjson定義にもバグがあるかもなので過信しすぎるのもよくないですけどね・・・・・
次に変数だったり構造体のトレースができる式タブですね
一般にはexpressionという名前で呼ばれています。
最近のマイコンではSDKで構造体を多用するのが増えていてそのメンバに対してif分岐するのが多いのでなんでこのループに入らないんだろう?とかbitシフト結果がほんとに正しいの?とかそういった疑問を実際に見れるのでHALの動作のステップ確認では便利です。
以上の二つを駆使していろいろ見てみると動作の勉強にもなりますし自身でfixできる癖がつきますので時間を溶かさないようにこういった機能を駆使してみてください。