STM32F4 时钟初始化配置

1.0   系统时钟的选择 及设置

2.0   SystemInit()  详解

3.0     

        3.1    外设使能函数及 时间源使能函数

        3.2    时钟源选择和分频因子配置函数。

 

 

STM32F4 时钟初始化配置_第1张图片

xN    倍频            /M    分频

外部晶振选择 8MHz。同时我们设置相应的分频器 M=8,倍频器倍频系数 N=336,分频器分频系数 P=2,那么主 PLL 生成的第一个输出高速时钟 PLLP 为:

    PLL=8MHz * N/ (M*P)=8MHz* 336 /(8*2) = 168MHz

HSE为PLL时钟源, 同时SYSCLK时钟源为PLL, 那么SYSCLK时钟为168MHz。

STM32F4 时钟系统初始化是在 system_stm32f4xx.c 中的 SystemInit()函数,对于系统时钟关键寄存器设置主要是在 SystemInit 函数中调用 SetSysClock()函数来设置的。SystemInit()在startup_stm32f40_41xxx.s调用

SystemInit()开始先进行浮点运算单元设置,

然后是复位 PLLCFGR,CFGR 寄存器,同时通过设置 CR 寄存器的 HSI 时钟使能位来打开 HSI 时钟。

默认情况下如果 CFGR 寄存器复位那么是选择 HSI 作为系统时钟,这点大家可以查看 RCC->CFGR 寄存器的位描述最低 2 位可以得知,当低两位配置为 00 的时候(复位之后) ,会选择 HSI 振荡器为系统时钟。也就是说,调用 SystemInit 函数之后,首先是选择 HSI 作为系统时钟。

SetSysClock()函数的大致流程:

使能外部时钟HSE------>配置AHB,APB1,APB2时钟分频因子--------->打开主PLL,设置主PLL作为系统时钟的时钟源

在设置主 PLL 时钟的时候,会要设置一系列的分频系数和倍频系数

参数。可以从 SetSysClock 函数中的这行代码看出:

RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

这些参数是通过宏定义标识符的值来设置的。默认的配置在System_stm32f4xx.c 文件开头的地方配置。对于开发板,设置参数值如下:

  #define PLL_M     8

  #define PLL_Q     7

  #define PLL_N     336

  #define PLL_P      2

所以我们的主 PLL 时钟为:

  PLL=8MHz * N/ (M*P)=8MHz* 336 /(8*2) = 168MHz

在开发过程中,可以通过调整这些值来设置我们的系统时钟。

 

这里还有个特别需要注意的地方,就是还要同步修改 stm32f4xx.h 中宏定义标识符HSE_VALUE 的值为我们的外部时钟:

#if !defined (HSE_VALUE)

#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */

#endif /* HSE_VALUE */

这里默认固件库配置的是 25000000,外部时钟为 8MHz,所以我们根据我们硬件情况修改为 8000000 即可。

第一类是时钟使能函数。时钟使能相关函数包括外设设置使能和时钟源使能两类。首先我们

来看看外设时钟使能相关的函数( 5 个外设时钟使能函数。):

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);

void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);

void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);

void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

 

还有是时钟使能函数是时钟源使能函数,前面我们已经讲解过 STM32F4 有 5 大类时钟源。这里列出来几种重要的时钟源使能函数:

void RCC_HSICmd(FunctionalState NewState);

void RCC_LSICmd(FunctionalState NewState);

void RCC_PLLCmd(FunctionalState NewState);

void RCC_PLLI2SCmd(FunctionalState NewState);

void RCC_PLLSAICmd(FunctionalState NewState);

void RCC_RTCCLKCmd(FunctionalState NewState);

这些函数是用来使能相应的时钟源。比如我们要使能 PLL 时钟,那么调用的函数为:

  void RCC_PLLCmd(FunctionalState NewState);

具体调用方法如下:

  RCC_PLLCmd(ENABLE);

我们要使能相应的时钟源,调用对应的函数即可

第二类时钟功能函数:时钟源选择和分频因子配置函数。

列举几种时钟源配置函数:

void RCC_LSEConfig(uint8_t RCC_LSE);

void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);

void RCC_HCLKConfig(uint32_t RCC_SYSCLK);

void RCC_PCLK1Config(uint32_t RCC_HCLK);

void RCC_PCLK2Config(uint32_t RCC_HCLK);

void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);

void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM,

uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ);

比如要设置系统时钟源为 HSI,那么我们可以调用系统时钟源配置函数:

  void RCC_HCLKConfig(uint32_t RCC_SYSCLK);

具体配置方法如下:

  RCC_HCLKConfig(RCC_SYSCLKSource_HSI);//配置时钟源为 HSI

设置 APB1 总线时钟为 HCLK 的 2 分频,也就是设置分频因子为 2 分频,使能 HSI,那么调用的函数为:

  void RCC_PCLK1Config(uint32_t RCC_HCLK);

具体配置方法如下:

  RCC_PCLK1Config(RCC_HCLK_Div2);

你可能感兴趣的:(stm32f407,硬件)