がれすたさんのDIY日記

電子回路、Python、組み込みシステム開発、自作エフェクターを語るblog

STM32のMCO2からPLLI2Sクロックを出力してみる

今回は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での作業

f:id:gsmcustomeffects:20181027232016p:plain

まずピンコンフィグ画面でMasterClockOutput2のチェックを入れる

f:id:gsmcustomeffects:20181027232647p:plain

次にクロック画面でPLLの設定とMCO2の設定をしてあげて24MHzあたりを出せるように設定してください

それが終わったらCubeから出力してください

AtollicTrueStudioでの作業

次にIDEでの作業ですがMCOの場合は何もいじらなくても初期コードだけで済みます。

まあそうはそうなんですがHALにバグ?みたいのがありましてクロックコンフィグ内の低レベルAPIを修正してあげないといけません

内容としてはSystemClock_Configの内部で呼ばれているHAL_RCCEx_PeriphCLKConfig内のI2SPLL部分です。
f:id:gsmcustomeffects:20181027233547p:plain

以上を修正したらビルドして書き込みしてください

見てみる

nucleoを使っているならここにオシロでもあててみてください

f:id:gsmcustomeffects:20181027234443p:plain

上手くできていればこのように波形が出ると思います
f:id:gsmcustomeffects:20181027234346p:plain

所感

MCO2からクロックを出力できた。

主な用途としてはエフェクターなどに使われているAK4558(32bit 192khz audio codec)のMLCKとかですかね。
f:id:gsmcustomeffects:20181027235224p:plain

24MHz与えると様々なサンプリングに対応できるのでこういったクロック出力機能は便利なんじゃないでしょうか?

bugfixへのアドバイス

最後に僕がどのような手順でデバッグしているかの話です。

まずはレジスタの値を確認する方法です。
f:id:gsmcustomeffects:20181027234233p:plain
SFRに関してはこの画面からレジスタに書き込んだりもできるので便利です。

最初行き詰ったらここを見てきちんとレジスタにされるべき設定が入っているか確認してください
もちろんこのSFRのjson定義にもバグがあるかもなので過信しすぎるのもよくないですけどね・・・・・

次に変数だったり構造体のトレースができる式タブですね
一般にはexpressionという名前で呼ばれています。

f:id:gsmcustomeffects:20181027234921p:plain

最近のマイコンではSDKで構造体を多用するのが増えていてそのメンバに対してif分岐するのが多いのでなんでこのループに入らないんだろう?とかbitシフト結果がほんとに正しいの?とかそういった疑問を実際に見れるのでHALの動作のステップ確認では便利です。

以上の二つを駆使していろいろ見てみると動作の勉強にもなりますし自身でfixできる癖がつきますので時間を溶かさないようにこういった機能を駆使してみてください。