STM32 的一个典型的时钟配置程序(暨系统时钟笔记)

 

最近在玩STM32了,学的还不算太深入,不过感觉不错,不说别的, 这个是STM32的学习笔记在<<蒙博宇>>老师的书上的一个典型的时钟配置程序,

以上是官方资料汇总的时钟树结构,其中标注了时钟的一些限制条件.

/***************************************************
 * 函数名称 :RCC_Configuration          *输入 : void
 * 函数描述 : 为了熟悉是时钟配置 ,决定在原来的程序上加入自己的时钟配置函数 
 * 输出 : void
 * 注 : 
 *          函数 : RCC_WaitForHSEStartUp 为等待HSE起振知道HSE就绪或者在超时的情况下退出
 *  注2 : 已验证成功
 * ************************************************************************************/
void RCC_Configuration(void)
{
    ErrorStatus HSEStartUpStatus; //定义对与错的枚举类型
    RCC_DeInit();                   //复位系统时钟
    RCC_HSEConfig(RCC_HSE_ON);          //开启HSE(外部告诉振荡器)
    HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待启振
    /*判断是否起振成功,成功则进入if内部*/
    if (HSEStartUpStatus == SUCCESS) {
        RCC_HCLKConfig(RCC_SYSCLK_Div1); //选择AHB时钟源为SYSCLK 的1分频
        RCC_PCLK2Config(RCC_HCLK_Div1);     //选择PCLK2的是时钟源为AHB的1分频(实际就是把APB2的分频系数改为1)
        RCC_PCLK1Config(RCC_HCLK_Div2);     //选择PCLK1的时钟源为AHB的2分频(APB1分频系数为2)
        FLASH_SetLatency(FLASH_Latency_2);  //设置Flash延时周期数为2 (2级流水线技术)
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);   //使能Flash预取缓存
        /*选择PLL的时钟源为HSE2分频,倍频系数为 5, 则PLL=(25 / 2)*5=62.5MHz.*/
        RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_5);
        RCC_PLLCmd(ENABLE);//使能PLL
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL输出稳定
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);              //选择SYS时钟源为PLL
        while (RCC_GetSYSCLKSource() != 0x08);                  //等待PLL成为SYSCLK的时钟源
    }
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);       //打开APB2外设GPIOD的时钟
}

总的来说就是以SYSCLK为分界点,你要先让HSE或者HSI起振,并且等待其稳定,之后配置右边的HCLK,PCLK2和PCLK1,以及这些输出的是时钟,可以看到代码进入后,先配置了HCLK,这样APB1和APB2的输入源就确定了(配置HCLK实际上就是在设置AHB),之后的PCLK2和PCLK1也是如法炮制,在这开始配置PLL的源和PLL的倍频系数(如果使用PLL作为SYSCLK源的情况下,从时钟树中能够看出,SYSCLK的源可选项有三个),最后是使PLL成为SYSCLK的源.在函数的最后一行我们看见打开了APB2 的外设是时钟,从这里时钟走出了时钟树,因为对外设的结构还不清楚,以后在补.

posted on 2013-11-13 20:54  千樱硕  阅读(447)  评论(0)    收藏  举报

导航