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

2019-08-16来源: eefocus关键字: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);  //配置优先级

}



关键字:HAL库  时钟系统  定时器  SYSTICK

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471318.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:3.STM32F4蜂鸣器
下一篇:6.中断优先级分组NVIC

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

使用stm32的HAL库完成pwm输入模式测量频率和占空比的详细教程

。 然后使能TIM2的中断接下来添加代码:main.c 中开启捕获中断    /* USER CODE BEGIN 2 */    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);//如果不需要占空比和频率数据就只开通道2即可。第一次的数据是不正确的,实际工作中要将第一次的数据丢弃    /* USER CODE END 2 */      
发表于 2019-08-21
使用stm32的HAL库完成pwm输入模式测量频率和占空比的详细教程

16.HAL库之SPI和QSPI

沿进行数据变化。DDR模式:在该模式下,指令阶段在SCLK下降沿发送数据,而在地址,交替字节,数据阶段在SCLK上升沿和下降沿均发送数据。双闪存模式:使用两个外部SPI四线,可将flash扩大一倍。QSPI配置:时钟使能,管脚定义,QSPI配置,flash初始化,QSPI读/写函数定义。void Qspi_Config(){ __HAL_RCC_QSPI_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); Flash_GPIO.Pin=GPIO_PIN_2; Flash_GPIO.Mode=GPIO_MODE_AF_PP
发表于 2019-08-16
16.HAL库之SPI和QSPI

HAL库之485+DMA通信(STM32F746)

(uint32_t bound){  __HAL_RCC_GPIOD_CLK_ENABLE();  __HAL_RCC_USART2_CLK_ENABLE();   GPIO_InitTypeDef GPIO_Init2;   GPIO_Init2.Pin = GPIO_PIN_4;              //485_RTS  GPIO_Init2.Mode =GPIO_MODE_OUTPUT_PP;  GPIO_Init2.Pull = GPIO_NOPULL;  GPIO_Init2.Speed
发表于 2019-08-16
HAL库之485+DMA通信(STM32F746)

15-HAL库之定时器学习

RepetitionCounter;   //重复计数,高级控制定时器所用   uint32_t AutoReloadPreload;   //自动预装载值}TIM_Base_InitTypeDef;应用例子如下:#include "basic_tim.h"TIM_HandleTypeDef Basic_Tim6;void Basic_Tim_Config(void){ HAL_TIM_Base_MspInit(&Basic_Tim6); __HAL_RCC_TIM6_CLK_ENABLE(); Basic_Tim6.Instance=TIM6
发表于 2019-08-16
15-HAL库之定时器学习

14-HAL库之I2C通信

发送停止传输信号P。读数据时,主机向从机发应答信号,当主机希望停止接收数据时,发送非应答信号。起始信号和停止信号见上图。数据有效性见上图。2.基于HAL库的I2C配置步骤:时钟使能—GPIO管脚配置—I2C配置初始化:void MyI2C_Init(void){ __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_6;  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;  GPIO_InitStruct.Pull
发表于 2019-08-16
14-HAL库之I2C通信

13-HAL库DMA系统总结

。2.DMA相关函数解析关于DMA,ST官方提供了HAL库(封装函数)和LL库(直接操作寄存器)。和GPIO定义类似,需要先使能相关时钟,定义句柄结构体DMA_HandleTypeDef mydma2,随后进行DMA的各项配置,最后进行初始化。typedef struct __DMA_HandleTypeDef{    DMA_Stream_TypeDef          *Instance;                       
发表于 2019-08-16
13-HAL库DMA系统总结

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved