一、系統(tǒng)時鐘配置
STM32有多個時鐘源,分別是HSI,HSE,LSE,LSI。
HSI振蕩器時鐘:
系統(tǒng)上電默認時鐘,內(nèi)部振蕩器8MHZ,可以直接作為系統(tǒng)時鐘或在2分頻后作為PLL的輸入。時鐘頻率精度較差。
HSE振蕩器時鐘外部:
提供非常精確的主時鐘,STM32F1系列的板上為8MHZ,STM32F2系列的板上為25MHZ晶振。經(jīng)過PLL倍頻:作為系統(tǒng)時鐘。
PLL時鐘源輸入可以是HSI時鐘的二分之一,或者HSE時鐘。
LSE時鐘:
LSE晶體是一個32.867k的低速外部晶體。提供實時時鐘。一般專門用于RTC,等到RTC模塊時再使用。
LSI時鐘(Internal內(nèi)部):
LSI的RC擔(dān)當(dāng)一個低功耗時鐘源的角色,它可以在停機和待機模式下保存運行。為獨立看門狗和自動喚醒單元提供時鐘。LSI時鐘頻率大約40KHZ。一般用于IWDGCLK。
通常的時鐘選擇為HSE配合PLL使其工作在72MHZ(STM32F1系列)或者120MHZ(STM32F2系列)。
STM32F1xx系列
STM32F2XX系列
RCC_DeInit()同SystemInit()的區(qū)別僅僅在于SystemInit()多一個SetSysClock()。SystemInit()包含了整個內(nèi)部時鐘到外部時鐘的配置,但配置的頻率不可調(diào),如需調(diào)整頻率,可以自己用RCC_DeInit()再配合其他操作進行。
配置時鐘流程:
1.將RCC寄存器重新設(shè)置為默認值RCC_DeInit;
2.打開外部高速時鐘晶振HSERCC_HSEConfig(RCC_HSE_ON);
3.等待外部高速時鐘晶振工作HSEStartUpStatus =RCC_WaitForHSEStartUp();
4.設(shè)置AHB時鐘RCC_HCLKConfig;
5.設(shè)置高速APB2時鐘RCC_PCLK2Config;
6.設(shè)置低速速APB1時鐘RCC_PCLK1Config
7.設(shè)置PLLRCC_PLLConfig;
8.打開PLLRCC_PLLCmd(ENABLE);
9.等待PLL工作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
10.設(shè)置系統(tǒng)時鐘RCC_SYSCLKConfig;
11.判斷是否PLL是系統(tǒng)時鐘while(RCC_GetSYSCLKSource() != 0x08);
12.打開要使用的外設(shè)時鐘RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd();
/*******************************************************************************
* Function Name: RCC_Configuration
* Description: Configures the different system clocks.
* Input: None
* Output: None
* Return: None
*******************************************************************************/
void RCC_Configuration(void)
{
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK */
RCC_PCLK1Config(RCC_HCLK_Div1);
/* Select HSE as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
/* Wait till HSE is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x04)
{
}
}
XXXXXXXX;//分別為其他外設(shè)的時鐘配置。
XXXXXXXX;
XXXXXXXX;
}
二、關(guān)于PLL設(shè)置
PLL的設(shè)置主要通過函數(shù):void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ, uint32_t PLLR)來實現(xiàn)。
主要講一下PLL值的設(shè)置與各部分時鐘的關(guān)系。函數(shù)中涉及到6個量的設(shè)置,第一個為內(nèi)部時鐘或者外部時鐘選擇,后面幾個為PLL值的設(shè)置。
lRCC_PLLSource選擇:
RCC_PLLSource_HIS:HIS內(nèi)部時鐘選定,頻率為16MHZ
RCC_PLLSource_HSE:HSE外部時鐘選定,頻率可自選,4MHZ-26MHZ之間,系統(tǒng)默認25MHZ,如需改變,則對stm32f2xx.h中第70行的
#define HSE_VALUE((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
進行修改,改成外部晶振的值。
l通過選擇PLLM和PLLN,來計算得到PLLVCO,計算公式如下:
PLLVCO = (HSE_VALUE / PLL_M) * PLL_N。
PLL_M可取0-63,PLL_N可取192-432。
l通過選擇PLLP來選擇分頻數(shù),以得到系統(tǒng)時鐘。計算公式如下:
SYSCLK = PLLVCO / PLL_P,切記不要超過120MHZ最大頻率。
PLLP可選范圍為2,4,6,8。
l通過選擇PLLQ來OTGFS, SDIO和RNG的時鐘。計算公式如下:
Clock =PLLVCO / PLLQ,不能超過48MHZ。
PLL_Q可取4-15。
l通過選擇PLLR來決定I2S的時鐘。計算公式如下:
I2SCLK =PLLVCO / PLLR。
PLL_R可取2-7。