前回、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が供給できるようにすべきだろう。