STM32F1 的内部高速(HSI)晶振为8MHz,最大可调整系统时钟为64MHz
修改在SystemInit (void)中被调用的SetSysClock()函数。
/* If none of the define above is enabled, the HSI is used as System clock
source (default after reset) */
在外部晶振失效时,系统也是可以工作的,此时的系统时钟是8MHZ,此时外设时钟需要更改相应配置。
原工程配置72M时钟,定义了SYSCLK_FREQ_72MHz,
第一步注释SYSCLK_FREQ_72MHz,增加 SYSCLK_FREQ_64MHz
第二步增加SetSysClockTo64();函数
(1)
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
#define SYSCLK_FREQ_24MHz 24000000
#else
/* #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_64MHz 64000000 //HSI(内部高速时钟最大速度)
#endif
(2)
static void SetSysClockTo64()
{
__IO uint32_t HSIStartUpStatus = 0;
HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;
if (HSIStartUpStatus == RCC_CR_HSIRDY)
{
/* 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;
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while (RCC_GetSYSCLKSource() != 0x08){
}
}else{
while (1){}
}
}
(3)
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
SetSysClockTo56();
#elif defined SYSCLK_FREQ_72MHz
SetSysClockTo72();
#elif defined SYSCLK_FREQ_64MHz
SetSysClockTo64();
#endif
/* If none of the define above is enabled, the HSI is used as System clock
source (default after reset) */
}