如果你恰巧使用STM32F105/107系列芯片,如果你恰巧不使用USB OTG或以太网外设,如果你又恰巧外部晶振焊上了8M的;
好吧,你需要做一些改动才能正确的使用标准外设库:
STM32F105/107库函数默认使用的是25MHZ晶振,所以在system_stm32f10x.c中初始化时钟的代码为:
/* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz
RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
如果使用的是8MHZ晶振,就应该这样配置了:
/* PLL2 configuration: PLL2CLK = (HSE / 8) * 8= 8 MHz */
/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 1 = 8 MHz */
RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV8| RCC_CFGR2_PLL2MUL8 |
RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV1);
要注意的是上面的代码仅适用于系统时钟设置成72M时的情况;如果是其它频率请根据以上的原理自行修改!
这样改下来时钟配置似乎正确了,但还有一个问题是,标准库中要让获取总线时钟的函数得到正确的
时钟频率值需要在stm32f10x.h文件中的HSE_VALUE从25M改为8M!
#if !defined HSE_VALUE
#ifdef STM32F10X_CL
#define HSE_VALUE ((uint32_t)8000000) /*此处将原来的25改为8 */
#else
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
|
|