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