1 时钟源
1)石英晶振:稳定、体积大。
2)RC振荡电路:成本低、频率低、温漂大、体积小。
名称 | 简写 | 晶振 | 作用 |
---|---|---|---|
外部高速振荡器 | HSE | 4~16MHZ | Sysclk/RTC |
内部高速振荡器 | HSI | 8MHZ | Sysclk |
外部低速振荡器 | LSE | 32.768KHZ | RTC |
内部低速振荡器 | LSI | 40KHZ | RTC/IWDG |
2 时钟树
- HSE不分频->锁相环9倍频->系统时钟源
- 系统时钟源->9分频->SysTick
- 系统时钟->不分频->HCK、APB2
- 系统时钟->2分频->APB1
3 主要寄存器
1)时钟控制寄存器 CR:主要是时钟位和就绪位。
2)时钟配置寄存器 CRGR:主要是分频比、倍频因子、MCO的配置(输出主时钟)。
3)时钟中断寄存器 CIR:主要是中断标志位和使能位。
4 系统时钟配置流程
1)开启HSE、HSI,并等待时钟就绪。
2)打开flash的预取指缓冲区设置为2。
3)设置HCLK、PCLK1、PCLK2的预分频因子。
4)设置PLL时钟源位HSE,倍频因子为9.
5)打开PLL并等待PLL就绪。
6)选择锁相环时钟为系统时钟。
7)配置系统时钟源,并等待系统时钟就绪。
5 HSE时钟配置
#include "sysclock.h"
void hse_init(unsigned int RCC_PLLMul_x){
/*复位时钟*/
RCC_DeInit();
/*打开HSE*/
RCC_HSEConfig(RCC_HSE_ON);
/*等待HSE就绪*/
if(RCC_WaitForHSEStartUp() == SUCCESS){
/*打开并配置预取指缓冲区*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
/*设置HCLK、PCLK1、PCLK2的分频因子*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
/*配置锁相环的时钟源、倍频因子*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_x);
/*使能锁相环并等待锁相环就绪*/
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) != SET);
/*配置系统时钟源并等待就绪*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08);
}else{
}
}