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