Chinaunix首页 | 论坛 | 博客
  • 博客访问: 805682
  • 博文数量: 281
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2770
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-02 19:45
个人简介

邮箱:zhuimengcanyang@163.com 痴爱嵌入式技术的蜗牛

文章分类
文章存档

2020年(1)

2018年(1)

2017年(56)

2016年(72)

2015年(151)

分类: 嵌入式

2016-08-28 20:27:06

STM32上电默认时钟内部8MHZ,经过库函数SystemInit的初始化,设置成启用外部晶振模式,并设为系统时钟为PLL倍频后的时钟:72MHZ.
    * SYSCLK 72MHz
    * AHB 72MHz
    * PCLK1 36MHz
    * PCLK2 72MHz
    * PLL 72MHz

但是用户可以自己选择使用不同时钟,下面给出了几个函数。
可以配置成内部时钟或者外部时钟。


/*
 * 寄存器的方式设置系统时钟:
 * 输入PLL倍频因子,输入PLL的倍频值2—16倍频(注意:不同的芯片有不同的倍频因子)
 * HCLK = PLLCLK=SYSCLK=P2CLK=P1CLK*2=ADCCLK*2=TIMCLK=USBCLK*2/3
 *
 */
void HSE_SetPLL(u8 PLL)//
{
       unsigned char temp=0;  
       
       RCC_DeInit();         //将RCC寄存器重新设置为默认值

       RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
       while(!(RCC->CR>>17));//等待外部时钟就绪

       RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
       PLL-=2;//抵消2个单位

       RCC->CFGR|=PLL<<18;   //设置PLL倍频值 2~16
       RCC->CFGR|=1<<16;     //PLL时钟源选择
       FLASH->ACR|=0x32;     //FLASH 2个延时周期
       RCC->CR|=0x01000000;  //PLLON
       while(!(RCC->CR>>25));//等待PLL锁定
       
       RCC->CFGR|=0x00000002;//PLL作为系统时钟      
       while(temp!=0x02)     //等待PLL作为系统时钟设置成功
       {  
              temp=RCC->CFGR>>2;
              temp&=0x03;
       }   
}           



//RCC_HSE_Configuration函数设置HSE作为PLL的时钟源,不设置的话在main函数执行前执行了SystemInit函数
/*************************************
* 使用外部晶振:8MHZ, 最大可以配置到72MHZ
* 执行SystemInit函数后芯片内部时钟为:
    * SYSCLK 72MHz
    * AHB 72MHz
    * PCLK1 36MHz
    * PCLK2 72MHz
    * PLL 72MHz
**************************************/
void RCC_HSE_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
        
        /* 下面两句话不加的话,不能配置成72Mhz */
        FLASH_SetLatency(FLASH_Latency_2);//设置FLASH存储器延时时钟周期数FLASH_Latency_2 2延时周期
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//选择FLASH预取指缓存的模,预取指缓存使能

        // 设置系统时钟为:外部晶振时钟 * RCC_PLLMul_9 / RCC_PLLSource_HSE_Div1 = 8MHZ * 9 / 1 = 72MHZ
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//设置PLL时钟源及倍频系RCC_PLLConfig(外部时钟分频因子,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作为系统时钟
    }
}



/*************************************
* 使用内部晶振:8MHZ,内部最大可以配置到64MHZ
* 执行SystemInit函数后芯片内部时钟为:
    * SYSCLK 72MHz
    * AHB 72MHz
    * PCLK1 36MHz
    * PCLK2 72MHz
    * PLL 72MHz
  
**************************************/
void RCC_HSI_Configuration(void)
{
    RCC_DeInit();//将外设 RCC寄存器重设为缺省值

    RCC_HSICmd(ENABLE);//使能HSI  
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)//等待HSI使能成功
    {
    }

    if(1)
    {
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
        FLASH_SetLatency(FLASH_Latency_2);
        
        RCC_HCLKConfig(RCC_SYSCLK_Div1);   
        RCC_PCLK1Config(RCC_HCLK_Div2);
        RCC_PCLK2Config(RCC_HCLK_Div1);

        //设置 PLL 时钟源及倍频系数
        /*
         * RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_4);  // 结果导致:PLL系统时钟为:8M / 2 * 4 = 16MHZ
         * RCC_PLLSource_HSI_Div2: 分频系数,内部时钟为8MHZ,经过2分频 = 8MHZ/2 = 4MHZ
         * RCC_PLLMul_4: PLL倍频因子,表示倍频4倍
         *
         */
        RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);
        
        //使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE
        RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能
        
        //等待指定的 RCC 标志位设置成功 等待PLL初始化成功
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {
        }

        //设置系统时钟(SYSCLK) 设置PLL为系统时钟源
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  
        
        //等待PLL成功用作于系统时钟的时钟源
        //  0x00:HSI 作为系统时钟
        //  0x04:HSE作为系统时钟
        //  0x08:PLL作为系统时钟  
        while(RCC_GetSYSCLKSource() != 0x08)
        {
        }
    }
}
阅读(2746) | 评论(0) | 转发(0) |
0

上一篇:CFI接口

下一篇:etc/fstab 文件详解

给主人留下些什么吧!~~