MCO機能
マイクロコントローラクロック出力(MCO)機能では、外部 MCO ピンにクロックを出力することができます。
5 つのクロック信号のうちの 1 つを MCO クロックとして選択できる。
実際の使用例ではNucleoなんかがそうですね、
STLINKのF103からボード上のMCUへクロックを供給してます。
MCOへ供給可能なクロックは以下の通りだ
選択はクロック設定レジスタ(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を分周できる
レジスタの説明
主にRCC_CFGRで設定する
追記
ここでMCOFビットはSTM32F303xB/C and STM32F358xC onlyとあるので30:28がMCOPREとなる。
英語版最新データシートより
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を有効する
クロック設定画面で好きなように設定してみる
今回はSYSCLKを選んで8分周するので8MHzが出てくるはずである
あとは出力してビルドするだけ
今回はNucleoF303kを使っているのでD9ピンからクロックが出ているはずだ。
8分周したMCOから8Mhzが出てきていることから64MHzがSYSCLKということになる
SystemCoreClockは64MHzなのできちんとこの周波数で動いていることがわかる
おまけで500kHzも出してみた
128分周して500kHz出せたぞー
— がれすた (@GarageStyleMsc) 2017年3月31日
なのでメインクロックは64MHz
ちゃんとSystemCoreClockの値があってるかも確認できたし満足 pic.twitter.com/yxatNHt1jo
まとめ
- MCOを使ってクロック出力ができた
- MCO機能で他のマイコンにクロック供給できるので今度やってみたいと思った