困扰我已久的时钟问题!求大神解答!

2019-07-20 08:46发布

从说明书上看stm32f407的系统默认时钟为16M,我的理解如果在代码中不对时钟配置的话系统时钟应该就是16M吧?如果调用RCC_DeInit()函数,看了一下固件库中的说明:
Note:The default reset state of the clock configuration is given below:
  • HSI ON and used as system clock source
  • HSE, PLL and PLLI2S OFF
  • AHB, APB1 and APB2 prescaler set to 1.
  • CSS, MCO1 and MCO2 OFF
  • All interrupts disabled
This function doesn't modify the configuration of the
  • Peripheral clocks
  • LSI, LSE and RTC clocks

说明中系统时钟用的是HSI,也就是16M,这样代码中有RCC_DeInit()和没有RCC_DeInit()应该都是16M吧?
然后我使用外部晶振,用PLL倍频分频也将系统时钟配置为16M,但小灯的闪烁三者的时间不一样!不知道是为什么!!
1.没有时钟配置,小灯闪烁最快,用RCC_GetClocksFreq得到sysclk_frequency=53760000
2.用HSE 8M,通过PLL使系统时钟拉到16M,小灯闪烁比1慢一些,用RCC_GetClocksFreq得到sysclk_frequency=16000000
3.不用HSE,就调用一个RCC_DeInit()函数,按说系统时钟也应该是16M吧,但小灯闪烁最慢,用RCC_GetClocksFreq得到sysclk_frequency=16000000

实在是不明白!为了说明问题,把代码附上

#include "stm32f4xx.h"


void Clock_Config(void);  
void GPIO_Configuration(void);  
void delayms(vu16 ms);   
RCC_ClocksTypeDef  RCC_ClockFreq;

int main(void)  
{

//Clock_Config();  
        RCC_DeInit();   //这两句都注掉就是第1种时钟什么都不配置的情况,注上一句就是不用PLL,只调用RCC_DeInit()是第三种情况,上一句Clock_Config()不注释,把RCC_DeInit()注掉就是使用PLL用外部的8M晶振
       
GPIO_Configuration();

RCC_GetClocksFreq(&RCC_ClockFreq);
  while(1)
   {
    GPIO_SetBits(GPIOF,GPIO_Pin_9);  
    GPIO_SetBits(GPIOF,GPIO_Pin_10);     
    delayms(500);  
    GPIO_ResetBits(GPIOF,GPIO_Pin_9);
          GPIO_ResetBits(GPIOF,GPIO_Pin_10);
                delayms(500);
       
   }  
}


void GPIO_Configuration(void)  
{  
    GPIO_InitTypeDef    GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);        
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;      
    GPIO_Init(GPIOF, &GPIO_InitStructure);   
       

}   

void delayms(vu16 ms)  
{
   vu16 i;
   while(ms--)
   {
   i=6000;
   while(i--);
   }
}  

void Clock_Config(void){

          
     ErrorStatus        State;
     uint32_t           PLL_M;      
     uint32_t           PLL_N;
     uint32_t           PLL_P;
     uint32_t           PLL_Q;


     RCC_DeInit();
     RCC_HSEConfig(RCC_HSE_ON);

     while( RCC_WaitForHSEStartUp() != SUCCESS );

     PLL_M=8;  
     PLL_N=32;   
     PLL_P=2;                  //sysclk=8M/8*32/2=16M

     RCC_PLLConfig(RCC_PLLSource_HSE, PLL_M, PLL_N, PLL_P, PLL_Q);
     RCC_PLLCmd(ENABLE);

     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

     RCC_HCLKConfig(RCC_HCLK_Div1);

     RCC_PCLK1Config(RCC_HCLK_Div4);

     RCC_PCLK2Config(RCC_HCLK_Div2);


}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。