目录
1: STM32有5个时钟源:HSI,HSE,LSI,LSE,PLL
3:STM32F4时钟信号输出MC01(PA8)和MCO2(PC9)
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 handler
Reset_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 */