STM32時鐘體系結構
STM32的時鐘體系可以直接以圖概括(摘自STM32F10X參考手冊)
下面就此圖做分析
1. STM32輸入時鐘源
1.1 時鐘源的作用
無論是小型微控制器還是像STM32這樣高階微控制器,它們工作的核心都是大規模的時序邏輯電路,而驅動時序邏輯電路的關鍵則是準確而又穩定的時鐘源。它的作用就像小學在操場上做廣播體操時候播放的背景音樂,用於協調和同步各單元執行,為時序電路提供基本的脈衝訊號。
1.2 STM32時鐘源的設計
在51微控制器中,一般都外接一個11.0592MHz的晶振,注意,提供時鐘的不是晶振,而是RC時鐘電路,而晶振只是時鐘電路的元件之一。同理,在STM32中,時鐘源也是由RC時鐘電路產生,與51微控制器的區別是區別在於,RC電路的位置。根據RC電路的位置,可以將STM32的時鐘源分為內部時鐘電路和外部時鐘、內外部時鐘電路。
(1)內部時鐘電路:
晶體振盪器和RC時鐘電路都在STM32晶片內部,如圖中標註1、標註4。
標註1處是產生8MHz的時鐘源,稱為HSI,高速內部時鐘源(H意為高速,S意為源,I意為內部);
標註4處是產生32KHz的時鐘源,稱為LSI,低速內部時鐘源;
(2)內外部時鐘電路:
晶體振盪器在STM32晶片外部,RC時鐘電路在STM32晶片內部,如圖中標註2、標註3。
標註2處是產生4-16MHz的時鐘源,稱為HSE,高速外部時鐘源;
標註3是產生32.768KHz的時鐘源,稱為LSE,低速外部時鐘源;
OSC_OUT和OSC_IN、OSC32_OUT和OS32_IN分別接晶振的兩個引腳。前者一般接8MHz晶振;後者一定接32.768KHz,因為這個時鐘源是供給RTC實時時鐘使用的。在51微控制器中沒有整合RTC模組,在做電子時鐘時用到的DS1302整合晶片時,也是為其提供的也是32.768KHz的晶振。
(3)外部時鐘電路
晶體振盪電路和RC時鐘電路都在STM32晶片外部。如圖中標註2、標註3。
OSC_OUT和OSC_IN、OSC32_OUT和OS32_IN除了分別接晶振的兩個引腳,對於OSC_IN和OSC32_IN引腳,還可以接入外部的RC時鐘電路,其時鐘源直接由外部供給,不過這種方案少見。
綜上所述,STM32的時鐘源有4個: HSI、HSE和LSI、LSE。
HSI時鐘源,它是在由STM32在內部用RC振盪電路實現的高速內部時鐘源。HIS RC振盪器能夠在不需要任何外部期間的條件下提供系統時鐘,它的啟動時間比HSE晶體振盪器短,但是不精準,即使在校準之後它的時鐘頻率精度仍較差。在手冊中還明確說,當HSI被用作PLL時鐘輸入時,系統時鐘能得到的最大頻率是61MHz,這顯然不能發揮STM32最極致的效能。
1.3 時鐘訊號通道選擇
雖然HSI不精準,但是鑑於啟動速度原因考慮,STM32上電覆位,預設是採用HSI時鐘源的,當然開發者可以不修改這個時鐘源,那麼系統將一直工作在一個時鐘源不穩定不精準的環境下。
然而一般做法是改變時鐘源,將時鐘源改為HSE。改變時鐘源的通道是在相關暫存器設定的,在圖中的PLLSRC可以實現對這兩個頻率的切換。
1.4 鎖相環倍頻器PLL/預分頻器Prescaler
STM32的cpu的工作常規頻率是72MHZ(超過72MHz工作稱為超頻工作,CPU耗電加劇,且會發燙),但是我們接入的晶振是8MHz,這就需要一個對頻率加倍的操作,即倍頻。如圖中的PLLMUL,PLLMULL實現對接入時鐘源的倍頻,如x2、x3、x4…倍頻後的時鐘源為PLLCLK。
預分頻器是實現對頻率削減作用的。倍頻器將HSE倍頻之後提供給cpu,但是除了cpu之外,其他片內外設,如SPI控制模組、IIC控制模組等的工作同樣需要時鐘源,這些外設的時鐘源肯定是低於cpu執行時鐘的,例如USB通訊才需要48MHz,所以需要對倍頻後的時鐘源進行分頻。一般晶片的分頻做法都是對一個時鐘源倍頻後供給某些部件,其他低於此倍頻後的時鐘都是基於此時鐘源來分頻的。使用者可通過多個預分頻器配置AHB,高速APB(APB2)和低速APB(APB1)域的頻率。AHB和APB2域的最大頻率是72MHz。APB1域的最大允許頻率是36MHz。SDIO介面的時鐘頻率固定在HCLK / 2。
經過時鐘源的選擇、分頻/倍頻,就可以到HCLK(高效能匯流排AHB用)、FCLK(供給cpu核心的用,常說的cpu主頻)、PCLK(高效能外設匯流排APB)、USBCLK、TIMXCLK、TIM1CLK、RTCCLK等,外設是掛載STM32的總線上的,具體哪個外設掛載哪個匯流排,看下圖:
在軟體開發中,我們要做的也無非設定閘電路以選擇時鐘源輸入、倍頻/分頻係數和開啟/關閉對應外設所在匯流排的時鐘。
2. STM32輸出時鐘源
圖中的MCO功能模組,可以將PLLCLK / 2、HSI、HSE、SYSCLK輸出,供給其他系統作為輸入時鐘源,對這一功能模組也是又相應的暫存器,圖中以MCO標註。
3. 系統滴答Systick
Systick就是一個定時器而已,只是它放在了NVIC中,主要的目的是為了給作業系統提供一個硬體上的中斷,稱之為滴答中斷作業系統進行運轉的時候,也會有時間節拍。它會根據節拍來工作,把整個時間段分成很多小小的時間片,而每個任務每次只能執行一個時間片的時間長度,超時就退出給別的任務執行,這樣可以確保任何一個任務都不會霸佔作業系統提供的各種定時功能,都與這個滴答定時器有關。因此,需要一個定時器來產生週期性的中斷,而且最好還讓使用者程式不能隨意訪問它的暫存器,以維持作業系統的節拍。只要不把它在SysTick控制及狀態暫存器中的使能位清除,就一直執行。
RCC(復位與時鐘控制器)通過AHB時鐘(HCLK)8分頻後作為Cortex系統定時器(SysTick)的外部時鐘。通過對SysTick控制與狀態暫存器的設定,可選擇上述時鐘或Cortex(HCLK)時鐘作為SysTick時鐘(後者圖中沒畫出)。另外,還有其他時鐘,如USB時鐘,ADC時鐘、獨立看門狗時鐘等,它們各自的時鐘源通過前面學習,也可以輕易分析出來,這裡不再贅述。
4. 時鐘相關的暫存器
時鐘體系涉及到的暫存器有
RCC_CR
RCC_CFGR
RCC_CIR
RCC_APB2RSTR
RCC_APB1RSTR
RCC_AHBENR
RCC_APB2ENR
RCC_APB1ENR
RCC_BDCR
RCC_CSR
這些暫存器的作用直接看資料可知,程式設計使用部分後續補充。