stm32时钟系统的意义:
1、电源的开关作用,达到低功耗效果;
2、调节时钟的速度;
对于每个外设,都要设置设置,stm32的时钟系统为了更低功耗;
STM32时钟系统框图分析:
时钟源:
时钟是STM32的脉搏,是驱动源。使用任何一个外设都必须打开相应的时钟。这样的好处就是,如果不是用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果;
stm32的时钟可以有以下4个时钟源提供:
1、HSI:高速内部时钟信号stm32单片机内带的时钟(8M频率),缺点是精度较差;
2、HSE:高速外部时钟信号,精度高 来源:(1)、外部晶振 (2)、HSE用户外部时钟;
3、LSE:低速外部晶振 32.768khz主要提供一个精准的时钟源,一般作为RTC时钟使用;
4、LSI:内部低速时钟,提供独立看门狗,也可以给RTC;
STM32将时钟信号(例如HSE)经过分频或倍频(PLL)后,得到系统时钟,系统时钟经过分频,产生外设所使用的时钟;
RCC设置流程:
1、将RCC寄存器重新设置为默认值 RCC_DeInit
2、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON)
3、等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp();
4、设置AHB时钟 RCC_HCLKConfig
5、设置高速APB时钟 RCC_PCLK2Config
6、设置低速APB时钟 RCC_PCLK1Config
7、设置PLL RCC_PLLConfig
8、打开PLL RCC_PLLCmd(ENABLE)
9、等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)
10、设置系统时钟 RCC_SYSCLOCKConfig
11、判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource()!=0x08)
12、打开要使用的外设时钟 RCC_APB2PerphClockCmd()/RCC_APB1PeriphClockCmd()
实例:
1 /******************************************************************************* 2 * Function Name : RCC_Configuration 3 * Description : Configures the different system clocks. 4 * Input : None 5 * Output : None 6 * Return : None 7 *******************************************************************************/ 8 void RCC_Configuration(void) 9 { 10 /*------使用外部RC晶振----------*/ 11 RCC_DeInit(); //时钟默认初始化 12 RCC_HSEConfig(RCC_HSE_ON);//使能外部的高速时钟 13 while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);//等待外部的高速时钟就绪 14 15 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能指令预存取 16 FLASH_SetLatency(FLASH_Latency_2); //等待两个周期 17 18 RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟为系统时钟 19 RCC_PCLK2Config(RCC_HCLK_Div1); //设置APB2时钟为AHB时钟 20 RCC_PCLK1Config(RCC_HCLK_Div2); //设置APB1时钟为AHB/2时钟 21 //以下3行是PLL的设置 22 RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //设置PLL时钟为外部高速时钟的9倍频 23 RCC_PLLCmd(ENABLE); //使能PLL时钟 24 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL时钟使能就绪 25 //选择为PLL的CLOCK 26 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置PLL时钟为系统时钟 27 while(RCC_GetSYSCLKSource()!=0x08); //等待PLL时钟作为系统时钟 28 29 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC); 30 RCC_APB1PeriphClockCmd(RCC_APB1Periph_UASRT3,ENABLE); 31 }
RTC模块:
RTC(Real_Time Clock)实时时钟;
实时时钟是一个独立的定时器,RTC模块拥有一组连续计数的计数器,在相应软件的配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期;
RTC由两个主要部分组成。第一部分(APB1接口)用来和APB1总线相连。此单元包含一组16位寄存器,可通过APB1总线对其进行读写操作。APB1接口以APB1总线时钟为时钟;
另一部分(RTC核)由一系列可编程计数器组成,分成两个主要模块;
第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK,RTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。在每个TR_CLK周期中,如果在RTC_CR寄存器中设置了相应允许位,则RTC产生一个中断(秒中断)
第二个模块是一个32位的可编程的计数器,它可以被初始化为当前的系统时钟时间。系统时间以TR_CLK速度增长并与存储在RTC_ALR寄存器中的可编程的时间相比较,如果RTC_CR控制寄存器设置了相应允许为则比较匹配时将产生一个闹钟中断;
RTC主要特性: