一、时钟树简介
- HSE 是高速的外部时钟信号,可以由有源晶振或者无源晶振提供,频率从 3-25MHZ 不等。当使用有源晶振时,时钟从 OSC_IN 引脚进入,OSC_OUT 引脚悬空,当选用无源 晶振时,时钟从 OSC_IN 和 OSC_OUT 进入,并且要配谐振电容。
- HSE 最常使用的就是 8M 的无源晶振。当确定 PLL 时钟来源的时候,HSE 可以不分频 或者 2 分频,这个由时钟配置寄存器 CFGR 的位 17:PLLXTPRE 设置,HSE 一般设置为不分频。
- PLL时钟源:内部高速时钟【HSI】二分频 得到PLL时钟源(HSI 是内部高速的时钟信号,频率为 8M,根据 温度和环境的情况频率会有漂移,一般不作为 PLL 的时钟来源)。HSE不分频得到PLL时钟源。
- PLL的时钟PLLCLK:可通过设置倍频因子[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],对PLL时钟来源进行倍频得到PLLCLK。由于HSE(由外接晶振决定,如果外接晶振为16M则需HSE二分频)为一般为8M,官方库文件系统时钟配置72M,所以配置为9倍频。则有我们熟知的PLLCLK=SYSCLK。
- 系统时钟SYSCLK:由图可知系统时钟的来源可以是,:HSI、PLLCLK、HSE。ST 官方推荐的稳定运行时钟为72M,因此使用PLLCLK作为系统时钟的时钟来源。
- AHB 总线时钟 HCLK:系统时钟经过AHB分频器(可[1,2,4,8,16,64,128,256,512]分频)得到HCLK至AHB总线,核心存储器、DMA。
- APB1总线时钟HCLK1(AHB1的时钟HCLK1),由 HCLK 经过低速 APB 预分频器(APB1预分频器)得到,分频因子可以是:[1,2,4, 8,16],即最大为36M HCLK1=PCLK1= HCLK/2=36M
-
APB2 总线时钟 PCLK2 由 HCLK 经过高速 APB2 预分频器得到,分频因子可以是:[1,2,4,8,16],HCLK2 属 于高速的总线时钟,片上高速的外设就挂载到这条总线上 PCLK2 = HCLK = 72M。
-
AHB,是Advanced High performance Bus的缩写, 高级高性能总线;APB,是Advanced Peripheral Bus的缩写, 高级外设总线。
二、工程配置
- 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx 和STM32F103xx微控制器。
- 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx 和STM32F103xx微控制器。
- 大容量产品 是指闪存存储器容量在 256K 至 512K 字节之间的 STM32F101xx STM32F103xx微控制器。
这里的容量是指FLASH的大小,判断方法如下:
- 16KB≤FLASH≤32KB 选择:STM32F10X_LD
- 64KB≤FLASH≤128KB 选择:STM32F10X_MD
- 256KB≤FLASH≤512KB 选择:STM32F10X_HD
STM32F10X_MD, USE_STDPERIPH_DRIVER
三、RCC 配置
// 将HSE配置项目的时钟源 一般使用HSE配置为项目的时钟的来源
// RCC :reset clock control 复位和时钟控制器
void Project_RCCConfig_HSE(void)
{
// 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值
volatile uint32_t HSEStartUpStatus=0;
RCC_DeInit(); // RCC时钟复位
RCC_HSEConfig(RCC_HSE_ON); // 配置外部高速时钟(HSE) 外部晶振作为时钟源 硬件使用的是8M的外部晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp(); // 等待HSE稳定 SUCCESS 稳定 ERROR 错误
if(HSEStartUpStatus==SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 使能FLASH 预存取缓冲区
FLASH_SetLatency(FLASH_Latency_2); // 设置延迟周期
RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK 72M
RCC_PCLK1Config(RCC_HCLK_Div2); // HCLK1=PCLK1=36M=HCLK/2 低速总线时钟
RCC_PCLK2Config(RCC_HCLK_Div1); // HCLK2=PCLK2=72M=HCLK 高速总线时钟
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, 9); // 配置锁相环时钟源和倍增因子。
RCC_PLLCmd(ENABLE); // 开启PLL
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);// 检查是否设置了指定的RCC标志
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK
while (RCC_GetSYSCLKSource() != 0x08); // 读取时钟切换状态位,确保PLLCLK被选为系统时钟
}
}