前回、HALを使わずレジスタ直叩きでLチカさせてみた。次はシリアルをつなぎたいが、シリアルを動かすにはUARTのブロックにどのようなクロックが供給されているのかを理解しないといけない。でないとボーレートが計算できないから。前回のソースではクロックのレジスタは特に設定しておらず、Rustのスタートアップに任せた状態であった。この状態でどのようなクロックで動いているのかを確認(といいながら、、今日はSystemClockまで)
手順はgdbでNUCLEOボードにつないで、gdbのコンソールからレジスタにアクセスする。
クロックレジスタ群のベースが、0x4002 1000なので、そこから04番地ごとにレジスタが並んでいる。
(gdb) p/x *(0x40021000) $1 = 0x63 (gdb) p/x *(0x40021004) $2 = 0x1072007e (gdb) p/x *(0x40021008) $3 = 0x0 (gdb) p/x *(0x4002100c) $4 = 0x1000
上記レジスタ値となっておりこれを仕様書と見比べて解釈
クロック制御レジスタ(RCC_CR)..... 0x63
0000 0000 0000 0000
0000 0000 0110 0011
MSIRANGE[3:0]: 0110 // レンジ 6(約 4 MHz、リセット値)
MSIRDY :1 // MSI クロックレディフラグ
MSION :1 // MSI クロック有効化
内部クロックソース較正レジスタ(RCC_ICSCR) .... 0x1072007e
10 72 00 7e
0001 0000 0111 0010
0000 0000 0111 1110
クロック設定レジスタ(RCC_CFGR) .... 0x0
HPRE[3:0]:0 // AHB プリスケーラ 分周なし
SWS[1:0]:0 (MSI) // システムクロックスイッチステータス
// SYSCLKとしてMSIを選択システムクロックとしては4MHzが出ていると理解。ブロック図で言うと以下

APB1/APB2のPrescalerは1分周でそのまま素通し、UARTに供給されるクロックは、PCLK1(4MHz)、SYSCLK(4MHz)から選ぶことになる。選択の設定はしていないけど、この状態だと供給できるのは4MHz。ここから分周設定して、119200bps等を生成することになるだろう。だけど、、マイコンコアに供給するクロックが4MHzだと本来の性能の1/20なので、まずはPLLを正しく設定して、80MHzが供給できるようにすべきだろう。