Nucleoの水晶振動子
Nucleo基板(F411RE)には、水晶振動子が二つあり、そのうち32.768KHz(X2)は実装されている。mbedのTickerで時間を刻むと、少し短めになった。1msに対して985usあたり、1~2%の誤差であり、これはセンシング精度としては大きい。会社業務で使用していたため、問題があった。回路図を見ると、X3は8MHzであるが実装されてない。NucleoのDocumenntには、実装すれば自動で切り替わると書いてある。Target基板を作った際、実装できるようにしてあったので、X3を実装したもののTickerの時間精度が上がらず(変わらず)外部クロックが機能していないようだった。
オシロスコープで発振子の振動波形を見たところ、まったく振動していない。しかも、X2もまったく振動していなかった。mbedの中で外部クロックが有効とされずに内部クロックで動いているように思えた。
target.json の中の"STM32F4"に、"clock-source"の記述でHSIを使うようになっていたので、記述をまねして、下記のようにプロジェクトの中のmbed_app.jsonに記述する。
{
"config": {
"usb_speed": {
"help": "USE_USB_OTG_FS or USE_USB_OTG_HS or USE_USB_HS_IN_FS",
"value": "USE_USB_OTG_FS"
},
"clock_source": {
"help": "Mask value : USE_PLL_HSE_EXTC | USE_PLL_HSE_XTAL (need HW patch) | USE_PLL_HSI",
"value": "USE_PLL_HSE_XTAL",
"macro_name": "CLOCK_SOURCE"
}
},
"target_overrides": {
"*": {
"target.components_add": ["SD"],
"target.device_has_add": ["USBDEVICE"]
}
}
}
これで、ビルドしたところ、Tickerはほぼ正確に1msになっていることを確認できた。オシロでの波形は、少し励振レベルが低い気がするが、まぁヨシ!としたい。
また、Target.jsonの中には、"STM32"に対して、X2も内部クロックになっているようであった。律儀に全部実装していたが、意味なかったといえる。
target.jsonの場所
https://github.com/ARMmbed/mbed-os/blob/master/targets/targets.json
今度は、水晶が実装されてないと動かない
上の記述だと、外部クロック専用になってしまうようで、水晶を実装していない基板に書き込むと、タイマがきちんと動かない(むちゃくちゃ?)。そこで、試しに下記のようにしてみたら、うまくいった。
"clock_source": {
"help": "Mask value : USE_PLL_HSE_EXTC | USE_PLL_HSE_XTAL (need HW patch) | USE_PLL_HSI",
"value": "USE_PLL_HSE_XTAL|USE_PLL_HSI",
"macro_name": "CLOCK_SOURCE"
}
外部水晶があったら、外部で、なかったら内部になる、という意味で書いたが、はたして、この方法はあっているのだろうか・・・
mbed-os5.15.7で動作した。
内蔵RTCと32K水晶
内蔵RTCに電源をつないでも、外部水晶(32.768K)が有効にならない。
{
"target_overrides": {
"*": {
"target.lse_available": 1
}
}
}
Nucleoでの記号
- LSE=Low Speed External
- LSI=Low Speed Internal
- HSE=High Speed External
- HSI=High Speed Internal
LSEはRTCのためだけに使用され、VBAT端子もRTCのためだけに供給される端子。したがって、VDDとのORをとることなく、DiodeなしでCR2032を直結できる。
コメントを追加