微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > void SetSysClockToHSE(void)函数分析

void SetSysClockToHSE(void)函数分析

时间:10-02 整理:3721RD 点击:

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 */

  }  

}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top