STM32
直播中

凤求凰

11年用户 425经验值
私信 关注
[问答]

STM32F4时钟信号输出

STM32有几个时钟源?
系统时钟SYSCLK来源于哪几个时钟源?
STM32F4时钟信号输出是什么?

回帖(1)

连涣艺

2021-9-26 14:39:50
  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 */
举报

更多回帖

发帖
×
20
完善资料,
赚取积分