STM32C8T6时钟树

时钟对于单片机而言就相当于心脏,为单片机提供稳定的运行周期。时钟一旦损坏,单片机的运行就会瘫痪。
刚刚学习了时钟树,趁热打铁,写下这篇博客。
HSE:高速的外部时钟。与LSE相比,HSE精度更高。由RCC_CR时钟控制寄存器的位16:HSEON控制,当外部4—16MHZ振荡器就绪后,位17HSERDY置1,从而可以进行下一步工作。
HSI:高速的内部时钟。它来自于芯片的内部,大小为8M,HSE出现故障时,系统会自动切换到HSI,直到HSE启动成功。由RCC_CR时钟控制寄存器的0位HSION控制,同样的,当内部8MHz的振荡器启动完成后位1HSIRDY就会置1,从而进行下一步工作。
PLLCLK:锁相环时钟。主要来自于HSI二分频或者HSE不分频。这一点从RCC_CFGR寄存器的16位PLLSRC可以看出来。置0时,HSI二分频作为锁相环输入时钟源,置1时HSE不分频作为锁相环输入时钟源。通常情况下,我们选择HSE不分频作为PLL时钟源。况且HSI二分频后为4M,乘以最大倍频因子16也达不到72M(ST官方推荐),选用HSE不仅可以达到72M,还可以达到超频状态。

在这里插入图片描述
HCLK:AHB高速总线时钟。速度最高为72M。为AHB总线的外设提供时钟。
PCLK1:APB1低速总线时钟。最高为36M。为APB1总线的外设提供时钟。
PCLK2:APB2高速总线时钟。推荐位72M。为APB2总线的外设提供时钟。

基础知识已经介绍完毕,下面我们来写代码(以HSE作为系统时钟并且超频到128M):
我们首先建立一个"bsp_rccclkconfig.h"和“bsp_rccclkconfig.c”文件。
bsp_rccclkconfig.c文件中内容如下:

void HSE_SetSysClk( uint32_t RCC_PLLMul_x )
{
   
   ErrorStatus HSEStatus;
 
   //把RCC寄存器复位成复位值,此处容易忘记,记得加上
   RCC_DeInit();
 
   // 使能 HSE
    RCC_HSEConfig(RCC_HSE_ON);
 
   //等待HSE启动
   HSEStatus = RCC_WaitForHSEStartUp();
    if( HSEStatus == SUCCESS )                   //启动完成
  {
     //使能预取指
      FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
     FLASH_SetLatency(FLASH_Latency_2);       //设置等待周期
   
     RCC_HCLKConfig(RCC_SYSCLK_Div1);
        RCC_PCLK1Config(RCC_HCLK_Div2);
        RCC_PCLK2Config(RCC_HCLK_Div1);
   
     //配置PLLCLK = HSE*RCC_PLLMul_x
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);
     
     //使能
     RCC_PLLCmd(ENABLE);
     //等待PLL稳定
     while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET );
     
     //选择锁相环时钟作为系统时钟
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
   
     while( RCC_GetSYSCLKSource() != 0x08 ); 
  }
  else
  {
      /* 如果HSE启动失败,用户可以在这里添加处理错误的代码 */
  }
}
void MCO_GPIO_Config()                 //此处定义的引脚用于连接示波器检验系统时钟是否配置正确
{
    GPIO_InitTypeDef  GPIO_InitStruct;
 
 
   //配置时钟,速度,引脚
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
 
   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
 
   GPIO_Init(GPIOA, &GPIO_InitStruct);
}

超频处理体现在main.c文件中,main.c文件中部分代码如下:

    LED_GPIO_Config();
 
    HSE_SetSysClk( RCC_PLLMul_16 )     //超频体现在这里,倍频因子选择的是16,
                                       //系统时钟为128M,超过了ST官方推荐的72M。

    MCO_GPIO_Config(); 
    RCC_MCOConfig(RCC_MCO_SYSCLK);

本篇博客中的那张时钟树图一定要熟记于胸。希望看到的这篇博客的大咖批评指正,谢谢啦!

发布了4 篇原创文章 · 获赞 2 · 访问量 1603

猜你喜欢

转载自blog.csdn.net/weixin_46021768/article/details/104093654
今日推荐