STM32F103学习笔记-时钟

一、时钟简介

  时钟,顾名思义代表的就是记录时间的“模块”。对于单片机来说,时钟的运行单位是Hz,而不是s。STM32也有其独特的时钟,其为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。而学好时钟的关键在于学好时钟树,理解好时钟树那么对时钟就可以有一个整体的把握。

二、时钟树

  时钟树的框图可以在STM32F10X官方参考手册中查到,如下:
STM32F103学习笔记-时钟_第1张图片
  从图中可以看到,STM32的时钟来源主要有4+1个,分别为:
  内部时钟源:HSI(高速内部时钟)、LSI(低速内部时钟)
  外部时钟源:HSE(高速外部时钟)、LSE(低速外部时钟)
  锁相环:PLL


  图中的OSC代表了晶振的输入和输出,换句话说,晶振是外部时钟的来源而它通过OSC_IN和OSC_OUT接口连入MCU。


  内部时钟源的频率是固定的,如HSI频率为8MHzLSI频率为40kHz;外部时钟源的频率可变,由晶振频率决定,HSE:4-16MHzLSE固定为32.768KHz


  图中 / 代表了分频,即把一个频率除以某个倍数,例如从HSI出来的8MHz经过 /2 后变为了4MHz;图中 × 代表了倍频,即把一个频率乘以某个倍数,例如把经过分频后的HSI(分频后为4MHz)再 ×2 后就变成了8MHz。

三、注意点

  APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3等;
  APB2上面连接的是高速外设,包括UART1、SPI1、Timer1、ADC1、ADC2、 GPIO等。
  时钟的默认值如下所示:
STM32F103学习笔记-时钟_第2张图片

四、时钟的配置

  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 作为系统时钟
        }
    }

你可能感兴趣的:(STM32F103学习笔记)