時鐘系統是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複用的SoC(System on Chip的縮寫,稱爲系統級芯片,也有稱片上系統)設計中,片上總線設計是最關鍵的問題。爲此,業界出現了很多片上總線標準。其中,由ARM公司推出的AMBA片上總線受到了廣大IP開發商和SoC系統集成者的青睞,已成爲一種流行的工業標準片上結構。 AMBA規範主要包括了AHB(Advanced High performance Bus)系統總線和APB(Advanced Peripheral Bus)外圍總線。
AHB主要用於高性能模塊(如CPU、DMA和DSP等)之間的連接,作爲SoC的片上系統總線,它包括以下一些特性:單個時鐘邊沿操作;非三態的實現方式;支持突發傳輸;支持分段傳輸;支持多個主控制器;可配置32位~128位總線寬度;支持字節、半字和字的傳輸。AHB 系統由主模塊、從模塊和基礎結構(Infrastructure)3部分組成,整個AHB總線上的傳輸都由主模塊發出,由從模塊負責迴應。基礎結構則由仲裁器(arbiter)、主模塊到從模塊的多路器、從模塊到主模塊的多路器、譯碼器(decoder)、虛擬從模塊(dummy Slave)、虛擬主模塊(dummy Master)所組成。
APB主要用於低帶寬的周邊外設之間的連接,例如UART、1284等,它的總線架構不像AHB支持多個主模塊,在APB裏面唯一的主模塊就是APB 橋。其特性包括:兩個時鐘週期傳輸;無需等待週期和迴應信號;控制邏輯簡單,只有四個控制信號。
瞭解上面概念後,我們再看下HCLK是怎麼產生的。從時鐘系統框圖可以看出,SYSCLK經過AHB預分頻器(AHB Prescaler)後,輸出HCLK。假如我們取分頻因子爲1,則HCLK=72MHz / 1=72MHz。
3、 PCLK時鐘
這裏需要注意的是,PCLK1最高只能配置爲36MHz,其他的看時鐘系統框圖都容易理解。這裏需要解釋下那些設備是掛到了APB1總線下,那些是掛到APB2總線下:
從上圖可以很清楚的瞭解到,APB1和APB2下都有那些設備。也就是說,當我們使用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