在CKS32F4xx系列產(chǎn)品中,有HSI、HSE、LSI、LSE、PLL五個重要的時鐘源,其間PLL分為主PLL和專用PLL兩部分。從時鐘頻率來分能夠分為高速時鐘源(HIS、HIS、PLL)和低速時鐘源(LSI、LSE);從來歷可分為外部時鐘源(HSE、LSE)和內(nèi)部時鐘源(HIS、LSI、PLL)。
①:LSI是低速內(nèi)部RC振蕩器,頻率為32kHz。供獨立看門狗和RTC單元使用。
②:LSE是低速外部時鐘,接頻率為32.768kHz晶振。主要供RTC單元使用。
③:HSE是高速外部時鐘晶振輸入,頻率范圍為4MHz~26MHz。。
④:HSI是高速內(nèi)部RC振蕩器,頻率為16MHz??梢灾苯幼鳛橄到y(tǒng)時鐘或者用作PLL輸入。
⑤:PLL為鎖相環(huán)倍頻輸出,有兩個PLL:
1)主 PLL(PLL)由 HSE 或許 HSI 供給時鐘信號,并具有兩個不同的輸出時鐘。
其二PLLQ用于生成 USB_OTG_FS(48MHz)、隨機數(shù)發(fā)生器SDIO時鐘。
在CKS32F4xx系列固件庫system_cks32f4xx.c文件中定義了函數(shù)SystemInit(void),并在其間調(diào)用了SetSysClock()函數(shù)來裝備體系要害時鐘寄存器,其處理流程如下:
在設(shè)置主PLL時鐘時,需求設(shè)置一系列的分頻系數(shù)和倍頻參數(shù),代碼如下:
RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
PLL_M、PLL_N、PLL_P宏定義均在在System_cks32f4xx.c文件中定義,當采用8MHz外部晶振時,主PLL時鐘計算方法如下:
PLL = 8MHz * PLL_N / (PLL_M * PLL_P) = 8MHz * 336 /(8 * 2) = 168MHz
用戶可根據(jù)實際需求,根據(jù)SetSysClock函數(shù)內(nèi)的注釋進行實際修改,可用的時鐘源配置宏定義位于cks32f4xx.h中,如RCC_CR_HSION、RCC_CR_HSEON等。
CKS32F4xx系列外設(shè)時鐘配置
在系統(tǒng)初始化之后,在使用部分外設(shè)時,我們還需要根據(jù)外設(shè)需求修改某些時鐘源配置。在CKS32F4xx系列固件庫中,時鐘源的選擇以及時鐘使能等函數(shù)均在RCC相關(guān)固件庫文件 cks32f4xx_rcc.h 和 cks32f
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
以上5個系統(tǒng)時鐘使能函數(shù)分別控制AHB1、AHB2、AHB3、APB1、APB2總線。要使能某個外設(shè),調(diào)用對應(yīng)的總線外設(shè)時鐘使能函數(shù)即可。
例如,如果我們要使能GPIOA,那么我們可以在頭文件 cks32f4xx_rcc.h 里面查看到宏定義標識符RCC_AHB1Periph_GPIOA掛載在AHB1總線之下,因此我們調(diào)用方式入如下:?
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
同理,如果我們要使能USART1的時鐘,那么我們調(diào)用的函數(shù)為:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
還有一類時鐘使能函數(shù)是時鐘源使能函數(shù),前面我們已經(jīng)講解過CKS32F4xx系列有5類時鐘源。這里我們列出來幾種重要的時鐘源使能函數(shù):
void RCC_HSICmd(FunctionalState NewState);
void RCC_LSICmd(FunctionalState NewState);
void RCC_PLLCmd(FunctionalState NewState);
void RCC_PLLI2SCmd(FunctionalState NewState);
void RCC_PLLSAICmd(FunctionalStateNewState);
void RCC_RTCCLKCmd(FunctionalState NewState);
具體調(diào)用方法如下:
RCC_PLLCmd(ENABLE);
第二類時鐘功能函數(shù):時鐘源選擇和分頻因子配置函數(shù)用來選擇相應(yīng)的時鐘源以及配置相應(yīng)的時鐘分頻系數(shù),比如配置HSI、HSE、PLL三個中的一個時鐘源為系統(tǒng)時鐘。以下為幾種時鐘源配置函數(shù):
void RCC_LSEConfig(uint8_t RCC_LSE);
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
void RCC_PCLK1Config(uint32_t RCC_HCLK);
void RCC_PCLK2Config(uint32_t RCC_HCLK);
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM,uint32_t PLLN, int32_t PLLP, uint32_t PLLQ);
比如我們要設(shè)置系統(tǒng)時鐘源為 HSI,則可以調(diào)用系統(tǒng)時鐘源配置函數(shù):
RCC_HCLKConfig(RCC_SYSCLKSource_HSI);
第三類外設(shè)復(fù)位函數(shù)如下:
void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);void RCC_AHB2PeriphResetCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);void RCC_AHB3PeriphResetCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
這類函數(shù)和前面講解的外設(shè)時鐘函數(shù)使用方法基本一致,不同的是一個是用來使能外設(shè)時鐘,一個是用來復(fù)位對應(yīng)的外設(shè)。對于這些時鐘操作函數(shù),我們就不一一列舉出來,大家可以打開 RCC 對應(yīng)的文件仔細了解。