GD32F10x时钟树

#include "RCU_Clock_Out.h"

void RCU_IRC8M_Clock_Out_Init(void);
void RCU_HXTAL_Clock_Out_Init(void);
void RCU_SYS_Clock_Out_Init(void);
void MySystemClockInit(uint8_t tRCClockSource,uint8_t use_pll);

//函数功能:内部RC8MHz振荡器时钟输出
void RCU_IRC8M_Clock_Out_Init(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);//使能GPIOA时钟,enable GPIO clock
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
    //将GPIOA8设置为复用功能IO推挽输出,初始化时钟输出引脚
    //CK_OUT0为时钟输出引脚,映射到PA8引脚
    rcu_ckout0_config(RCU_CKOUT0SRC_IRC8M);
    //设置CK_OUT0引脚(PA8)的输出时钟源为CK_IRC8M(内部RC8MHz)时钟
}

//函数功能:外部8MHz振荡器时钟输出
void RCU_HXTAL_Clock_Out_Init(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);//使能GPIOA时钟,enable GPIO clock
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
    //将GPIOA8设置为复用功能IO推挽输出,初始化时钟输出引脚
    //CK_OUT0为时钟输出引脚,映射到PA8引脚
    rcu_ckout0_config(RCU_CKOUT0SRC_HXTAL);
    //设置CK_OUT0引脚(PA8)的输出时钟源为CK_HXTAL(外部8MHz)时钟
}

//函数功能:系统时钟输出
void RCU_SYS_Clock_Out_Init(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);//使能GPIOA时钟,enable GPIO clock
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
    //将GPIOA8设置为复用功能IO推挽输出,初始化时钟输出引脚
    //CK_OUT0为时钟输出引脚,映射到PA8引脚
    rcu_ckout0_config(RCU_CKOUT0SRC_HXTAL);
    //设置CK_OUT0引脚(PA8)的输出时钟源为CK_HXTAL(外部8MHz)时钟
}

//MySystemClockInit(0,1);//使用内部RC振荡器,带有PLL工作,系统时钟108MHz
//MySystemClockInit(1,1);//使用外部晶振,带有PLL工作,系统时钟108MHz
//MySystemClockInit(0,0);//直接使用内部RC振荡器,不带PLL工作,系统时钟8MHz
//MySystemClockInit(1,0);//直接使用外部晶振,不带PLL工作,系统时钟8MHz
//函数功能:系统时钟初始化
void MySystemClockInit(uint8_t tRCClockSource,uint8_t use_pll)
{
///选择"振荡源"开始//
    if(tRCClockSource==0)//内部RC时钟
    {
      rcu_osci_on(RCU_IRC8M);//启用"内部RC8MHz振荡器"
      rcu_osci_stab_wait(RCU_IRC8M);//等待内部RC8MHz振荡器稳定
    }
    else//内部高速晶振时钟
    {
      rcu_osci_on(RCU_HXTAL);//启用"外部8MHz晶振"
      rcu_osci_stab_wait(RCU_HXTAL);//等待外部8MHz晶振振荡器稳定
    }
///选择"振荡源"结束//

///选择"PLL时钟源"开始//
    if(use_pll)//使用PLL
    {
        if(tRCClockSource==0)//内部RC时钟
      {
        rcu_pll_config(RCU_PLLSRC_IRC8M_DIV2,RCU_PLL_MUL27);
        //设置内部RC8MHz输出的时钟再2分频后作为PLL输入时钟源,并设置倍频因子为27
          rcu_osci_on(RCU_PLL_CK);//使能"PLL时钟"
          rcu_osci_stab_wait(RCU_PLL_CK);//等待"PLL时钟"稳定
      }
      else
      {
        rcu_predv0_config(RCU_PREDV0_DIV2);//设置外部晶振输出后再进行2分频得到的时钟
        rcu_pll_config(RCU_PLLSRC_HXTAL,RCU_PLL_MUL27);
        //设置外部晶振8MHz输出的时钟再2分频后作为PLL输入时钟源,并设置倍频因子为27

        rcu_osci_on(RCU_PLL_CK);//使能"PLL时钟"
        rcu_osci_stab_wait(RCU_PLL_CK);//等待"PLL时钟"稳定
      }
  }
///选择"PLL时钟源"结束//

///选择"系统时钟源"开始//
    if(use_pll)//使用PLL
    {
      rcu_system_clock_source_config(RCU_CKSYSSRC_PLL);
      //选择选择CK_PLL时钟作为系统时钟CK_SYS
  }
    else
    {
      if(tRCClockSource==0)//内部RC时钟
      {
        rcu_system_clock_source_config(RCU_CKSYSSRC_IRC8M);
        //直接选择内部RC8MHz输出的时钟CK_IRC8M作为系统时钟CK_SYS
        }
        else
        {
        rcu_system_clock_source_config(RCU_CKSYSSRC_HXTAL);
        //直接选择外部晶振时钟输出的CK_HXTAL时钟作为系统时钟CK_SYS
      }
  }
///选择"系统时钟源"结束//
}

猜你喜欢

转载自blog.csdn.net/weixin_42550185/article/details/116588003