项目上使用的是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 */
感谢同事的帮助,也希望知道原因的朋友看到该博客之后留言一下,说明一下这个的原因,感激!