#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
}
}
///选择"系统时钟源"结束//
}