一、时钟简介
时钟,顾名思义代表的就是记录时间的“模块”。对于单片机来说,时钟的运行单位是Hz,而不是s。STM32也有其独特的时钟,其为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。而学好时钟的关键在于学好时钟树,理解好时钟树那么对时钟就可以有一个整体的把握。
二、时钟树
时钟树的框图可以在STM32F10X官方参考手册中查到,如下:
从图中可以看到,STM32的时钟来源主要有4+1个,分别为:
内部时钟源:HSI(高速内部时钟)、LSI(低速内部时钟)
外部时钟源:HSE(高速外部时钟)、LSE(低速外部时钟)
锁相环:PLL
图中的OSC代表了晶振的输入和输出,换句话说,晶振是外部时钟的来源而它通过OSC_IN和OSC_OUT接口连入MCU。
内部时钟源的频率是固定的,如HSI频率为8MHz,LSI频率为40kHz;外部时钟源的频率可变,由晶振频率决定,HSE:4-16MHz,LSE固定为32.768KHz。
图中 /
代表了分频,即把一个频率除以某个倍数,例如从HSI出来的8MHz经过 /2
后变为了4MHz;图中 ×
代表了倍频,即把一个频率乘以某个倍数,例如把经过分频后的HSI(分频后为4MHz)再 ×2
后就变成了8MHz。
三、注意点
APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3等;
APB2上面连接的是高速外设,包括UART1、SPI1、Timer1、ADC1、ADC2、 GPIO等。
时钟的默认值如下所示:
四、时钟的配置
1、设置系统时钟源:RCC_SYSCLKConfig(RCC_SYSCLKSource_CLK);
其中CLK代表了HSE、HSI、LSE、LSI
2、配置PLL时钟:void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);
其中,第一个参数是PLL时钟源选择,第二个参数是倍频系数
3、这里参照普中STM32F10X开发攻略提供一个可以直接配置系统时钟的函数:
/****************************************************
* 函 数 名: RCC_HSE_Config
* 函数功能: 利用HSE自定义系统时钟, 可以通过修改PLL时钟源和倍频系数实现时钟调整
* 输 入 : div:RCC_PLLSource_HSE_Div1/RCC_PLLSource_HSE_Div2 pllm:RCC_PLLMul_2-RCC_PLLMul_16
* 输 出 : 无
*******************************************************/
void RCC_HSE_Config(u32 div,u32 pllm) //自定义系统时间(可以修改时钟)
{
RCC_DeInit(); //将外设 RCC 寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE)
if(RCC_WaitForHSEStartUp()==SUCCESS) //等待 HSE 起振
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置 AHB 时钟(HCLK)
RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速 AHB 时钟(PCLK1)
RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速 AHB 时钟(PCLK2)
RCC_PLLConfig(div,pllm);//设置 PLL 时钟源及倍频系数
RCC_PLLCmd(ENABLE); //使能或者失能 PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的 RCC标志位设置与否,PLL 就绪
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);// 设 置 系 统 时 钟(SYSCLK)
while(RCC_GetSYSCLKSource()!=0x08);//返回用作系统时钟的时钟源,0x08:PLL 作为系统时钟
}
}