STM32--时钟树(1)

  • HSE时钟(高速外部时钟)
    • 野火指南者使用的是8M
    • 来源:有源晶振(4~26M)
    • 控制:RCC_CR时钟控制寄存器的位16(HSEON),位17(HSERDY)
  • HSI时钟(高速内部时钟)
    • 来源:芯片内部,8M,当HSE故障时,系统时钟会自动切换到HSI,直到HSE启动
    • 控制:RCC_CR时钟控制寄存器的位0(HSEON),位1(HSERDY)
  • PLLCLK锁相环时钟
    • 来源:(HSI/2、HSE)经过倍频得到
    • 控制:
      • CFGR寄存器
        • XTPRE:PLL输入时钟源
        • PLLSRC:HSE分频作为PLL输入
        • PLLMUL:PLL输入时钟的倍频数
  • 系统时钟
    • 来源:HSE、HSI、PLLCLK
    • 控制:CFGR寄存器的SW控制位
    • 注意:通常的配置是:SYSCLK = PLLCLK = 72M
  • HCLK时钟
    • AHB高速总线时钟,速度最高为72M,为AHB总线外设提供时钟,为Cortex系统定时器提供时钟SysTick,为内核提供时钟(FCLK)
    • 来源:系统时钟分频得到,一般设置HCLK = SYSCLK = 72M
    • 控制:CFGR寄存器的HPRE位
  • PCLK1时钟(APB1低速总线时钟)
    • 最高为36M,为APB1总线上的外设提供时钟,2倍频后则为APB1总线上的定时器2-7提供时钟,最大为72M。
    • 来源:HCLK分频得到,一般配置PCLK1= HCLK/2=36M
    • 控制:RCC_CFGR寄存器的PPRE1位
  • RTC时钟
    • 为芯片内部的RTC外设提供时钟
    • 来源:HSE_RST(HSE分频得到)、LSE(外部32.768kKHz的晶振提供)、LSI(32KHz)
    • 控制:RCC备份域控制寄存器RCC_BDCR的RTCSEL位控制
  • IWDGCLK独立看门狗时钟
    • 来源:LSI提供
  • 配置时钟代码分析
    /时钟配置函数
    
    static void SetSysClockTo72(void)
    {
      __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
      
      //配置SYSCLK, HCLK, PCLK2 and PCLK1 
      //使能HSE    
      RCC->CR |= ((uint32_t)RCC_CR_HSEON);
     
      //等待HSE就绪,并做超时处理
      do
      {
        HSEStatus = RCC->CR & RCC_CR_HSERDY;
        StartUpCounter++;  
      } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
    
      if ((RCC->CR & RCC_CR_HSERDY) != RESET)
      {
        HSEStatus = (uint32_t)0x01;
      }
      else
      {
        HSEStatus = (uint32_t)0x00;
      }  
    
      //如果HSE启动成功,程序继续往下执行
      if (HSEStatus == (uint32_t)0x01)
      {
        //使能预取指
        FLASH->ACR |= FLASH_ACR_PRFTBE;//在stm32f10xxx闪存编程参考手册中有该寄存器的描述
    
        //等待时间 
        FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
        FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    
    
     
        /* HCLK = SYSCLK = 72M */
        RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
          
        /* PCLK2 = HCLK  = 72M*/
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
        
        /* PCLK1 = HCLK/2  = 36M*/
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
    
    
        /* 配置PLL锁相环: PLLCLK = HSE * 9 = 72 MHz */
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                            RCC_CFGR_PLLMULL));
        RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);//超频在这设置
    
        /* 使能 PLL */
        RCC->CR |= RCC_CR_PLLON;
    
        /* 等待PLL启动就绪 */
        while((RCC->CR & RCC_CR_PLLRDY) == 0)
        {
        }
        
        /* 选择PLLCLK作为系统时钟 */
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
        RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    
    
        /* 等待PLLCLK作为系统时钟 */
        while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
        {
        }
      }
      else
      { 
          //入锅HSE启动失败,用户可以在这里添加处理代码
      }
    }
  • 时钟配置完毕,建议对比参考手册中的时钟树图进行配置,并参考寄存器的具体含义及配置位。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值