时钟是什么:就是机器的心脏,在心脏的规范跳动下有序的完成各项工作
了解时钟第一步是先清楚时钟是由什么发出的:主要是时钟源晶振和振荡器
例举一下stm32的时钟
- 1.HSI 振荡器时钟
- 2.HSE 振荡器时钟
- 3.32 kHz 低速内部 RC (LSI RC):该 RC 用于驱动独立看门狗,也可选择提供给 RTC 用 于停机/待机模式下的自动唤醒。
- 4.32.768 kHz 低速外部晶振(LSE 晶振):用于驱动 RTC 时钟 (RTCCLK)
- 5.主 PLL (PLL) 时钟:一般是HSR或者HSE等通过倍频的方式来得到PLL时钟源
倍频和分频:倍频是将频率放大 分频是将频率缩小
晶振和振荡器的区别:晶振只是一个元件,而振荡器一由几个元件组成的电路。
一般使用外部时钟源作为系统时钟:因为外部时钟更加精准
看门狗为什么使用自己独立的低俗时钟:首先看门狗不需要很精准的时钟,然后如果主时钟失效系统,看门狗仍能在低俗时钟下正常工作
HCLK(AHB)总线 再通过分频得到 PCLK1(AHB1) PCLK2(AHB2) :大部分外设都是通过PCLK1和PCLK2提供时钟频率
代码:
void RCC_Init(uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)
{
RCC_DeInit(); //将外设 RCC 寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON); //设置外部高速晶振( HSE)
//该函数将等待直到 HSE 就绪,或者在超时的情况下退出
if(SUCCESS == RCC_WaitForHSEStartUp())
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟 不分频
RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速APB1时钟PCLK2 HCLK/2
RCC_PCLK2Config(RCC_HCLK_Div4); //设置低速APB2时钟PCLK1 HCLK/4
RCC_PLLConfig(RCC_PLLSource_HSE, PLLM, PLLN, PLLP ,PLLQ);//设置 PLL 时钟源及倍频系数 公式SYSCLK = ((RCC_PLLSource/PLLM)*PLLN) / PLLP
RCC_PLLCmd(ENABLE); //打开PLL
while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY));//等待PLL工作
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置PLL为系统时钟
while(RCC_GetSYSCLKSource()!=0x08); //判断PLL是否为系统时钟
}
return;
}
时钟图: