STM32のMCO機能を使ってGPIOからクロックを出してみる

MCO機能

マイクロコントローラクロック出力(MCO)機能では、外部 MCO ピンにクロックを出力することができます。

5 つのクロック信号のうちの 1 つを MCO クロックとして選択できる。

実際の使用例ではNucleoなんかがそうですね、
STLINKのF103からボード上のMCUへクロックを供給してます。

MCOへ供給可能なクロックは以下の通りだ

  • LSI
  • LSE
  • SYSCLK
  • HSI
  • HSE
  • 2 分周された PLL クロック

選択はクロック設定レジスタRCC_CFGR)の MCO[2:0] ビットによって制御できる。
STM32F303xD/E、STM32F303x6/8 および STM32F328x8、 では、このレジスタの追加ビット
PLLNODIV が、MCO への PLL クロック入力の分周バイパスを制御します。
MCO 周波数は、クロック設定レジスタRCC_CFGR)の MCOPRE[2..0] ビットで制御される設定可能な分周器によって低減できます。

とあるがこれをまとめると

  • RCC_CFGRのMCOビットでクロックの元を選べる
  • STM32F303xD/E、STM32F303x6/8 および STM32F328x8はプリスケーラを持っているので分周できる
  • PLLNODIVを設定することでPLLCLKを使う場合分周の有無を選べる
  • RCC_CFGRのMCOPREビットでMCOを分周できる

f:id:gsmcustomeffects:20170401174659p:plain

レジスタの説明

主にRCC_CFGRで設定する
f:id:gsmcustomeffects:20170401180911p:plain
追記
ここでMCOFビットはSTM32F303xB/C and STM32F358xC onlyとあるので30:28がMCOPREとなる。
英語版最新データシートより
f:id:gsmcustomeffects:20170401220727p:plain

PLLNODIV

bit 機能
0 MCOの前でPLLを2分周
1 MCOの前でPLLは分周されない

MCOPRE[2:0]

bit 機能
000 MCO を1分周
001 MCO を2分周
010 MCO を4分周
011 MCO を8分周
100 MCO を16分周
101 MCO を32分周
110 MCO を64分周
111 MCO を128分周

MCO[2:0]

bit 機能
000 出力無効、MCO にクロックなし
001 予約済み
010 LSI クロックの選択
011 LSE クロックの選択
100 システムクロック(SYSCLK)の選択
101 HSI クロックの選択
110 HSE クロックの選択
111 PLL クロックの選択(PLLNODIV ビットに応じて 1 または 2 で分周)

CubeMXでのやり方

RCC画面でMCOを有効する
f:id:gsmcustomeffects:20170401181248p:plain

クロック設定画面で好きなように設定してみる
今回はSYSCLKを選んで8分周するので8MHzが出てくるはずである

f:id:gsmcustomeffects:20170401181509p:plain

あとは出力してビルドするだけ
今回はNucleoF303kを使っているのでD9ピンからクロックが出ているはずだ。

f:id:gsmcustomeffects:20170401181823p:plain

8分周したMCOから8Mhzが出てきていることから64MHzがSYSCLKということになる
SystemCoreClockは64MHzなのできちんとこの周波数で動いていることがわかる

f:id:gsmcustomeffects:20170401182118p:plain

おまけで500kHzも出してみた



まとめ

  • MCOを使ってクロック出力ができた
  • MCO機能で他のマイコンにクロック供給できるので今度やってみたいと思った