void RCC_Configuration(void)
{
/* RCC system reset(for debug purpose) */ RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
systemclock共有三个来源,上面代码最后
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);应该是选择PLLCLK为时钟源void RCC_Configuration(void)
{
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON); ------------SHE外部晶振起震(8M)
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) --------------起震成功配置,flash取指令设置{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1); --------------AHB总线不分频
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1); --------------APB2总线不分频
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2); --------------APB1总线二分频
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); -----PLLCLK =
8MHz * 9 = 72 MHz
/* Enable PLL */
RCC_PLLCmd(ENABLE); --------------- PLL 使能
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); -------选择PLLCLK为系统时钟systemclk
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
从这里可以看到最后AHB时钟为72M(最大也是72M);APB2时钟72M(最大也是72M);APB1时钟36M(最大也是36M);
所以可以得到APB2预分频系数为1;APB1预分频系数为2。
接着往下走,可以看到定时器的时钟怎么来的了,好兴奋!
从上图可以看到通用定时器tim2~tim7使用的是低速的APB1提供的时钟,因为APB1的预分频系数为2,所以提供给通用定时器的时钟要乘以2,所以通用定时器的时钟源频率为
36M * 2=72M。
高级定时器tim1和tim8使用高速APB2总线提供时钟,因为APB2的预分频为1,所以提供给高级定时器的时钟不变,所以高级定时器的时钟源频率为72M。
同理也可以分析出ADC的时钟。
这个是2.0固件库里面的RCC_Configuration函数调用后系统的时钟情况,要是想使用低速的时钟树,可以修改这个函数中的相关参数,但是在3.0固件库调用的是SystemInit函数,可以更加轻松的配置系统的时钟树了。