1:STM32有5个时钟源:HSI,HSE,LSI,LSE,PLL
HSI是高速内部时钟,RC振荡器、频率为16MHZ,精度不高。可以直接作为系统时钟或者用作PLL时钟输入
HSE是高速外部时钟,可接石英/陶瓷谐振器,或接外部时钟源,频率范围为4M~26M.
![]()
LSI是低速内部时钟,RC振荡器,频率为32KHZ,提供低功耗时钟。主要供独立看门狗和自动唤醒单元使用。
LSE是低速外部时钟,接频率为32.768KHZ的石英石钟。RTC
![]()
PLL为锁相环倍频输出。STM32F4有两个PLL。
主PLL,(PLL)由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟
第一个输出PLLP用于生成高速的系统时钟(最高168MHZ)
第二个输出PLLQ用于生成USB OTG FS的时钟(48MHZ),随机数发生器的时钟和SDIO时钟
专用PLL(PLLI2S)用于生成精确时钟,从而在I2S接口实现高品质音频性能。
![]()
2:系统时钟SYSCLK可来源于三个时钟源:
HSI振荡器时钟
HSE振荡器时钟
PLL时钟
![]()
3:STM32F4时钟信号输出MC01(PA8)和MCO2(PC9)
MCO1:可以配置预分频器(1~5)向MCO1引脚PA8输出4个不同的时钟源
HIS
LSE
HSE
PLL
![]()
MCO2:可以配置预分频器(1~5)向MCO2引脚PC9输出4个不同的时钟源:
HSE
PLL
SYSCLK
PLLI2S
![]()
注:MCO最大输出时钟不超过100MHZ,且在使用任何一个外设之前,必须首先使能其相应的时钟
4:系统时钟初始化函数 SystemInit();
在使用标准库函数的时候,在系统启动之后会自动调用:
![]()
; Reset handlerReset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP
若要使用外部时钟源HSE,要配置外部晶振频率在
![]()
#if !defined (HSE_VALUE) #define HSE_VALUE ((uint32_t)8000000) /*!《 Value of the External oscillator in Hz */
初始化之前首先通过宏定义定义下面变量来定义系统时钟频率:
![]()
/************************* PLL Parameters *************************************/#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */#define PLL_M 8#else /* STM32F411xE */#if defined (USE_HSE_BYPASS)#define PLL_M 8 #else /* STM32F411xE */ #define PLL_M 16#endif /* USE_HSE_BYPASS */#endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx */ /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */#define PLL_Q 7#if defined (STM32F40_41xxx)#define PLL_N 336/* SYSCLK = PLL_VCO / PLL_P */#define PLL_P 2#endif /* STM32F40_41xxx */
![]()
在MDK钟已经宏定义了STM32F40_41xxx
SO,整理一下,得到如下定义:
#define PLL_M 8#define PLL_Q 7#define PLL_N 336#define PLL_P 2/* PLL=8*N/(M*P)=8*336/(8*2)=168M */
![]()
执行上面的操作后:
SYSCLK(系统时钟) =168MHz
AHB总线时钟(HCLK=SYSCLK) =168MHz
APB1总线时钟(PCLK1=SYSCLK/4) =42MHz
APB2总线时钟(PCLK2=SYSCLK/2) =84MHz
PLL主时钟 =168MHz
可以通过变量SystemCoreClock获取系统变量。
#if defined (STM32F40_41xxx) uint32_t SystemCoreClock = 168000000;#endif /* STM32F40_41xxx */