OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4324|回复: 4

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

[复制链接]

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2016-6-14
在线时间
13 小时
发表于 2018-4-3 23:40:35 | 显示全部楼层 |阅读模式
1金钱
从说明书上看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);


}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-4-4 00:43:34 | 显示全部楼层
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2016-6-14
在线时间
13 小时
 楼主| 发表于 2018-4-6 16:04:23 | 显示全部楼层
问题解决了一部分,现在2和3的现象是一样的了,也就是
2.用HSE 8M,通过PLL使系统时钟拉到16M
3.不用HSE,就调用一个RCC_DeInit()函数
这两个现象是一样的,仔细读了一下data sheet ,VCO出来的频率要在100-432M之间,我之前是这样设置的:
     PLL_M=8;  
     PLL_N=32;   
     PLL_P=2;                  //sysclk=8M/8*32/2=16M
这样VCO出来是32M,肯定不行,现设置为:
    PLL_M=8;  
     PLL_N=128;   
     PLL_P=8;                  //sysclk=8M/8*128/8=16M
这样VCO出来的频率是128M。

但如果不用PLL,不用RCC_DeInit()函数,也就是时钟这块什么也不写,发现小灯闪烁要快很多,也就是说系统时钟要大于16M,不知道什么原因。
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2016-6-14
在线时间
13 小时
 楼主| 发表于 2018-4-6 18:22:52 | 显示全部楼层
本帖最后由 myblues 于 2018-4-6 18:24 编辑

原因似乎已找到,但不知道自己理解是否有误,在system_stm32f4xx.c文件中第313行中,如下:
/************************* PLL Parameters *************************************/
#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      25
#else /* STM32F411xE */
#if defined (USE_HSE_BYPASS)
#define PLL_M      8   

PLL_M被设置为25,将其改为8后效果三者完全一样,也就是说对时钟不作任何配置,仅将system_stm32f4xx.c中的PLL_M的值改为8后,系统的时钟也是168M.
如果不改,时钟的频率会低很多,不知道是不是低了25/8的倍数。

那也就是说,对时钟不作任何配置,也不修改system_stm32f4xx.c,那么system clock既不是16M,也不是168M了,时钟肯定用了PLL,但不知道其时钟源到底是外部HSE的8M,还是内部HSI的16M.
不知道我理解的是否正确,请指点....
回复

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2017-8-23
在线时间
23 小时
发表于 2018-4-7 02:59:39 | 显示全部楼层
是不是这样?
捕获.PNG
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 23:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表