?
MCU微課堂
第一期 2022.12.10?
?
? ? 作為MCU運(yùn)行的基礎(chǔ),時(shí)鐘是單片機(jī)各個(gè)模塊工作時(shí)序的最小時(shí)間單位,推動(dòng)單片機(jī)的各指令執(zhí)行,是MCU選型的一個(gè)重要指標(biāo)。CKS32F4xx系列產(chǎn)品具有眾多的外設(shè),但并非所有的外設(shè)均需要系統(tǒng)時(shí)鐘的高頻率,并且高時(shí)鐘頻率將導(dǎo)致功耗增加、抗電磁干擾能力變?nèi)酰虼耍珻KS32F4xx系列產(chǎn)品內(nèi)部具備多個(gè)時(shí)鐘源。本文將對(duì)CKS32F4xx系列產(chǎn)品時(shí)鐘組成進(jìn)行分析,并講解該系統(tǒng)單片機(jī)的時(shí)鐘的配置方法,以能夠讓用戶(hù)更加簡(jiǎn)單的對(duì)系統(tǒng)時(shí)鐘進(jìn)行配置。
?
CKS32F4xx系列產(chǎn)品時(shí)鐘樹(shù)
?
? ? 在CKS32F4xx系列產(chǎn)品中,有HSI、HSE、LSI、LSE、PLL五個(gè)重要的時(shí)鐘源,其中PLL分為主PLL和專(zhuān)用PLL兩部分。從時(shí)鐘頻率來(lái)分可以分為高速時(shí)鐘源(HIS、HIS、PLL)和低速時(shí)鐘源(LSI、LSE);從來(lái)源可分為外部時(shí)鐘源(HSE、LSE)和內(nèi)部時(shí)鐘源(HIS、LSI、PLL)。
①:LSI是低速內(nèi)部RC振蕩器,頻率為32kHz。供獨(dú)立看門(mén)狗和RTC單元使用。
②:LSE是低速外部時(shí)鐘,接頻率為32.768kHz晶振。主要供RTC單元使用。
③:HSE是高速外部時(shí)鐘晶振輸入,頻率范圍為4MHz~26MHz。。
④:HSI是高速內(nèi)部RC振蕩器,頻率為16MHz。可以直接作為系統(tǒng)時(shí)鐘或者用作PLL輸入。
⑤:PLL為鎖相環(huán)倍頻輸出,有兩個(gè)PLL:
??? 1)主 PLL(PLL)由 HSE 或者 HSI 提供時(shí)鐘信號(hào),并具有兩個(gè)不同的輸出時(shí)鐘。
? ? ?其一PLLP用于生成高速的系統(tǒng)時(shí)鐘(最高 168MHz)
? ? 其二PLLQ用于生成 USB_OTG_FS(48MHz)、隨機(jī)數(shù)發(fā)生器SDIO時(shí)鐘。
??? 2)專(zhuān)用 PLL(PLLI2S)用于生成精確時(shí)鐘,用于實(shí)現(xiàn)I2S高品質(zhì)音頻性能。
?
?
CKS32F4xx系列系統(tǒng)時(shí)鐘配置
? ? 在CKS32F4xx系列固件庫(kù)system_cks32f4xx.c文件中定義了函數(shù)SystemInit(void),并在其中調(diào)用了SetSysClock()函數(shù)來(lái)配置系統(tǒng)關(guān)鍵時(shí)鐘寄存器,其處理流程如下:
? ? 先使能外部時(shí)鐘HSE,等待HSE穩(wěn)定之后,配置AHB、APB1、APB2時(shí)鐘相關(guān)的分頻因子;等待這些都配置完成之后,打開(kāi)主PLL時(shí)鐘并設(shè)置主PLL作為系統(tǒng)SYSCLK時(shí)鐘源。如果HSE不能達(dá)到就緒狀態(tài)則依然以HSI作為系統(tǒng)時(shí)鐘源頭。
? ? 在設(shè)置主PLL時(shí)鐘時(shí),需要設(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文件中定義,當(dāng)采用8MHz外部晶振時(shí),主PLL時(shí)鐘計(jì)算方法如下:
?
PLL?=?8MHz?*?PLL_N?/?(PLL_M?*?PLL_P)?=?8MHz?*?336?/(8?*?2)?=?168MHz
?
? ? 用戶(hù)可根據(jù)實(shí)際需求,根據(jù)SetSysClock函數(shù)內(nèi)的注釋進(jìn)行實(shí)際修改,可用的時(shí)鐘源配置宏定義位于cks32f4xx.h中,如RCC_CR_HSION、RCC_CR_HSEON等。
?
CKS32F4xx系列外設(shè)時(shí)鐘配置
?
? ? 在系統(tǒng)初始化之后,在使用部分外設(shè)時(shí),我們還需要根據(jù)外設(shè)需求修改某些時(shí)鐘源配置。在CKS32F4xx系列固件庫(kù)中,時(shí)鐘源的選擇以及時(shí)鐘使能等函數(shù)均在RCC相關(guān)固件庫(kù)文件 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個(gè)系統(tǒng)時(shí)鐘使能函數(shù)分別控制AHB1、AHB2、AHB3、APB1、APB2總線。要使能某個(gè)外設(shè),調(diào)用對(duì)應(yīng)的總線外設(shè)時(shí)鐘使能函數(shù)即可。
? ? 例如,如果我們要使能GPIOA,那么我們可以在頭文件 cks32f4xx_rcc.h 里面查看到宏定義標(biāo)識(shí)符RCC_AHB1Periph_GPIOA掛載在AHB1總線之下,因此我們調(diào)用方式入如下:?
?
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
?
? ? 同理,如果我們要使能USART1的時(shí)鐘,那么我們調(diào)用的函數(shù)為:
?
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
?
? ? 還有一類(lèi)時(shí)鐘使能函數(shù)是時(shí)鐘源使能函數(shù),前面我們已經(jīng)講解過(guò)CKS32F4xx系列有5類(lèi)時(shí)鐘源。這里我們列出來(lái)幾種重要的時(shí)鐘源使能函數(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);
?
? ? 第二類(lèi)時(shí)鐘功能函數(shù):時(shí)鐘源選擇和分頻因子配置函數(shù)用來(lái)選擇相應(yīng)的時(shí)鐘源以及配置相應(yīng)的時(shí)鐘分頻系數(shù),比如配置HSI、HSE、PLL三個(gè)中的一個(gè)時(shí)鐘源為系統(tǒng)時(shí)鐘。以下為幾種時(shí)鐘源配置函數(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)時(shí)鐘源為 HSI,則可以調(diào)用系統(tǒng)時(shí)鐘源配置函數(shù):
?
RCC_HCLKConfig(RCC_SYSCLKSource_HSI);
?
? ? 第三類(lèi)外設(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);
?
? ? 這類(lèi)函數(shù)和前面講解的外設(shè)時(shí)鐘函數(shù)使用方法基本一致,不同的是一個(gè)是用來(lái)使能外設(shè)時(shí)鐘,一個(gè)是用來(lái)復(fù)位對(duì)應(yīng)的外設(shè)。對(duì)于這些時(shí)鐘操作函數(shù),我們就不一一列舉出來(lái),大家可以打開(kāi) RCC 對(duì)應(yīng)的文件仔細(xì)了解。
?
審核編輯:湯梓紅
評(píng)論