lzh电子论坛

欢迎来到lzh电子论坛:
如果您对电子技术感兴趣就加入我们吧!在这里互相交流互相学习!主要讨论的方向有:单片机,ARM,PCB板设计,FPGA,汇编,C/C++等方面。
-----lzh电子论坛
lzhbbs.top-me.com
lzh电子论坛

电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...

欢迎访问lzh电子论坛。可通过【谷歌,SOSO,搜狗】搜索“lzh电子论坛”直接进入论坛。点击了解论坛详细制度


    有关于STM32系统时钟初始化

    分享
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 25

    有关于STM32系统时钟初始化

    帖子 由 Admin 于 2013-09-09, 1:17 pm

    在基于STM32的3.5版本库函数的开发应用中,其时钟初始化函数SystemInit()函数是在启动文件中被调用的,而且其调用是在Main()函数之前,所以说,如果不打算修改其默认的系统时钟(sysclk72M,AHB 72M,PCLK1  36M,PCLK2  72M,PLL 72M),在main函数中可以不添加系统时钟初始化函数SystemInit()函数,其在相应的函数文件中已经被设置好了。
        如果要对系统时钟进行重新设置,可以在main()函数中对其进行重新配置,也就回到了较早版本的ST开发库的应用之中,现举例如下:

    1、以外部高速晶振为时钟源

    void RCC_PLL_Configuration(void)
    {
      RCC_DeInit(); /*将外设RCC寄存器重设为缺省值 */
      RCC_HSEConfig(RCC_HSE_ON); /*设置外部高速晶振(HSE) HSE晶振打开(ON)*/

      if(RCC_WaitForHSEStartUp() == SUCCESS) {  /*等待HSE起振,  SUCCESS:HSE晶振稳定且就绪*/
      RCC_HCLKConfig(RCC_SYSCLK_Div1);   /*设置AHB时钟(HCLK) RCC_SYSCLK_Div1——AHB时钟 = 系统时*/
      RCC_PCLK2Config(RCC_HCLK_Div1);   /* 设置高速AHB时钟(PCLK2)RCC_HCLK_Div1——APB2时钟 = HCLK*/    
      RCC_PCLK1Config(RCC_HCLK_Div2); /*设置低速AHB时钟(PCLK1)RCC_HCLK_Div2——APB1时钟 = HCLK / 2*/    
      FLASH_SetLatency(FLASH_Latency_2);   /*设置FLASH存储器延时时钟周期数FLASH_Latency_2  2延时周期*/  
      FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  /*选择FLASH预取指缓存的模,预取指缓存使能*/
      RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_3);/*设置PLL时钟源及倍频系数*/  
      RCC_PLLCmd(ENABLE); /*使能PLL */
      while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; /*检查指定的RCC标志位(PLL准备好标志)设置与否*/  
      RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  /*设置系统时钟(SYSCLK) */
      while(RCC_GetSYSCLKSource() != 0x08);     /*0x08:PLL作为系统时钟 */  
    }
    }

    2.以内部高速晶振为时钟源(可在外部晶振损坏时采用,精度稍低,之前有同志问到过这个问题,现在此给出

    void RCC_HSI_Configuration(void){
       RCC_DeInit(); /*将外设RCC寄存器重设为缺省值 */
      RCC_HSICmd(ENABLE);
      while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)== RESET);//等待HSI就绪
      RCC_HCLKConfig(RCC_SYSCLK_Div1);
      RCC_PCLK2Config(RCC_HCLK_Div1);
      RCC_PCLK1Config(RCC_HCLK_Div2);
      FLASH_SetLatency(FLASH_Latency_2);
      FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
      RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
     while(RCC_GetSYSCLKSource() != 0x00);     /*0x00:HSI作为系统时钟 */
    }

      目前的日期/时间是2018-02-20, 11:30 am