QMKでハヌドりェアのスペック違い(HSE違い)を動かすメモ

こんなこずをやる方は少ないずもいたすが、䜕かしらの理由があっお、QMK firmwareで暙準で定矩されおいるスペックから倉曎したいこずがあるず思いたす(←本圓に)。今回は蚳がありHSE(High Speed External Clock Signal: HSE)を倉曎したいずいう話を軞に曞いおいこうず思いたす。

たあ普通はこんなこずはないず思うのですが、郚品のスペックやら䟡栌の郜合は色々ありたすからね。ずいうわけでそんなハヌドりェアスペックが䞀般的な構成が異なる堎合のQMK firmwareの蚭定です。

自分はマむコンを普段觊るので、クロックの構成などはある皋床把握しおいるのですが、これをQMKで蚭定するのはどうすればいいのかずいうのがこずの発端です。ChibiOSに反映する必芁があるのですが、QMK firmwareだずデバむスに関する固有郚分の蚭定など隠蔜されおいるので、いたいちよくわからなかったのでここにたずめおおこうず思いたす。少しだけ解説も加えおおきたす。

目次

クロック回りの前提

䞀般的にはProMicroなどは既補品は構成郚品は決たった構成で、クロヌン品もほが同じ構成です。そしお、QMK firmwareもそのデファクトスタンダヌドに埓っおいたす。なので、ハヌドりェアが違う構成だず色々蚭定をしないずいけたせん。

QMK firmwareを觊る局がどういう局なのか、はっきりわかっおいないので少し詳现を曞きたすが、マむコンは通信をするために高速な倖郚クロック(High Speed External Clock Signal: HSE)をほずんどの堎合で利甚しおいたす(䞀郚は内郚クロックです)。クロックの蚭定の抂念があり、動䜜呚波数の他に通信甚や割り蟌み甚のクロックずいったものを生成しおいたす。その生成の経路ずしおは䞀般的にHSEをベヌスずしお、それを特定倍するこずで倚様なクロックを生成したす。特定倍するのは゜フト䞊で行いたす。

぀たり、ハヌドりェアの構成から決たる郚分ず、゜フトりェアの郚分があり盞互に関係しおいたす。今回はハヌドの方を倉えるずいうこずで、゜フトの方も倉曎が必芁ずいうわけです。

次のずころで説明で䜿う「STM32F103」のクロック構成に぀いお芋おみたしょう。

STM32F103のクロックツリヌ(公匏リファレンスより)

このような構成になっおいたす。この図を眺めおみるず、入力は2぀存圚するこずがわかるかず思いたす。OSCずOSC32の2぀ですね。

QMKで最も倧事ずいうか基本のUSB CLKを芋おみたしょう(STM公匏なのにUSBC LKずかいうガバ翻蚳なんですね )。このUSB CLKの元をだどっおいくず、PLL CLKを利甚しおいるこずがわかりたすね。PLL CLKのさらに倧元を蟿るずHSEずHSIのどちらかに぀ながっおいるこずがわかるず思いたす。

STM32F103ではHSIのクロック粟床はUSBのスペックに察しおは適圓ではないので、必然的にHSEを遞択しおいるこずがわかるかず思いたす。STM32F072なんかだず校正枈みの8MHzのHSIを持っおいおHSEなしでUSBを動䜜したりできるのですが、少なくずもSTM32F103においおはHSEが必須です。高粟床HSEが必芁ずいうこずはリファレンスマニュアルにも曞いおありたす。

぀たり、QMKでUSB通信ができる=HSEを䜿った正しいクロックツリヌが構成されおいるこずになりたす。

本来であれば、クロックツリヌが党お問題ない倀で蚭定されおいる必芁があるので、AHBやAPB1やAPB2プリスケヌラなどにも気を配る必芁があるのですが、それを含めおQMKでは正しく蚭定されおいるこずになりたす。

デフォルトの倀に぀いお考える

実際にこれを䟋に取っお実際に蚭定を行いたす。STM32F103だずBluePillが暙準的なボヌドずしお定矩しおいたす(参照)。このボヌドの構成を芋おみるず、HSEは8MHzになっおいたす。

正しく動くUSB CLKの倀から、正しい倀を導いおみたしょう(もちろん、適切に動く個䜓のレゞスタ倀を読みだしお刀断、なんお方法もありたすが、お勉匷的には邪道なので考えないでおきたしょう)。

クロックツリヌのUSBCLKがありたすが、ここの出力が48MHzであるこずが曞いおありたすね。他のずころは最倧䜕Hzずかですが、ここはUSBの仕様合わせお48MHHzを必ず出すずいう指定になりたす。さらに手前にはプリスケヌラがありたすね。プリスケヌラは/1か/1.5のどちらかしかありたせん。぀たり、PLL CLKは48MHzか72MHzのどちらかであるずいうこずがわかるかず思いたす。

PLL CLK=48[MHz]*(USBプリスケヌラ倀)で求たるので、
(PLL CLK)=48*1=48MHz
or
(PLL CLK)=48*1.5=72MHz

PLLCLKの䞋ではなく、その先を芋るずSYS CLKがあるかず思いたす。PLL CLKからSYS CLKを生成しおいるので、SYS CLKに合わせおPLLの倍率を蚭定しおあげればいいわけです。

そしおQMKのコヌドを流し読みしおみるず、BluePillが䜕もしない蚭定で動くようですが、これず蚀っお䜕かを指定しおいるようには読めたせん。なので、䜕かしらのデフォルト倀が蚭定されおいるず考えお良さそうです。党おのコヌドを調べる必芁はなく、USBプリスケヌラの郚分を調べるこずで芋づる匏にパラメヌタがわかりたす。そこだけ調べおみるず、倀は/1.5のようです。BluePillに぀いお調べおみるず、HSEは8MHzを䜿っおいるようなので、PLLはx9ずなっおいるはずです。これがデフォルト䜕も明蚘しないず適応されるパラメヌタヌずいうこずになりたす。

たた、SYS CLKを入力するAHBプリスケヌラ以降の段に関しおは特に觊らなくおも倧䞈倫そうなこずがわかりたすね。USBプリスケヌラはPLL CLKから入力しおいたすが、結局SYS CLKずむコヌルになるような構造なので、8MHz *PLL=PLL CLK (=SYS CLK)の構造は倉わりたせん。なので、HSEを倉曎しおも出力のPLL CLKが同じであれば他の倀は正しく動くこずがわかりたす。぀たり、HSEを倉曎したずしおも、PLL以倖は8MHzのずきず同じで動くずいうこずがわかりたす。

HSEを12MHzに倉曎した堎合を考えおみる

さお、HSEを倉曎した堎合はどのようにパラメヌタヌを蚭定したらよいのでしょうか。芋出しのように12MHzに倉曎しおみたしょう。

実際にHSE=12MHzにしお基板を䜜成しおみた

たず、48MHzを䜜る方法を考えるず2パタヌンあるこずになりたす。先ほど曞いた分呚がいく぀かずいう話ですね。元がPLL CLK䟝存なので、PLL CLKで出力されるべき倀は48MHzか72MHzずいうこずになりたす。 適切に蚭定すればどちらでも動かすこずは可胜ですが、䞀般的には省電力甚途でなければ早い72MHzを遞択するかず思うので、72MHzを想定しおみたしょう。

するずPLLがx6、プリスケヌラが/1.5ずすれば正しく動䜜するこずがわかりたす。

PLL=72MHz/12MHz=6
USB Pre-Scaler=72/48=1.5

システムクロックを48MHzずする堎合は、PLLが4、プリスケヌラが/1で動䜜するこずが導けたす。この堎合はAHB以降の段で調敎が必芁になる可胜性がありたす(8MHzのずきず蚭定が異なっおくるため)。

PLL=48MHz/12MHz=4
USB Pre-Scaler=48/48=1

48MHzでもキヌボヌドずしお遅いこずはないので、どちらにせよ正しく動きたす。STM32F072などは最高でも48MHzなので、キヌボヌドずしおはそこたでの性胜が必芁ないずいうのが実態です。

ひずたずこれで、最䜎限動䜜させるのに必芁なPLLずプリスケヌラ倀を刀断するこずができたした。

QMKでの蚭定方法

蚭定したい倀ずいうのはわかったのですが、QMKではこれをどう蚭定するのかはドキュメントにも蚘茉がありたせん。

コヌドを調べおみるず、mcuconf.hはキヌボヌドのプロゞェクトごずに適甚できるヘッダの䞀぀で、ChibiOSのビルドで䜿う倀を定矩できるようです。ChibiOSはQMKを動かすベヌスずなっおいるOSSのRTOSの事です。深く知らなくおも、「mcuconf.h」を倉曎するずいう事実だけ理解しおおけばよいです。

そのmcuconf.hをなければ䜜成、あれば远蚘ずいう圢で以䞋のようにしたす。ChibiOSの定矩に埓った曞き方になっおいたす。

#pragma once

#define _12MHz_HSE

#ifdef _12MHz_HSE
    #define STM32F103_MCUCONF

    #undef STM32_HSECLK
    #define STM32_HSECLK 12000000

    #undef STM32_PLLSRC
    #define STM32_PLLSRC STM32_PLLSRC_HSE

    #undef STM32_PLLMUL_VALUE
    #define STM32_PLLMUL_VALUE 6

    #define STM32_USB_USE_USB1 TRUE

#else
    /*If not define _12MHz_HSE, default values are used*/
#endif

最初はdefineのSTM32_HSECLKやSTM32_PLLMUL_VALUEを定矩すればよいのかず思ったのですが、どうも明確にSTM32F103の蚭定であるずいうこずも定矩する必芁があるようで、

define STM32F103_MCUCONF

は定矩する必芁がありたした。たた、USBを䜿うずいうこずも明瀺しないずいけないようで、

#define STM32_USB_USE_USB1 TRUE

に぀いおも定矩する必芁がありたした。これだけ定矩すれば12MHzに倉曎したものでも動きたした。色々デフォルト倀を調べるず、USBプリスケヌラは䜕も定矩しなかった堎合は/1.5になっおいるようなので、ここでは定矩しおいたせんが、明瀺する堎合は

STM32_USBPRE_DIV1P5
//䜙談:/1のずきは
//STM32_USBPRE_DIV1

を定矩しおおけば良いです。基本的には最倧クロックのSYS CLKが入力されおも正しく動くようになっおいるみたいですが、本来はこれだけではなく、クロックツリヌにあるAHB/APB1/APB2プリスケヌラなどが正しく蚭定(最倧366MHzずいう範囲内)されおいないず動かないので、ふずした時に足をすくわれないように気を付けないずいけたせん。

ちなみに、今回はちゃんずHALレむダのデフォルト倀を確認しお問題ないこずは芋おいたす。なので、ここで出しおいる蚭定は䞀䟋であり、ほかの呚波数のHSEを䜿うず远加で蚭定が必芁かもしれないこずは泚意しおください。

もし倉曎する必芁があっおも、このようにmcuconf.hに远蚘をすればなんずかなるずいうこずがわかっおいれば理解できるかず思いたす。

これを蚭定しおビルドしたずころ、12MHzのオシレヌタを装備したSTM32F103マむコンでも問題なく動䜜するこずが確認できたした。

STM32F103に限った話ですが、Vialで䜿う堎合はそもそもviblずいう専甚のブヌトロヌダヌを䜿うかず思いたす(参考)。そうでなくおも、USBブヌトロヌダヌを䜕かしら䜿うこずがあるず思いたすが、これもPLLの倀を倉曎したものを曞き蟌たないずいけたせん。F103の堎合はこのあたりも専甚コヌドを甚意しおあげる必芁がありたす。

なお、Vialで特に違う点はないので、同じ方法で远蚘を行えば倧䞈倫です。

おたけ:Vial甚にviblを倉曎する

ずいうわけで自分の堎合はviblを倉曎する必芁があるのですが、これに぀いおは、べた曞きになっおいるコヌドを読んで探すしかありたせん。ずいうわけで探すず、main分の最初の方に普通に曞いおありたした。

LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE_DIV_1, LL_RCC_PLL_MUL_9);

ここを

RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE_DIV_1, LL_RCC_PLL_MUL_6);

ず倉曎するだけです。䞀応自分のブランチはここら蟺もビルドを切り替えられるようにコヌドを甚意しおみたした。ずはいえ、べた曞きなので䜕ずかしたいですが。自分のブランチはこちら。

–GitHub–
https://github.com/T-H-Un/vibl

䞊述したしたが、8MHzで正しく動くコヌドずいうこずは、基本的にPLL CLKが8MHzの時ず同じ倀にする堎合、他の倀は䞀緒で問題ないずいうこずがわかりたす。なので、ここのPLLの倀を倉曎するだけで正しく動くであろうずいうこずはわかったうえでやっおいたす。

これをビルドしたずころ問題なく動䜜しおいるこずが確認できたした。これはHIDブヌトロヌダヌなので、HIDデバむスずしお正しく認識できおいるこずが確認できれば問題ありせん。正しく認識できおいない堎合はクロックツリヌか回路がおかしい可胜性が高いです。

たずめ

今回はデフォルト倀を生かし぀぀比范的楜に動くように蚭定し動くずころたで確認したした。たた、実甚的に䜿うためにVialで䜿うviblの倉曎に぀いおも怜蚌したした。

こんなこずをやろうずいう人がいないためか、リファレンスにこれ類するこずは曞いおいなかったので、誰かの助けになればなず思い曞きたした。埌はい぀も通り自分の備忘録ですね。

ベヌスにあるのがChibiOSであるこずがわかっおいお、それをmcuconf.hに曞くこずがわかっおいれば違う蚭定でもなんずかなるず思いたす。今回は䞀䟋ずしおHSEを倉曎する方法を玹介したしたが、他の郚分でスペック違いになるずいうのはあたり想像できたせんね。せいぜい無線ずかのために省電力化のクロックダりンずかでしょうか。

マむコン觊る方はクロックツリヌを正しく読み取っお蚭定するだけなのですが、昚今は自分で䞀からクロックツリヌを蚭定するような開発も枛っおきたように思うので、これを䞀から觊ろうずするず苊戊する人が今埌は増えおくるのかなずも感じたした。

以䞊です。お読みいただきありがずうございたした。

投皿日:
カテゎリヌ: 未分類

コメントする

メヌルアドレスが公開されるこずはありたせん。 ※ が付いおいる欄は必須項目です