stm32f107使用外部16MHz晶振

项目上使用的是16MHz的外部晶振,在stm32f107板子上进行跑程序,现在遇到的问题就是在工程里,采用

http://www.360doc.com/content/15/0813/16/18490038_491413356.shtml

该篇文章的博客进行修改的时候,到第二步的修改SetSysClockTo72()函数中的时钟2分频的时候发现与博客中的不同的是:

博客中的#ifdef STM32F10X_CL是没有定义的,所以执行#else的部分,添加RCC_CFGR_PLLXTPRE_HSE_Div2宏定义进行2分频的时候即可完成第二步的修改;

而我自己的工程里的代码执行的是#ifdef STM32F10X_CL这部分的代码,因此我想那这应该是宏定义的问题,于是我搜索该宏相关的定义,发现下面代码是相关的:

#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) 
  /* #define STM32F10X_LD */     /*!< STM32F10X_LD: STM32 Low density devices */
  /* #define STM32F10X_LD_VL */  /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  
  /* #define STM32F10X_MD */     /*!< STM32F10X_MD: STM32 Medium density devices */
  /* #define STM32F10X_MD_VL */  /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
  /* #define STM32F10X_HD */     /*!< STM32F10X_HD: STM32 High density devices */
  /* #define STM32F10X_HD_VL */  /*!< STM32F10X_HD_VL: STM32 High density value line devices */  
  /* #define STM32F10X_XL */     /*!< STM32F10X_XL: STM32 XL-density devices */
  /* #define STM32F10X_CL*/      /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif

可是令我疑惑的是,STM32F10X_CL的宏定义是注释的,且#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)这个条件也是满足的,也就是说我程序中并没有定义STM32F10X_CL宏或者是在其他地方定义了,于是我打开keil的配置工具Options for Target xxx 菜单下的C/C++,也并没有该宏的定义,我很纳闷啊,感觉好悬啊!

后来一同事帮助我,说应该是STM32F107这个芯片的属性与其他的STM32系列的有些不同,好像工程中会自动定义了STM32F10X_CL(尽管我的代码和配置中并没有定义),可能是建立工程时进行芯片选型的时候就关联了吧,当然这也纯属猜测,具体的原因我们也无法确定。

除此之外,同事还提供了他以前使用stm32f107使用对使用16MHz的外部晶振时钟的配置,这些配置是经过他测试的,同样也是在SetSysClockTo72()中,我们不去纠结是否和链接中博客的那样对#else部分进行修改,我们修改的是#ifdef STM32F10X_CL这部分的代码,首先注释掉该执行条件下的所有语句,然后添加我们自己的配置,以此来实现第二部分代码的修改:

#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
/* -----------------------------changed by Mabel.-----------------------------*/        
//    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 ); 

	RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                         RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLSRC_PREDIV1 |   RCC_CFGR_PLLMULL9);  


/* -----------------------------changed by Mabel.-----------------------------*/        

#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 */

感谢同事的帮助,也希望知道原因的朋友看到该博客之后留言一下,说明一下这个的原因,感激!

你可能感兴趣的:(STM32)