STM32 时钟 系统时钟 配置 与 时钟树解析

来源:互联网 发布:如何成为算法工程师 编辑:程序博客网 时间:2024/04/28 22:32

复位与时钟控制器(Reset Clock Controller)缩写

转自:http://hi.baidu.com/acmbuguake/item/28561e0342303fc31ef04677

 

             在STM32中,有五个时钟源,分别是为HSI、HSE、LSI、LSE、PLL。

             HSI内部高速RC振荡时钟,8MHz;HSE,外部高速时钟,4M__16MHZ;LSI,内部低速RC 时钟,40KHZ;LSE外部低速时钟,32.768KHz;PLL锁相环倍频,由图可知,可以选择HSE/2、HSI/2、HSE,倍频系数可以是2——16,但是不要超过72MHz。

            SYSCLK系统时钟,由图可知可以选择HSE、HSI、 PLLCLK的一种,最高72MHz,通过AHB分频器后送给各个模块,AHB分频可以选择1、2、4、8、16、 64、128、 256 、512,AHB分频后送给5大模块使用。

   1 HCLK ,也就是AHB总线、内核、内存和DMA使用的HCLK时钟

           2   通过8分频后送给Cortex的系统定时器时钟

          3    直接送给Cortex的空闲运行时钟FCLK

          4   送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路   定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用

          5 送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频

 

               注意定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供的。连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。

 

                              配上一个简单的自己的时钟配置程序,使用库函数。

 

void RCC_Configuration(void)//时钟配置
{
 ErrorStatus HSEStartUpStatus;//判断标志变量
 
 RCC_HSEConfig(RCC_HSE_ON);//使用外部时钟
 HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部时钟稳定
 if(HSEStartUpStatus== SUCCESS)//如果外部晶振启动成功
 {
    RCC_HCLKConfig(RCC_SYSCLK_Div1);//HCLK(AHB时钟)值等于系统时钟
  RCC_PCLK1Config(RCC_HCLK_Div2);//PCLK1(APB1时钟)值等于HCLK的一半,最高不超过36MHz
  RCC_PCLK2Config(RCC_HCLK_Div1);//PCLK2(APB2时钟)值等于HCLK,最高可是72MHz
  FLASH_SetLatency(FLASH_Latency_2);//FLASH时序控制,SYSCLK0~24MHz Latency=0.SYSCLK25~48MHz Latency =1.SYSCLk 48~72MHz  Latency=2
  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//开启FLASH预取指功能
  RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//HSE提供系统时钟,9倍频,也就是72MHz
  RCC_PLLCmd(ENABLE);//启动PLL
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//等待PLL稳定
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//系统时钟来自PLL输出
  while(RCC_GetSYSCLKSource()!=0x08);//等待系统时钟稳定
 }
}


0 0
原创粉丝点击