void SetSysClockToHSE(void)函数分析
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 */
}
}