OpenEdv-开源电子网

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

stm32系统时钟的问题!请高手讲解

[复制链接]

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-7-9
在线时间
9 小时
发表于 2016-8-17 16:06:40 | 显示全部楼层 |阅读模式
3金钱
我使用的stm32的开发板,32正常使用是72MHZ。

        SystemInit();这是系统时钟初始化,在工程里写于不写这句代码,有很大的差别,为什么啊?战舰的板子我看资料上好像不用写,但我朋友用的就写了,他的不是战舰的资料。


        这是什么原因啊?

        还有我想问一下在哪个文件里设置的系统时钟啊?很多 #define  我没看懂。要是跑36MHZ该怎么设置呢?

        请高手指点,非常感谢!

最佳答案

查看完整内容[请看2#楼]

必须要写的,库函数版本。我们例程的话,在.s文件就调用了这个函数,所以在main函数无需再次调用。你朋友估计是调用了2次,或者.s没有调用。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-17 16:06:41 | 显示全部楼层
必须要写的,库函数版本。我们例程的话,在.s文件就调用了这个函数,所以在main函数无需再次调用。你朋友估计是调用了2次,或者.s没有调用。
回复

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-7-9
在线时间
9 小时
 楼主| 发表于 2016-8-18 07:49:38 | 显示全部楼层
正点原子 发表于 2016-8-17 16:06
必须要写的,库函数版本。我们例程的话,在.s文件就调用了这个函数,所以在main函数无需再次调用。你朋友估 ...

那我跑36MHZ,该怎么去改呢?
还有系统时钟的代码是在那确定是72MHZ的?
请指点,谢谢!
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-8-22
在线时间
3 小时
发表于 2016-8-22 17:08:31 | 显示全部楼层
是啊,库函数版本怎样设置pll的倍频参数啊,我也在找这个问题
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-8-22
在线时间
3 小时
发表于 2016-8-22 17:30:10 | 显示全部楼层
寄存器版本可以设置Stm32_Clock_Init(6);,库函数版本怎么设置?正点原子哥
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-8-22
在线时间
3 小时
发表于 2016-8-22 17:31:47 | 显示全部楼层
我想在库函数版本中通过倍频来设置,怎么弄?
回复

使用道具 举报

2

主题

194

帖子

0

精华

高级会员

Rank: 4

积分
981
金钱
981
注册时间
2015-9-20
在线时间
148 小时
发表于 2016-8-22 18:15:51 | 显示全部楼层
去看看自己光盘资料里面的STM32参考资料->STM32中文参考手册V10.PDF->61页6.3.2时钟配置寄存器RCC->CFGR,根据自己外部时钟或者内部时钟源,进行倍频得到,当然相应的还得设置RCC->CR寄存器
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-8-22
在线时间
3 小时
发表于 2016-8-23 13:25:20 | 显示全部楼层
杏帘在望 发表于 2016-8-22 18:15
去看看自己光盘资料里面的STM32参考资料->STM32中文参考手册V10.PDF->61页6.3.2时钟配置寄存器RCC->CFGR, ...

已经搞定了,在SetSysClockTo72(void)这个函数中#else   
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);
更改RCC_CFGR_PLLMULL6,我的hse是12M的,默认这个地方是RCC_CFGR_PLLMULL9,如果你的hse是8M的话,可以在这个更改,也可以更改#define SYSCLK_FREQ_72MHz  72000000,这个宏定义,将72000000更改为你想要的频率,我的板子是自己弄的,所以只能倍频6,这样主频是72M,我是个新手,希望能够帮到和我一样的新手。
回复

使用道具 举报

2

主题

194

帖子

0

精华

高级会员

Rank: 4

积分
981
金钱
981
注册时间
2015-9-20
在线时间
148 小时
发表于 2016-8-24 08:36:35 | 显示全部楼层
hwchen 发表于 2016-8-23 13:25
已经搞定了,在SetSysClockTo72(void)这个函数中#else   
    /*  PLL configuration: PLLCLK = HSE *  ...

恭喜恭喜~~~~~~~~~~~~
回复

使用道具 举报

0

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2016-8-21
在线时间
44 小时
发表于 2016-8-24 09:04:23 | 显示全部楼层
void RCC_HSE_Configuration(void) //HSE×÷ÎaPLLê±Öó£&#172LL×÷ÎaSYSCLK
{
   RCC_DeInit(); /*½«íaéèRCC¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ */
   RCC_HSEConfig(RCC_HSE_ON);          /*éèÖÃía2¿¸ßËù¾§Õñ£¨HSE£© HSE¾§Õñ′ò¿a(ON)*/

   if(RCC_WaitForHSEStartUp() == SUCCESS) {  /*μè′yHSEÆeÕñ,  SUCCESS£oHSE¾§ÕñÎ趨Çò¾íD÷*/  

   RCC_HCLKConfig(RCC_SYSCLK_Div1);/*éèÖÃAHBê±Öó(HCLK)RCC_SYSCLK_Div1¡a¡aAHBê±Öó = Ïμí3ê±*/  
   RCC_PCLK2Config(RCC_HCLK_Div1); /*éèÖøßËùAHBê±Öó(PCLK2)RCC_HCLK_Div1¡a¡aAPB2ê±Öó = HCLK*/     
   RCC_PCLK1Config(RCC_HCLK_Div2); /*éèÖÃμíËùAHBê±Öó(PCLK1)RCC_HCLK_Div2¡a¡aAPB1ê±Öó = HCLK / 2*/      

   RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/*éèÖ&#195LLê±ÖóÔ′¼°±¶ÆμÏμêy*/   
   RCC_PLLCmd(ENABLE);          /*ê1ÄüPLL */
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; /*¼ì2éÖ¸¶¨μÄRCC±ê־λ(PLL×¼±¸oñêÖ¾)éèÖÃóë·ñ*/
   
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  /*éèÖÃÏμí3ê±Öó£¨SYSCLK£© */  
   while(RCC_GetSYSCLKSource() != 0x08);     /*0x08£oPLL×÷ÎaÏμí3ê±Öó */            
}
}
回复

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-7-9
在线时间
9 小时
 楼主| 发表于 2016-8-24 16:43:57 | 显示全部楼层
杏帘在望 发表于 2016-8-22 18:15
去看看自己光盘资料里面的STM32参考资料->STM32中文参考手册V10.PDF->61页6.3.2时钟配置寄存器RCC->CFGR, ...

static void SetSysClock(void);

#ifdef SYSCLK_FREQ_HSE
  static void SetSysClockToHSE(void);
#elif defined SYSCLK_FREQ_24MHz
  static void SetSysClockTo24(void);
#elif defined SYSCLK_FREQ_36MHz
  static void SetSysClockTo36(void);
#elif defined SYSCLK_FREQ_48MHz
  static void SetSysClockTo48(void);
#elif defined SYSCLK_FREQ_56MHz
  static void SetSysClockTo56(void);  
#elif defined SYSCLK_FREQ_72MHz
  static void SetSysClockTo72(void);
#endif

#ifdef DATA_IN_ExtSRAM
  static void SystemInit_ExtMemCtl(void);
#endif /* DATA_IN_ExtSRAM */




static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;   


    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
   
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
  
    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }
   
   
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
                            RCC_CFGR_PLLMULL9);
#else   
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
   
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }
}
#endif


这好几个宏定义,是运行的哪个啊?在哪里判读?请指点一下,我基础不好,多谢!
回复

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-7-9
在线时间
9 小时
 楼主| 发表于 2016-8-24 16:44:47 | 显示全部楼层
正点原子 发表于 2016-8-17 16:06
必须要写的,库函数版本。我们例程的话,在.s文件就调用了这个函数,所以在main函数无需再次调用。你朋友估 ...

static void SetSysClock(void);

#ifdef SYSCLK_FREQ_HSE
  static void SetSysClockToHSE(void);
#elif defined SYSCLK_FREQ_24MHz
  static void SetSysClockTo24(void);
#elif defined SYSCLK_FREQ_36MHz
  static void SetSysClockTo36(void);
#elif defined SYSCLK_FREQ_48MHz
  static void SetSysClockTo48(void);
#elif defined SYSCLK_FREQ_56MHz
  static void SetSysClockTo56(void);  
#elif defined SYSCLK_FREQ_72MHz
  static void SetSysClockTo72(void);
#endif

#ifdef DATA_IN_ExtSRAM
  static void SystemInit_ExtMemCtl(void);
#endif /* DATA_IN_ExtSRAM */




static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;   


    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
   
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
  
    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }
   
   
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
                            RCC_CFGR_PLLMULL9);
#else   
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
   
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }
}
#endif


这好几个宏定义,是运行的哪个啊?在哪里判读是72MHz?请指点一下,我基础不好,多谢!
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-8-22
在线时间
3 小时
发表于 2016-8-26 10:14:19 | 显示全部楼层
在system_stm3210x.c中的115行
#define SYSCLK_FREQ_72MHz  72000000
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-8-22
在线时间
3 小时
发表于 2016-8-26 10:16:20 | 显示全部楼层
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000
你如果想用其他的,把#define SYSCLK_FREQ_72MHz  72000000注释掉
然后把上面你想要的取消注释就可以了
譬如:#define SYSCLK_FREQ_36MHz  36000000
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 14:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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