一,時鐘系統框圖
下面我們根據這張圖說說有關STM32時鐘系統的那些事
二,STM32的5個時鐘源:HSI HSE LSI LSE PLL
1. HSI:高速內部時鐘
由內部RC振蕩器產生,頻率不穩定,約8M
可直接作為系統時鐘的選擇(如圖:系統時鐘源有4個來源選擇,后邊講解)
可2分頻后經過選擇器做PLL時鐘源
2. HSE:高速外部時鐘
由外部時鐘源產生,可接4M-16MHz晶振
可經過選擇器1,選擇器2做PLL時鐘源
可2分頻后經過選擇器1,選擇器2做PLL時鐘源
可直接作為系統時鐘的時鐘源
可128分頻后做RTC時鐘源
3. PLL:鎖相環
作用:可關閉或倍頻2-16倍,共16種選擇(最大不能超過72MHz)
倍頻后的PLLCLK可直接做系統時鐘源
可經過USB預分頻器(分頻前48或72MHz)分頻后,做USB時鐘(48MHz)
例如:HSE外接8M晶振通過選擇器1選擇器2進入PLL,可設置PLL的倍頻系數(通過配置相關寄存器配置)
倍頻后產生的PLLCLK可作為系統時鐘的一個選擇
4. LSE:低速外部時鐘
由外部晶振產生,一般外接32.768MHz晶振給RTC(STM32芯片內部時鐘單元)時鐘提供時鐘源
外接32.768KHz晶振為RTC時鐘提供時鐘源
5. LSI:低速內部時鐘
由內部RC振蕩器產生,頻率不穩定 約40KHz
為STM32獨立看門狗單元提供時鐘來源
也可為RTC提供時鐘來源(RTC有3個可選時鐘源)
由于RTC實時時鐘對時鐘的要求較高,所以一般不使用LSI作為時鐘源,采用LSE外接32.768KHz晶振作為RTC時鐘源
三,STM32的八個時鐘
1. 系統時鐘-SYSCLK
系統時鐘的來源:
1,HSI直接做系統時鐘源
2,HSE直接做系統時鐘源
3,PLL倍頻后的PLLCLK做系統時鐘源(這里的PLL時鐘來源有3種,一會兒說)
4,CSS單元(時鐘監控系統)
CSS作用是監聽系統時鐘是否出了問題(間接知道外部晶振是否壞了)
項目中大多系統時鐘來源采用HSE,一旦監控到HSE失敗,會自動切換系統時鐘源為HSI
2. PLL時鐘-PLLCLK
PLL的時鐘來源:
1,HSI的2分頻
2,HSE->選擇器1->選擇器2
3,HSE的2分頻->經過選擇器1->選擇器2
3. RTC時鐘-RTCCLK:32.768MHz
RTC時鐘來源:
1,HSE的128分頻
2,LSE外接32.768kHz晶振
3,LSI直接做RTC時鐘源
由于LSI是由內部RC振蕩器產生,不穩定,RTC時鐘對時鐘源的要求較高,多以一般用LSE外接32.768MHz晶振做RTC時鐘源
4,獨立看門狗時鐘-IWDGCLK:40MHz
獨立看門狗時鐘來源:
由LSI直接作為其時鐘源
5. AHB總線時鐘-HCLK:速度最高72MHz
AHB預分頻器,9種分頻因子為:1,2,4,8,16,64,128,256,512
系統時鐘HCLK 經過AHB預分頻器,產生HCLK時鐘(最高72M)
一般將系統時鐘設置為72M將AHB預分頻器設置為1
AHB總線下還掛載了ABP1預分頻器和APB2預分頻器(后邊說)
6. APB1總線時鐘-PCLK1(低速):速度最高36MHz
APB1預分頻器:分頻因子:1,2,4,8,16
AHB時鐘HCLK經過APB1預分頻器,產生PCLK1時鐘(最高到36M)-低速外設總線時鐘
下面掛一些低速外設,如:通用定時器時鐘
APB1總線下掛載的部分這里不做講解(到定時器時再說)
7. APB2總線時鐘-PCLK2(高速):速度最高72MHz
APB2預分頻器-5種分頻因子為:1,2,4,8,16
AHB時鐘HCLK經過APB2預分頻器,產生PCLK2時鐘(最高到72M)-高速外設總線時鐘
下面掛一些高速外設,如:TIM1時鐘,ADC時鐘
APB2總線下掛載的部分這里不做講解(到定時器和ADC時再說)
8. USB時鐘-USBCLK:48MHz
來自PLLCLK經過USB分頻器(可通過相關寄存器配置 1倍 1.5倍)
F1芯片在不超頻時的最大時鐘是72MHz,也就是說:
當PLLCLK為72MHz系統時鐘時,USB分頻器為1.5倍,72/1.5=48MHz
當PLLCLK為48MHz時,USB分頻器為1倍,48/1=48MHz
所以:使用外設前需要使能相應的鐘使能位,否則外設不能使用
STM32有很多外設,不使用的不打開,否則增加功耗(耗電)
四,MCO:輸出內部時鐘的引腳
MCO:輸出內部時鐘的引腳(PA8),可輸出相關內部時鐘
MCO輸出內部時鐘的選擇:
SYSCLK-系統時鐘
HSI-高速內部時鐘
HSE-高速外部時鐘
PLLCLK的2分頻
五,時鐘系統寄存器
與時鐘相關的配置寄存器一般在:stm32f10x_rcc.c下stm32f10x_rcc.h頭文件中
stm32f10x_rcc.c下stm32f10x.h中包含了大多數的地址映射,可找到RCC結構體
/**
* @brief Reset and Clock Control
*/
typedef struct
{
__IO uint32_t CR; // HSI,HSE,CSS,PLL等的使能和就緒標志位
__IO uint32_t CFGR; // PLL等的時鐘源選擇,分頻系數設定
__IO uint32_t CIR; // 清除/使能 時鐘就緒中斷
__IO uint32_t APB2RSTR; // APB2線上外設復位寄存器
__IO uint32_t APB1RSTR; // APB1線上外設復位寄存器
__IO uint32_t AHBENR; // DMA,SDIO等時鐘使能
__IO uint32_t APB2ENR; // APB2線上外設時鐘使能
__IO uint32_t APB1ENR; // APB1線上外設時鐘使能
__IO uint32_t BDCR; // 備份域控制寄存器
__IO uint32_t CSR; // 控制狀態寄存器
#ifdef STM32F10X_CL
__IO uint32_t AHBRSTR;
__IO uint32_t CFGR2;
#endif /* STM32F10X_CL */
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
uint32_t RESERVED0;
__IO uint32_t CFGR2;
#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */
} RCC_TypeDef;
其中常用的五個寄存器:
__IO uint32_t CR; // HSI,HSE,CSS,PLL等的使能和就緒標志位
__IO uint32_t CFGR; // PLL等的時鐘源選擇,分頻系數設定
__IO uint32_t AHBENR; // DMA,SDIO等時鐘使能
__IO uint32_t APB2ENR; // APB2線上外設時鐘使能
__IO uint32_t APB1ENR; // APB1線上外設時鐘使能
后三個寄存器:
外設時鐘使能寄存器-控制AHB,APB1,APB2
例如:
AHB控制SDIO時鐘,CRC時鐘使能
APB1控制IO口時鐘使能
APB1控制串口使能,I2
版權聲明:「BraveWangDev」https://blog.csdn.net/ABAP_Brave/article/details/52290784