static void SetSysClockToHSE(void) 函数功能:将HSE设置为SysClock static void SetSysClockToHSE(void) { __IO uint32_tStartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 andPCLK1 configuration ---------------------------*/ /* Enable HSE */ RCC->CR |=((uint32_t)RCC_CR_HSEON);//使能HSE /* Wait till HSE is readyand if Time out is reached exit */ do { HSEStatus = RCC->CR& RCC_CR_HSERDY; StartUpCounter++; } while((HSEStatus == 0)&& (StartUpCounter != HSE_STARTUP_TIMEOUT));//主要是延时使得//HSE就绪,这段程序当HSEStatus== 0和StartUpCounter!= HSE_STARTUP_TIMEOUT有一个//不满足时推出while循环,故这段程序结束后不能断定HSE已经就绪。需要在下面继续判//定。 if ((RCC->CR &RCC_CR_HSERDY) != RESET)//若相应标志位HSERDY不为0,则说明HSE已就//绪 { HSEStatus =(uint32_t)0x01; } else { HSEStatus =(uint32_t)0x00; } if (HSEStatus ==(uint32_t)0x01)//当HSE稳定以后 { #if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL&& !defined STM32F10X_HD_VL /* Enable Prefetch Buffer*/ FLASH->ACR |=FLASH_ACR_PRFTBE; /* Flash 0 wait state */ FLASH->ACR &=(uint32_t)((uint32_t)~FLASH_ACR_LATENCY); #ifndef STM32F10X_CL FLASH->ACR |=(uint32_t)FLASH_ACR_LATENCY_0; #else if (HSE_VALUE <=24000000) { FLASH->ACR |=(uint32_t)FLASH_ACR_LATENCY_0; } else { FLASH->ACR |=(uint32_t)FLASH_ACR_LATENCY_1; } #endif /* STM32F10X_CL */ #endif /* HCLK = SYSCLK */ RCC->CFGR |=(uint32_t)RCC_CFGR_HPRE_DIV1;//AHB预定标器不分频(若外部晶振为8M,//则HCLK=72M) /* PCLK2 = HCLK */ RCC->CFGR |=(uint32_t)RCC_CFGR_PPRE2_DIV1;//APB2预分频器不分频(若外部晶振为//8M,则PCLK2=72M) /* PCLK1 = HCLK */ RCC->CFGR |=(uint32_t)RCC_CFGR_PPRE1_DIV1; //APB1预分频器不分频(若外部晶振为//8M,则PCLK1=72M,但PCLK1最高频率是36M,这里怀疑程序有问题,应为RCC->CFGR|= //(uint32_t)RCC_CFGR_PPRE1_DIV2;) /* Select HSE as systemclock source */ RCC->CFGR &=(uint32_t)((uint32_t)~(RCC_CFGR_SW));//先将RCC_CFGR_SW清空 RCC->CFGR |=(uint32_t)RCC_CFGR_SW_HSE; //再将RCC_CFGR_SW置位 /* Wait till HSE is usedas system clock source */ while ((RCC->CFGR& (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x04)//延时等待稳定 { } } else { /* If HSE fails tostart-up, the application will have wrong clock configuration. Usercan add here some code to deal with this error */ } }
|