初期化
STM32ではじめるARM/Cortex-M3組み込み開発の環境を使うと BoardInit 関数を呼び出すだけです。
この関数はlib\Platform\boardinit.cにあります。
この関数は SystemInit 関数を呼び出します。
SystemInit関数はlib\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.cにあります。 system_stm32f10x.cはテンプレートファイルであり、クロックや外部バスに関する設定を行い、システムを初期化する関数を記述するためのファイルとのことです。
SetSysClockTo72を使ってシステムクロック(SYSCLK)を72MHzにすると、AHB(システムバス)クロックが72MHz、APB2(ペリフェラルバス)が72MHz、APB1(ペリフェラルバス)が32MHzとなります。
このファイルには
4. The default value of HSE crystal is set to 8 MHz (or 25 MHz, depedning on the product used), refer to "HSE_VALUE" define in "stm32f10x.h" file. When HSE is used as system clock source, directly or through PLL, and you are using different crystal you have to adapt the HSE value to your own configuration.
とある様にHSE_VALUE(外部接続クロック)の値は8MHzが想定されています。 本来はlib/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.hで実際に接続されている周波数に変更しますが、STM32ではじめるARM/Cortex-M3組み込み開発の環境では簡単に切り替えるため12MHzの水晶が載っている場合は、Use_12MHz_Xtal関数で再度設定してます。SystemInit関数ではSetSysClockで逓倍率に応じたSetSysClockTo72等の関数が呼び出され、バスやペリフェラルの周波数も設定されますが、12MHzの場合は、SetSysClockTo72の代わりにSetSysClockTo72_12MHzXtalが呼び出されます。12MHzかどうかの指定は lib\Platform\××.h #define XTAL_12MHZの定義有無で切り替えられます。他にmakfileで、水晶発振子の周波数と、SYSCLKの周波数の設定が行われています。
XTAL_FREQ = ((uint32_t)12000000) SYSCLK_FREQ_SELECT = SYSCLK_FREQ_72MH
SYSCLK_FREQ_72MHz とセットされているのでSYSCLKは72MHzになります。
この後、NVIC_SetVectorTable関数で割り込みベクタの設定をします。
最後にRemap_JTAG関数でDFU機能のあるボード用にJTAGポートのRemapを行っています。
リセット後、又はSTOPモードからの復帰時は、システムクロックがHSIクロックになっていますので、HSEクロックに切り替える操作が必要です。