STM32F4时钟系统

目录

1:   STM32有5个时钟源:HSI,HSE,LSI,LSE,PLL 

2:   系统时钟SYSCLK可来源于三个时钟源:

3:STM32F4时钟信号输出MC01(PA8)和MCO2(PC9)

4:系统时钟初始化函数 SystemInit();


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 */

猜你喜欢

转载自blog.csdn.net/qq_41867145/article/details/106135121