天天看點

STM32F103學習筆記-時鐘

一、時鐘簡介

  時鐘,顧名思義代表的就是記錄時間的“子產品”。對于單片機來說,時鐘的運作機關是Hz,而不是s。STM32也有其獨特的時鐘,其為單片機工作提供一個穩定的機器周期進而使系統能夠正常運作。而學好時鐘的關鍵在于學好時鐘樹,了解好時鐘樹那麼對時鐘就可以有一個整體的把握。

二、時鐘樹

  時鐘樹的框圖可以在STM32F10X官方參考手冊中查到,如下:

STM32F103學習筆記-時鐘

  從圖中可以看到,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等。

  時鐘的預設值如下所示:

STM32F103學習筆記-時鐘

四、時鐘的配置

  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 作為系統時鐘
        }
    }