STM32時鐘系統學習筆記

時鐘系統是STM32的核心,系統上電的第一步,就是正確的配置時鐘。對於初學者來說,STM32的時鐘系統顯得有些複雜。不過,我們只要掌握幾個重要概念,瞭解STM32時鐘產生路徑,就可以輕鬆搞定STM32的時鐘系統。下圖是STM32F10xx時鐘系統的框圖:

 

一、 幾個重要概念:

l  四個時鐘源:HSI、HSE、LSI、LSE。

l  五個輸出時鐘:SYSCLK,HCLK,PCLK1,PCLK2, RTCCLK。

l  兩個時鐘處理機制:倍頻器,預分頻器。

1、 四個時鐘源:

HIS - 高速內部時鐘信號,由STM32內部8MHz的振盪器產生,可直接作爲系統時鐘或在2分頻後作爲PLL輸入。

HSE - 高速外部時鐘信號,由外部晶振產生,支持4~16MHz。

LSI - 低速內部時鐘信號,頻率約40KHz(30KHz~60KHz之間,精度較差),可以在停機或待機模式下保持運行,爲獨立看門狗和自動喚醒單元提供時鐘。

LSE – 低速外部時鐘信號,由一個32.768KHz的低速外部晶振產生,可以爲實時時鐘或其他定時功能提供低功耗且精確的時鐘源。

備註:圖中間的CSS是時鐘監視系統,確保在外部時鐘HSE失效時能自動切換至內部時鐘HSI。

2、 五個輸出時鐘

SYSCLK – 系統時鐘,它是STM32處理器最重要的時鐘信號。使用HSE作爲時鐘源時,頻率可以高達72MHz。SYSCLK爲內核和系統的大部分其他時鐘輸出提供時鐘基礎。

HCLK – 高速總線時鐘,HCLK爲系統AHB總線提供時鐘,最高可達72MHz。

PCLK1 – APB1總線時鐘,爲掛接到APB1總線的外設提供時鐘信號,最高可達36MHz。

PCLK2 – APB2總線時鐘,爲掛接到APB2總線的外設提供時鐘信號,最高可達72MHz。

RTCCLK – 實時時鐘,如果選擇低速外部晶振(32.768KHz),可以爲系統提供精確的時基信號,作爲系統計時的基礎,只要VBAT維持供電,儘管VDD供電被切斷,RTC仍繼續工作。

3、 兩個時鐘處理機

倍頻器(Multiplier) – 負責將輸入的時鐘信號,乘以一個數後輸出。

預分頻器(Prescaler) - 負責將輸入信號,除以一個數後輸出。

二、 時鐘路徑

時鐘路徑:就是輸出時鐘信號,是通過什麼方式由輸入時鐘源得到的。

其實通過上面的時鐘系統框圖,我們可以很清楚的看到每個輸出時鐘的路徑,這裏就不再做細說,指示對一些關鍵的地方,做一些解釋。

1、 SYSCLK時鐘:

SYSCLK時鐘可以由三個時鐘源產生

l  直接由HSI產生

l  直接由HSE產生

l  有PLLCLK產生

這裏需要特別說明由PLLCLK產生的情況,這是我們最常用的一種時鐘選擇。PLLCLK是由HSI和HSE通過倍頻產生的,但是如果是通過HSI產生,HSI會被二分頻(4MHz)後,最爲PLL的輸入,不過需要注意的是,當選取HSI作爲時鐘源時,由於內部時鐘精度和穩定性關係,系統時鐘最高只能到36MHz。PLL倍頻器可以提供16種倍頻係數,比如說我們需要產生72MHz的SYSCLK,那麼可以選取8M外部晶振作爲時鐘源,PLL倍頻係數選擇爲9倍,則8MHz * 9=72MHz。

2、 HCLK時鐘:

這裏先掃盲一下兩個基本概念,AHB和APB,以下文字來自百度文庫,已經熟悉的朋友可以跳過:

隨着深亞微米工藝技術日益成熟,集成電路芯片的規模越來越大。數字IC從基於時序驅動的設計方法,發展到基於IP複用的設計方法,並在SOC設計中得到了廣泛應用。在基於IP複用的SoCSystem on Chip的縮寫,稱爲系統級芯片,也有稱片上系統)設計中,片上總線設計是最關鍵的問題。爲此,業界出現了很多片上總線標準。其中,由ARM公司推出的AMBA片上總線受到了廣大IP開發商和SoC系統集成者的青睞,已成爲一種流行的工業標準片上結構。 AMBA規範主要包括了AHB(Advanced High performance Bus)系統總線APB(Advanced Peripheral Bus)外圍總線。

AHB主要用於高性能模塊(CPUDMADSP)之間的連接,作爲SoC的片上系統總線,它包括以下一些特性:單個時鐘邊沿操作;非三態的實現方式;支持突發傳輸;支持分段傳輸;支持多個主控制器;可配置32~128位總線寬度;支持字節、半字和字的傳輸AHB 系統由主模塊、從模塊和基礎結構(Infrastructure)3部分組成,整個AHB總線上的傳輸都由主模塊發出,由從模塊負責迴應。基礎結構則由仲裁器(arbiter)、主模塊到從模塊的多路器、從模塊到主模塊的多路器、譯碼器(decoder)、虛擬從模塊(dummy Slave)、虛擬主模塊(dummy Master)所組成。

APB主要用於低帶寬的周邊外設之間的連接,例如UART1284等,它的總線架構不像AHB支持多個主模塊,在APB裏面唯一的主模塊就是APB 橋。其特性包括:兩個時鐘週期傳輸;無需等待週期和迴應信號;控制邏輯簡單,只有四個控制信號

瞭解上面概念後,我們再看下HCLK是怎麼產生的。從時鐘系統框圖可以看出,SYSCLK經過AHB預分頻器(AHB Prescaler)後,輸出HCLK。假如我們取分頻因子爲1,則HCLK=72MHz / 1=72MHz。

3、 PCLK時鐘

這裏需要注意的是,PCLK1最高只能配置爲36MHz,其他的看時鐘系統框圖都容易理解。這裏需要解釋下那些設備是掛到了APB1總線下,那些是掛到APB2總線下:

從上圖可以很清楚的瞭解到,APB1APB2下都有那些設備。也就是說,當我們使用APB對飲的設備時,需要正確的配置和打開對飲的PCLK時鐘,否則設備是不能被啓用的,這和傳統51單片機不一樣。

STM32時鐘系統涉及到的寄存器
在文件“stm32f10x_map.h”中,定義了RCC 寄存器結構RCC_TypeDeff:

 

/*------------------------ Reset and Clock Control ---------------------------*/
typedef struct
{
  vu32 CR; 			// HSI,HSE,CSS,PLL等的使能
  vu32 CFGR; 		// PLL等的時鐘源選擇以及分頻係數設定
  vu32 CIR; 			// 時鐘就緒中斷
  vu32 APB2RSTR; 	// APB2線上外設復位寄存器
  vu32 APB1RSTR;	// APB1線上外設復位寄存器
  vu32 AHBENR;		// DMA,SDIO等時鐘使能
  vu32 APB2ENR;		// APB2線上外設時鐘使能
  vu32 APB1ENR;		// APB1線上外設時鐘使能
  vu32 BDCR;		//備份域控制寄存器
  vu32 CSR;
} RCC_TypeDef;


各個寄存器的具體定義,請參閱《STM32中文參考手冊》

STM32時鐘初始化函數

 

/*
 * 時鐘初始化函數
 * sysclk:系統時鐘,單位MHz
 * AHB=DIV1,APB1=DIV2,APB2=DIV1
 * 注意APB1時鐘不可超過36MHz
 */
void Stm32_SysClk_Init(u8 sysclk)
{
	u8 pllmulti;

	pllmulti = (sysclk>>3)-2;	//計算基於8M時鐘源時,PLL的倍頻因子
	
	UCTX_RCC_DeInit();
	RCC->CR |= 1<<16;		//使能外部時鐘源HSE
	while((RCC->CR & 1<<17) == 0);	//等待外部時鐘源就緒
	RCC->CFGR |= pllmulti<<18;		//設置PLL倍頻
	RCC->CFGR |= 4<<8;		//AHB=DIV1,APB1=DIV2,APB2=DIV1,注: PCLK1不能超過36MHz
	RCC->CFGR |= 1<<16;		//選擇HSE作爲PLL時鐘源
	FLASH->ACR|=0x32;		//FLASH 2個延時週期

	RCC->CR |= 1<<24;				//PLL使能
	while((RCC->CR & 1<<25)==0);		//等待PLL鎖定
	RCC->CFGR |= 0x02;				//PLL作爲系統時鐘
	while((RCC->CFGR>>2 & 3)!=2);	//等待系統時鐘切換成功
}

void UCTX_RCC_DeInit(void)
{		  
	RCC->AHBENR = 0x00000014;  //睡眠模式閃存和SRAM時鐘使能.其他關閉.	  
	RCC->APB2ENR = 0x00000000; //外設時鐘關閉.			   
	RCC->APB1ENR = 0x00000000;   
	RCC->CR |= 1<<0;			//使能內部高速時鐘HSION
//復位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]							RCC->CFGR &= 0xF8FF0000;   				 
	RCC->CR &= 0xFEF6FFFF;     //復位HSEON,CSSON,PLLON
	RCC->CR &= 0xFFFBFFFF;     //復位HSEBYP	   	  
	RCC->CFGR &= 0xFF80FFFF;   //復位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE 
	RCC->CIR = 0x00000000;       //關閉所有時鐘中斷		
}

更多參考源碼請到CORTEX技術之家下載。

 

                                                         作者:布穀鳥@UCORTEX

                                             QQ:21073231

                                                                                                                                                     技術論壇:www.ucortex.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章