天天看點

stm32學習2:系統時鐘1,時鐘簡介2,時鐘配置

STM32學習2:系統時鐘介紹與配置

  • 1,時鐘簡介
  • 2,時鐘配置

  鄙人是在淘寶購置了一套STM32開發闆,跟着随帶的CD光牒學習起來的。碰到不懂的就在CSDN上浏覽學習高手的部落格,大神們不僅技術很好還樂于分享,蒙其惠澤,未感忘恩,是以自己開始寫部落格慢慢積累。

  如果您是初學者,看到該系列文章後有所幫助,鄙人深感榮幸。如果您是大神,請您指出不足指出。如果沒人看到,權當積累與記錄了。

  鄙人使用普中科技公司的開發闆,在淘寶可以找到。晶片是STM32F103ZET6,固件庫是V3.5,編譯環境是Keil uVision4。

  轉載請注明完整出處。

1,時鐘簡介

  上篇介紹了如何建立一個STM32的空模闆。搭建好編譯環境後,還需要對stm32晶片本身有一定了解,這樣才可以配置好晶片跑程式。本篇介紹的是STM32的系統時鐘部分,學過數字電路的朋友就知道,時鐘對于電路來說就好比是人體的心髒。詳細的時鐘配置與說明可以參見下面連結中的:《STM32中文參考手冊》

  https://download.csdn.net/download/huagengpai1994/10809289

  整個時鐘體系可以由下圖來表述:

stm32學習2:系統時鐘1,時鐘簡介2,時鐘配置

  可以看到圖中有藍色和綠色兩種顔色的方塊。藍色方塊代表時鐘信号源,綠色信号代表信号處理(分頻、倍頻)與輸出。初學隻要建構時鐘大體的架構就好。

  時鐘信号源有四個部分(可忽略PLL)分别是:

  • HSI RC:高速内部RC振蕩時鐘源,8MHZ。H表示高速,S表示源,I表示内部,RC表示是振蕩器。内部時鐘源是在晶片(小方塊)裡面的,外部時鐘源是在晶片外部通過PCB布線連接配接到晶片裡。
  • LSI RC:低速内部RC振蕩時鐘源,大約為40KHZ。
  • HSE Osc: 高速外部晶體振蕩時鐘源,8MHZ。
  • LSE Osc:低速外部晶體振蕩時鐘源,32.768KHZ。

      圖中倆高速的在上面,倆低速的在下面。

      PLL也被認為是一個時鐘源,不過它從原理上來看并不提供時鐘源信号,隻是對接受的信号倍頻後輸出。可以從圖中看到PLL的時鐘路徑有兩條:HSI RC 2分頻、HSE Osc 直接到達、HSE Osc 2分頻到達。

      同樣的,可以看看下方的RTC時鐘,它的時鐘源也有三條:HSE Osc 128分頻到,LSE Osc 直接到達、LSI RC 直接到達。

      LSI RC還直接供給看門狗獨立時鐘。

      接着看上面的部分,SYSCLK系統時鐘源有三條路徑:HSI RC直接到達,PLL到達,HSE Osc 直接到達。CSS如圖中的解釋,是一個時鐘監視,如果HSE失效則自動切換到SYSCLK=HSI。

      SYSCLK系統時鐘的頻率最高為72MHZ,經過AHB分頻後供給AHB1和AHB2。APB1和APB2還要繼續分頻才能供給外設與計時器,其中APB1是低速的,最高為36MHZ;APB2為高速的,最高為72MHZ。

      中間部分的MCO是将經過晶片的時鐘輸出出去,輸出源如圖中所示有四個:SYSCLK、HSI、HSE和PLLCLK2分頻。

      總結一下:系統時鐘SYSCLK是最核心的部分,圖示左上部分無論怎麼走都是為了到達系統時鐘,然後調配到APB1和APB2為外設輸出時鐘。

       經過時鐘源的選擇、分頻/倍頻,就可以到HCLK(高性能總線AHB用)、FCLK(供給cpu核心的用,常說的cpu主頻)、PCLK(高性能外設總線APB)、USBCLK、TIMXCLK、TIM1CLK、RTCCLK等,外設是挂載STM32的總線上的,具體哪個外設挂載哪個總線,看下圖:

stm32學習2:系統時鐘1,時鐘簡介2,時鐘配置

2,時鐘配置

  在程式設計中,我們要做的也無非是設定門電路以選擇時鐘源輸入、倍頻/分頻系數和打開/關閉對應外設所在總線的時鐘。這些設定是通過寄存器進行設定的,但是直接設定寄存器會有點較複雜,是以可以用SystemInit()庫函數直接進行設定。庫函數的設定方法如下所示:

const uint32_t SystemFrequency = SYSCLK_FREQ_72MHz;

const uint32_t SystemFrequency_SysClk =SYSCLK_FREQ_72MHz;

const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_72MHz;

const uint32_t SystemFrequency_APB1Clk = (SYSCLK_FREQ_72MHz/2);

const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_72MHz;

  這就是在定義了CPU跑72M的時候,各個系統的速度.他們分别是:硬體頻率,系統時鐘,AHB總線頻率,APB1總線頻率,APB2總線頻率.

  如果需要更加靈活的配置,可以調用這個函數:

void RCC_HSE_Configuration(void) //HSE作為PLL時鐘,PLL作為SYSCLK 
{ 
	RCC_DeInit(); /*将外設RCC寄存器重設為預設值 */
 	RCC_HSEConfig(RCC_HSE_ON);/*設定外部高速晶振(HSE) HSE晶振打開(ON)*/ 
   	if(RCC_WaitForHSEStartUp() == SUCCESS)  /*等待HSE起振,  SUCCESS:HSE晶振穩定且就緒*/  
   	{ 
  		RCC_HCLKConfig(RCC_SYSCLK_Div1);/*設定AHB時鐘(HCLK)RCC_SYSCLK_Div1——AHB時鐘 = 系統時鐘*/  
  		RCC_PCLK2Config(RCC_HCLK_Div1); /*設定高速AHB時鐘(PCLK2)RCC_HCLK_Div1——APB2時鐘 = HCLK*/     
  		RCC_PCLK1Config(RCC_HCLK_Div2); /*設定低速AHB時鐘(PCLK1)RCC_HCLK_Div2——APB1時鐘 = HCLK / 2*/
		RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/*設定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作為系統時鐘 */	
  	  }
}
           

  如果使用void RCC_HSE_Configuration(void),可以将其作為一個.C檔案獨立編寫,然後再主函數直接調用。