?
目錄
?
stm32時鐘系統
時鐘源
(1) 2 個外部時鐘源:
(2)2 個內部時鐘源:
鎖相環 PLL
????????PLLXTPRE: HSE 分頻器作為 PLL 輸入 (HSE divider for PLL entry)
????????PLLSRC: PLL 輸入時鐘源 (PLL entry clock source)
????????PLLMUL: PLL 倍頻系數 (PLL multiplication factor)
系統時鐘 SYSCLK
????????APB1 總線時鐘
????????APB2 總線時鐘
時鐘信號輸出 MCO
RCC相關配置寄存器
stm32時鐘系統

????????圖中A表示其他電路需要的輸入源時鐘信號;B為一個特殊的振蕩電路“PLL”,由幾個部分構成;C為重點要關注的MCU內的注釋中“SYSCLK”; AHB預分配器將SYSCLK分頻或不分頻后分發給其他外設進行處理,包括到F部分的Cortex-M內核系統時鐘。D和E部分分別為定時器等外設的時鐘源APB/APB2。G是STM32的時鐘輸出功能。
時鐘源
? ? ? ? 對于STM32F1,輸入時鐘源主要包括HSI,HSE,LSI,LSE。其中,從時鐘頻率來可以分為高速時鐘源和低速時鐘源,其中HSI、HSE高速時鐘,LSI、LSE是低速時鐘。從來源可分為外部時鐘源和內部時鐘源,外部時鐘源就是從外部通過接晶振的方式獲取時鐘源,其中 HSE 和 LSE 是外部時鐘源;其他是內部時鐘源,芯片上電即可產生,不需要借助外部電路。
(1) 2 個外部時鐘源:
- ? ? ? ? 高速外部震蕩器HSE(High Speed External Clock signal)
????????外接石英/陶瓷諧振器,頻率為 4MHz~16MHz。本開發板使用的是 8MHz。
- ????????低速外部振蕩器 LSE (Low Speed External Clock signal)
????????外接 32.768kHz 石英晶體,主要作用于 RTC 的時鐘源。
(2)2 個內部時鐘源:
- ????????高速內部振蕩器 HSI(High Speed Internal Clock signal)
????????由內部 RC 振蕩器產生,頻率為 8MHz。
- ????????低速內部振蕩器 LSI(Low Speed Internal Clock signal)
????????由內部 RC 振蕩器產生,頻率為 40kHz,可作為獨立看門狗的時鐘源
????????芯片上電時默認由內部的 HSI 時鐘啟動,如果用戶進行了硬件和軟件的配置,芯片才會根據用戶配置調試嘗試切換到對應的外部時鐘源,所以同時了解這幾個時鐘源信號還是很有必要的。
鎖相環 PLL
????????鎖相環是自動控制系統中常用的一個反饋電路, 在 STM32 主控中,鎖相環的作用主要有兩個部分:輸入時鐘凈化和倍頻。 前者是利用鎖相環電路的反饋機制實現,后者我們用于使芯片在更高且頻率穩定的時鐘下工作。
????????在 STM32 中, 鎖相環的輸出也可以作為芯片系統的時鐘源。 根據圖 1 的時鐘結構,使用鎖相環時只需要進行三個部分的配置。為了方便查看,截取了使用 PLL 作為系統時鐘源的配置部分,如圖 2?所示。

????????圖 2 借用了在 CubeMX 下用鎖相環配置 72MHz 時鐘的一個示例:
-
????????PLLXTPRE: HSE 分頻器作為 PLL 輸入 (HSE divider for PLL entry)
????????即圖2在標注為①的地方, 它專門用于 HSE, ST 設計它有兩種方式,并把它的控制功能放在 RCC_CFGR 寄存器中, 我們引用如圖3。
?

?????????從 F103 參考手冊可知它的值有兩個:一是 2 分頻, 另一種是 1 分頻(不分頻)。經過 HSE 分頻器處理后的輸出振蕩時鐘信號比直接輸入的時鐘信號更穩定。
-
????????PLLSRC: PLL 輸入時鐘源 (PLL entry clock source)
????????圖2中②表示的是 PLL 時鐘源的選擇器, 同樣的,參考 F103 參考手冊:

?????????它有兩種可選擇的輸入源:設計為 HSI 的二分頻時鐘, 另一個是 A 處的 PLLXTPRE 處理后的 HSE 信號。
-
????????PLLMUL: PLL 倍頻系數 (PLL multiplication factor)
????????圖2中③所表示的配置鎖相環倍頻系數,同樣地可以查到在 STM32F1 系列中, ST 設置它的有效倍頻范圍為 2~16 倍。
????????結合圖 2,要實現 72MHz 的主頻率,我們通過選擇 HSE 不分頻作為 PLL 輸入的時鐘信號, 即輸入 8Mhz,通過標號③選擇倍頻因子,可選擇 2-16 倍頻,我們選擇 9 倍頻,這樣可以得到時鐘信號為 8*9=72MHz。??????
系統時鐘 SYSCLK
?????????STM32 的系統時鐘 SYSCLK 為整個芯片提供了時序信號。我們已經大致知道 STM32 主控是時序電路鏈接起來的。對于相同的穩定運行的電路,時鐘頻率越高,指令的執行速度越快,單位時間能處理的功能越多。 STM32 的系統時鐘是可配置的,在 STM32F1 系列中,它可以為HSI、 PLLCLK、 HSE 中的一個,通過 CFGR 的位 SW[1:0]設置。
????????講解 PLL 作為系統時鐘時,根據我們開發板的資源,可以把主頻通過 PLL 設置為 72MHz。仍使用 PLL 作為系統時鐘源,如果使用 HSI/2,那么可以得到最高主頻 8MHz/2*16=64MHz。
????????從上面的圖 2 時鐘樹圖可知, AHB、 APB1、 APB2、內核時鐘等時鐘通過系統時鐘分頻得到。根據得到的這個系統時鐘,下面我們結合外設來看一看各個外設時鐘源
?

?????????看圖5 STM32F103 系統時鐘, 標號 C 為系統時鐘輸入選擇,可選時鐘信號有外部高速時鐘 HSE(8M)、內部高速時鐘 HSI(8M)和經過倍頻的 PLL CLK(72M),選擇 PLL CLK 作為系統時鐘,此時系統時鐘的頻率為 72MHz。系統時鐘來到標號 D 的 AHB 預分頻器,其中可選擇的分頻系數為 1, 2, 4, 8, 16, 32, 64, 128, 256,我們選擇不分頻,所以 AHB 總線時鐘達到最大的 72MHz。
????????下面介紹一下由 AHB 總線時鐘得到的時鐘:
????????APB1 總線時鐘
????????由 HCLK 經過標號 E 的低速 APB1 預分頻器得到,分頻因子可以選擇 1, 2, 4, 8, 16,這里我們選擇的是 2 分頻,所以 APB1 總線時鐘為 36M。由于 APB1 是低速總線時鐘,所以 APB1 總線最高頻率為 36MHz,片上低速的外設就掛載在該總線上,例如有看門狗定時器、定時器 2/3/4/5/6/7、 RTC 時鐘、 USART2/3/4/5、 SPI2(I2S2)與 SPI3(I2S3)、 I2C1 與 I2C2、CAN、 USB 設備和 2 個 DAC。
????????APB2 總線時鐘
????????由 HCLK 經過標號 F 的高速 APB2 預分頻器得到,分頻因子可以選擇 1, 2, 4, 8, 16,這里我們選擇的是 1 即不分頻,所以 APB2 總線時鐘頻率為 72M。與 APB2 高速總線鏈接的外設有外部中斷與喚醒控制、 7 個通用目的輸入/輸出口(PA、 PB、 PC、 PD、 PE、 PF和 PG)、定時器 1、定時器 8、 SPI1、 USART1、 3 個 ADC 和內部溫度傳感器。其中標號 G 是ADC 的預分頻器。
????????此外, AHB 總線時鐘直接作為 SDIO、 FSMC、 AHB 總線、 Cortex 內核、存儲器和 DMA 的HCLK 時鐘,并作為 Cortex 內核自由運行時鐘 FCLK。

?????????標號 H 是 USBCLK,是一個通用串行接口時鐘,時鐘來源于 PLLCLK。 STM32F103 內置全速功能的 USB 外設,其串行接口引擎需要一個頻率為 48MHz 的時鐘源。該時鐘源只能從PLL 輸出端獲取,可以選擇為 1.5 分頻或者 1 分頻,也就是,當需要使用 USB 模塊時, PLL 必須使能,并且時鐘頻率配置為 48MHz 或 72MHz。
????????標號 I 是 MCO 輸出內部時鐘, STM32 的一個時鐘輸出 IO(PA8),它可以選擇一個時鐘信號輸出,可以選擇為 PLL 輸出的 2 分頻、 HSI、 HSE、或者系統時鐘。這個時鐘可以用來給外部其他系統提供時鐘源。
?????????標號 J 是 RTC 定時器,其時鐘源為 HSE/128、 LSE 或 LSI。
時鐘信號輸出 MCO
?STM32 允許通過設置, 通過 MCO 引腳輸出一個穩定的時鐘信號。在圖1 中標注為“G”的部分。以下四個時鐘信號可被選作 MCO 時鐘:
????????● SYSCLK
????????● HSI
????????● HSE
????????● 除 2 的 PLL 時鐘
????????時鐘的選擇由時鐘配置寄存器(RCC_CFGR)中的 MCO[2:0]位控制。
????????我們可以通過 MCO 引腳來輸出時鐘信號, 測試輸出時鐘的頻率,或作為其它需要時鐘信號的外部電路的時鐘。