5.HAL库之时钟系统及定时器SYSTICK

1.系统时钟树:

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时钟。

5.HAL库之时钟系统及定时器SYSTICK_第2张图片             5.HAL库之时钟系统及定时器SYSTICK_第3张图片

 

5.HAL库之时钟系统及定时器SYSTICK_第4张图片

 

总结: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)

5.HAL库之时钟系统及定时器SYSTICK_第5张图片

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);  //配置优先级
}

 

 

                    

你可能感兴趣的:(STM32F7之HAL库学习)