时钟配置在system_stm32f4xx.c
和stm32f4xx.h
中,如PLL_M
、PLL_N
、PLL_P
、PLL_Q
、HSE_VALUE
。
时钟配置函数:SystemInit()
VCO
输入时钟 分频因子,取值2~63VCO
输出时钟 倍频因子,取值192~432SYSCLK
时钟 分频因子,取值2,4,6,8 。OTG FS,SDIO,RNG
时钟 分频因子,取值4~15PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
SB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ
SYSCLK = PLL_VCO / PLL_P
HSE
,HSE
经过PLL
倍频之后作为系统时钟。CSS
功能的话,那么可以当HSE
故障时,在CSS
中断里面采取补救措施,使用HSI
,重新设置系统频率为180M
,让系统恢复正常使用。OSC_IN
引脚进入,OSC_OUT
引脚悬空;当选用无源晶振时,时钟从OSC_IN
和OSC_OUT
进入,并且要配谐振电容。HSE
故障时,高速的内部时钟信号HSI
会作为备用的系统时钟,直到HSE
恢复正常,HSI=16M
。2~63
)分频后,成为VCO
的时钟输入,VCO
的时钟必须在1~2M 之间,我们选择HSE=25M
作为PLL 的时钟输入,M
设置为25,那么VCO
输入时钟就等于1M。PLLCLK_OUTMAX = VCOCLK_OUTMAX / P_MIN = 432/2=216M
,即F429 最高可超频到216M。VCOCLK_IN = PLLCLK_IN / M = HSE / 25 = 1M
VCOCLK_OUT = VCOCLK_IN * N = 1M * 360 = 360M
PLLCLK_OUT=VCOCLK_OUT/P=360/2=180M
USBCLK = VCOCLK_OUT/Q=360/7=51.7
。暂时这样配置,到真正使用USB 的时候会重新配置。系统时钟来源可以是:HSI
、PLLCLK
、HSE
HSE,具体的由时钟配置寄存器RCC_CFGR
的SW
位配置。
SYSCLK
经过AHB
预分频器分频之后得到时钟叫APB
总线时钟,即HCLK
。HCLK
分频得到。APB2
总线时钟PCLK2
由HCLK
经过高速APB2
预分频器得到。HCLK2
属于高速的总线时钟,片上高速的外设就挂载到这条总线上,比如全部的GPIO
、USART1
、SPI1
等。APB1
总线时钟PCLK1
由HCLK
经过低速APB1
预分频器得到。HCLK1
属于低速的总线时钟,最高为45M
,片上低速的外设就挂载到这条总线上,比如USART2/3/4/5
、SPI2/3
,I2C1/2
等。RTCCLK
时钟源可以是 HSE 1 MHz
、 LSE
或者 LSI
时钟。LSE
给RTC
提供时钟,大小为32.768KHZ
。LSE
由外接的晶体谐振器产生,所配的谐振电容精度要求高,不然很容易不起震。由内部的低速时钟LSI
提供,大小为32KHZ
。
I2S
时钟可由外部的时钟引脚I2S_CKIN
输入,也可由专用的PLLI2SCLK
提供。
MAC
之外,还需要外接一个PHY
芯片。RMII
接口时,PHY
芯片只需输出一路时钟给MCU
即可。MII
接口,PHY
芯片则需要提供两路时钟给MCU
。USB
没有集成PHY
,必须外置 USB PHY
芯片。USB PHY
芯片时,PHY
芯片需要给MCU
提供一个时钟。MCO
是microcontroller clock output
的缩写,是微控制器时钟输出引脚,主要作用是可以对外提供时钟,相当于一个有源晶振。