STM32F103 使用HSI配置系统时钟为64MHZ

本文介绍了一种设置系统时钟频率至64MHz的方法,并详细配置了HCLK、PCLK2及PCLK1的预分频器。文中特别强调了此功能仅应在复位后使用,并对HSI作为OCS的情况进行了说明。
/**
  * @brief  Sets System clock frequency to 64MHz and configure HCLK, PCLK2 
  *         and PCLK1 prescalers. 
  * @note   OCS is HSI. This function should be used only after reset.
  * @param  None
  * @retval None
  */
void SetSysClockTo64Mhz(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
    RCC_DeInit();
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
  /* Enable HSI */    
  RCC->CR |= ((uint32_t)RCC_CR_HSION);
 
  /* Wait till HSI is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSIRDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  
  if (HSEStatus == (uint32_t)0x01)
  {
    /* 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;    
 
    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
    
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
  
    /*  PLL configuration: PLLCLK = HSI/2 * 16 = 64 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2| RCC_CFGR_PLLMULL16);

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;
    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
    
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    
    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock 
         configuration. User can add here some code to deal with this error */
  }
}

STM32F103系列单片机中,HSI是内部高速的时钟信号,频率为8MHz,PLL时钟来源可以是HSI/2,具体由时钟配置寄存器CFGR的位16(PLLSRVC)设置[^2]。STM32F103系列单片机的最高系统时钟频率为72MHz。当使用HSI作为PLL时钟源时,由于进入PLL的是HSI/2,即4MHz,通过PLL倍频可以达到最高系统时钟频率72MHz。 以下是一个简单的使用标准库配置STM32F103使用HSI作为PLL时钟源到最高频率的示例代码: ```c #include "stm32f10x.h" void HSI_SetSysClockTo72M(void) { __IO uint32_t StartUpCounter = 0, HSIStatus = 0; // 使能HSI RCC_HSICmd(ENABLE); // 等待HSI准备好 do { HSIStatus = RCC->CR & RCC_CR_HSIRDY; StartUpCounter++; } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT)); if ((RCC->CR & RCC_CR_HSIRDY) != RESET) { HSIStatus = (uint32_t)0x01; } else { HSIStatus = (uint32_t)0x00; } if (HSIStatus == (uint32_t)0x01) { // 使能Prefetch Buffer FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // Flash 2 wait state FLASH_SetLatency(FLASH_Latency_2); // HCLK = SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); // PCLK2 = HCLK RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK1 = HCLK/2 RCC_PCLK1Config(RCC_HCLK_Div2); // 配置PLL时钟源为HSI/2,9倍频 RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9); // 使能PLL RCC_PLLCmd(ENABLE); // 等待PLL准备好 while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } // 选择PLL作为系统时钟源 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 等待PLL成为系统时钟源 while (RCC_GetSYSCLKSource() != 0x08) { } } else { // HSI启动失败处理 } } int main(void) { HSI_SetSysClockTo72M(); while(1) { // 主循环代码 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值