chakokuのブログ(rev4)

テック・コミック・ごくまれにチャリ

STM32+Rustで初期状態のクロック設定を確認

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