5.HAL庫之時鐘系統及定時器SYSTICK

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);  //配置優先級
}

 

 

                    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章