1.系統時鐘樹:
LSI:低速內部時鐘(RC震盪器),32kHz,提供低功耗時鐘,用於看門狗和自動喚醒單元。
LSE:低速外部時鐘,外接32.768kHz的石英晶體,可用於RTC。
HSI:高速內部時鐘16MHz,RC振盪器,精度不高,可用作系統時鐘或PLL輸入。
HSE:高速外部時鐘4~26MHz,外接石英/陶瓷諧振器或外部時鐘源,可用作RTC或PLL或系統時鐘。
PLL:鎖相環倍頻輸出,包括主PLLCLK(生成高速系統時鐘216MHz和生成USB等的時鐘4PLL48CLK,48MHz)和專用PLLI2SR(生成精確時鐘,在I2S接口實現高品質音頻性能,PLLI2Q用作SAI時鐘。
總結:STM32有5個時鐘來源,HSI,HSE,LSI,LSE,PLL。 系統時鐘SYSCLK有3個時鐘來源,HSI,HSE和PLL。
STM32時鐘信號輸出MCO1(PA8)和MCO2(PA9),最大輸出不超過100MHz。任何一個外設在使用前必須使能相應的時鐘。
2.相關庫函數(stm32f7xx_hal_rcc.h)
a.時鐘初始化函數:
HAL_RCC_DeInit(void), HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct), HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency);
b.外設控制函數:
HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv);
HAL_RCC_EnableCSS(void); HAL_RCC_DisableCSS(void); HAL_RCC_GetSysClockFreq(void); HAL_RCC_GetHCLKFreq(void); HAL_RCC_GetPCLK1Freq(void); HAL_RCC_GetPCLK2Freq(void); HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct);
HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency);
HAL_RCC_NMI_IRQHandler(void); HAL_RCC_CSSCallback(void);
c.6個結構體:
RCC_OscInitTypeef; RCC_ClkInitTypeDef; RCC_PLLInitTypeDef; RCC_PLLI2SInitTypeDef; RCC_PLLSAIInitTypeDef;
RCC_PeriphCLKInitTypeDef;
啓動文件中運行main()之前,會先運行SystemInit( )進行系統時鐘的初始化默認配置。在stm32f7xx_hal_conf.h頭文件中定義了HSE_VALUE(25M),HSI_VALUE(16M),LSI_VALUE(32K),LSE_VALUE (32768),EXTERNAL_CLOCK_VALUE
3.系統時鐘配置
採用HSE(25MHz)作爲系統時鐘輸入,利用HSE分頻得到PLLCLK,並作爲系統時鐘(216MHz)
void Sysclk_config(){
RCC_OscInitTypeDef RCC_OscInitStruct; //外部晶振初始化結構體
RCC_ClkInitTypeDef RCC_ClkInitStruct; //CPU,AHB,APB等總線時鐘初始化結構體
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; //時鐘外設
__HAL_RCC_PWR_CLK_ENABLE(); //AHB時鐘使能
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; //選擇時鐘源爲HSE
RCC_OscInitStruct.HSEState = RCC_HSE_ON; //開啓HSE
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; //開啓PLL
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; //PLL時鐘來源爲HSE
RCC_OscInitStruct.PLL.PLLM = 25; //分頻係數M
RCC_OscInitStruct.PLL.PLLN = 432; //倍頻係數N
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; //分頻係數P,得到PLLCLK=216MHz
RCC_OscInitStruct.PLL.PLLQ = 9; ////分頻係數Q,用於產生USB時鐘PLLQ=48MHz
HAL_RCC_OscConfig(&RCC_OscInitStruct); //配置初始化
HAL_PWREx_EnableOverDrive(); //激活OVERDRIVE模式達到216MHz
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //時鐘源選擇PLLCLK=216MHz
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; //分頻係數AHBPRESC=1,得到HCLK=216MHz
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;//分頻係數APB1PRESC=4,得到APB1外設時鐘54MHz,定時器108MHz
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;//分頻係數APB2PRESC=2,得到APB2外設時鐘108MHz,定時器216MHz
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_6);//配置初始化
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1;
PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
PeriphClkInitStruct.TIMPresSelection=RCC_TIMPRES_ACTIVATED;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);//外設時鐘配置
//SYSTICK時鐘配置
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//選擇系統時鐘源216MHz
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); //1毫秒產生一次中斷
NVIC_SetPriority(SysTick_IRQn, 15); //配置優先級
}