ãããªããšãããæ¹ã¯å°ãªããšãããŸãããäœãããã®çç±ããã£ãŠãQMK firmwareã§æšæºã§å®çŸ©ãããŠããã¹ããã¯ãã倿ŽãããããšããããšæããŸã(âæ¬åœã«ïŒïŒïŒïŒ)ãä»åã¯èš³ãããHSE(High Speed External Clock Signal: HSE)ã倿Žããããšãã話ãè»žã«æžããŠããããšæããŸãã
ãŸãæ®éã¯ãããªããšã¯ãªããšæãã®ã§ãããéšåã®ã¹ããã¯ããäŸ¡æ Œã®éœåã¯è²ã ãããŸããããããšããããã§ãããªããŒããŠã§ã¢ã¹ããã¯ãäžè¬çãªæ§æãç°ãªãå Žåã®QMK firmwareã®èšå®ã§ãã
èªåã¯ãã€ã³ã³ãæ®æ®µè§Šãã®ã§ãã¯ããã¯ã®æ§æãªã©ã¯ããçšåºŠææ¡ããŠããã®ã§ããããããQMKã§èšå®ããã®ã¯ã©ãããã°ããã®ãïŒãšããã®ãããšã®çºç«¯ã§ããChibiOSã«åæ ããå¿ èŠãããã®ã§ãããQMK firmwareã ãšããã€ã¹ã«é¢ããåºæéšåã®èšå®ãªã©é èœãããŠããã®ã§ãããŸãã¡ããããããªãã£ãã®ã§ããã«ãŸãšããŠããããšæããŸããå°ãã ã解説ãå ããŠãããŸãã
ç®æ¬¡
- ã¯ããã¯åšãã®åæ
- ããã©ã«ãã®å€ã«ã€ããŠèãã
- HSEã12MHzã«å€æŽããå ŽåãèããŠã¿ã
- QMKã§ã®èšå®æ¹æ³
- ããŸã:Vialçšã«viblã倿Žãã
- ãŸãšã
ã¯ããã¯åãã®åæ
äžè¬çã«ã¯ProMicroãªã©ã¯æ¢è£œåã¯æ§æéšåã¯æ±ºãŸã£ãæ§æã§ãã¯ããŒã³åãã»ãŒåãæ§æã§ãããããŠãQMK firmwareããã®ããã¡ã¯ãã¹ã¿ã³ããŒãã«åŸã£ãŠããŸãããªã®ã§ãããŒããŠã§ã¢ãéãæ§æã ãšè²ã èšå®ãããªããšãããŸããã
QMK firmwareãè§Šãå±€ãã©ãããå±€ãªã®ããã¯ã£ããããã£ãŠããªãã®ã§å°ãè©³çŽ°ãæžããŸããããã€ã³ã³ã¯éä¿¡ãããããã«é«éãªå€éšã¯ããã¯(High Speed External Clock Signal: HSE)ãã»ãšãã©ã®å Žåã§å©çšããŠããŸã(äžéšã¯å éšã¯ããã¯ã§ã)ãã¯ããã¯ã®èšå®ã®æŠå¿µããããåäœåšæ³¢æ°ã®ä»ã«éä¿¡çšãå²ã蟌ã¿çšã®ã¯ããã¯ãšãã£ããã®ãçæããŠããŸãããã®çæã®çµè·¯ãšããŠã¯äžè¬çã«HSEãããŒã¹ãšããŠããããç¹å®åããããšã§å€æ§ãªã¯ããã¯ãçæããŸããç¹å®åããã®ã¯ãœããäžã§è¡ããŸãã
ã€ãŸããããŒããŠã§ã¢ã®æ§æããæ±ºãŸãéšåãšããœãããŠã§ã¢ã®éšåãããçžäºã«é¢ä¿ããŠããŸããä»åã¯ããŒãã®æ¹ãå€ãããšããããšã§ããœããã®æ¹ã倿Žãå¿ èŠãšããããã§ãã
次ã®ãšããã§èª¬æã§äœ¿ãã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=72MHzPLLCLKã®äžã§ã¯ãªãããã®å
ãèŠããš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ã«å€æŽããŠã¿ãŸãããã

ãŸãã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=148MHzã§ãããŒããŒããšããŠé ãããšã¯ãªãã®ã§ãã©ã¡ãã«ããæ£ããåããŸãã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ã倿Žããæ¹æ³ã玹ä»ããŸããããä»ã®éšåã§ã¹ããã¯éãã«ãªããšããã®ã¯ããŸãæ³åã§ããŸããããããããç¡ç·ãšãã®ããã«çé»ååã®ã¯ããã¯ããŠã³ãšãã§ããããã
ãã€ã³ã³è§Šãæ¹ã¯ã¯ããã¯ããªãŒãæ£ããèªã¿åã£ãŠèšå®ããã ããªã®ã§ãããæšä»ã¯èªåã§äžããã¯ããã¯ããªãŒãèšå®ãããããªéçºãæžã£ãŠããããã«æãã®ã§ããããäžããè§ŠãããšãããšèŠæŠãã人ãä»åŸã¯å¢ããŠããã®ããªãšãæããŸããã
以äžã§ãããèªã¿ããã ãããããšãããããŸããã