LSI Jiu-Jitsu

電子工作とブラジリアン柔術

STM32で遊ぶ (5) - クロック構成

STM32F446REのクロック構成が良く分からなかったので、データシート(RM0390 Reference manual)のFigure.14にレジスタを当てはめてみました。

RM0390 Reference manualはこちらです。
https://www.stmcu.jp/design/document/reference_manual/51547/

・初期値

f:id:mohran:20200308115530j:plain
図中の各色のフィールドは下記のレジスタとなります。
下記の括弧内はRCC_BASE(0x40023800)からのオフセットアドレスです。
RCC_CR (0x00)
RCC_PLLCFGR (0x04)
RCC_CFGR (0x08)
RCC_BDCR (0x70)
RCC_CSR (0x74)
RCC_PLLI2SCFGR (0x84)
RCC_PLLSAICFGR (0x88)
RCC_DCKCFGR (0x8c)
RCC_DCKCFGR2 (0x94)

ちなみに、RCC_PLLSAICFGRの初期値はデータシート上は 0x2400_3000 と記載されていますが、実際は 0x0400_3010 でした。
f:id:mohran:20200308010512j:plain

・クロックイネーブル

f:id:mohran:20200308115555j:plain

・スタートアップ

f:id:mohran:20200308115605j:plain
main関数が呼ばれる前にbootコード(startup/startup_stm32.s)から src/system_stm32f4xx.c 内の関数

void SystemInit(void)

がコールされ、内部でRCCレジスタの設定を行っています。
ここでメインクロックをHSI(16MHz)からHSE(8MHz)に変えて、PLLを通して180MHzのCPUクロックを生成しているようです。
図中のアスタリスクは初期値からの変更箇所です。

間違えていたらすみません・・。
環境は SW4STM32 + SPL V1.8.0 です。

[参考記事]