/********************************************************************************************************* * 模块名称:RCU.c * 摘 要:RCU模块,包含各种时钟的配置 * 当前版本:1.0.0 * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.) * 完成日期:2021年07月01日 * 内 容: * 注 意: ********************************************************************************************************** * 取代版本: * 作 者: * 完成日期: * 修改内容: * 修改文件: *********************************************************************************************************/ /********************************************************************************************************* * 包含头文件 *********************************************************************************************************/ #include "Rcu.h" #include "gd32e230x_conf.h" /********************************************************************************************************* * 宏定义 *********************************************************************************************************/ /********************************************************************************************************* * 枚举结构体 *********************************************************************************************************/ /********************************************************************************************************* * 内部变量定义 *********************************************************************************************************/ unsigned int CLK_SYS; unsigned int CLK_AHB; unsigned int CLK_APB1; unsigned int CLK_APB2; /********************************************************************************************************* * 内部函数声明 *********************************************************************************************************/ static void ConfigRCU(void); //配置RCU /********************************************************************************************************* * 内部函数实现 *********************************************************************************************************/ /********************************************************************************************************* * 函数名称:ConfigRCU * 函数功能:配置RCU * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意:配置的时钟如下: * (1)PLLCLK(PLL时钟) = 72MHz * (2)SYSCLK(系统时钟) = 72MHz * (3)HCLK(AHB总线时钟) = 72MHz * (4)PCLK1(APB1总线时钟)= 36MHz * (5)PCLK2(APB2总线时钟)= 72MHz *********************************************************************************************************/ static void ConfigRCU(void) { ErrStatus HXTALStartUpStatus; rcu_deinit(); //RCU配置恢复默认值 rcu_osci_on(RCU_HXTAL); //使能外部高速晶振 HXTALStartUpStatus = rcu_osci_stab_wait(RCU_HXTAL); //等待外部晶振稳定 if(HXTALStartUpStatus == SUCCESS) //外部晶振已经稳定 { fmc_wscnt_set(WS_WSCNT_1); rcu_ahb_clock_config(RCU_AHB_CKSYS_DIV1); //设置高速AHB时钟(HCLK) = SYSCLK rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1); //设置高速APB2时钟(PCLK2) = AHB rcu_apb1_clock_config(RCU_APB1_CKAHB_DIV2); //设置低速APB1时钟(PCLK1) = AHB/2 //设置锁相环PLL = HXTAL / 2 * 18 = 72 MHz rcu_hxtal_prediv_config(RCU_PLL_PREDV1); rcu_pll_config(RCU_PLLSRC_HXTAL, RCU_PLL_MUL9); rcu_osci_on(RCU_PLL_CK); //等待锁相环稳定 while(0U == rcu_flag_get(RCU_FLAG_PLLSTB)) { } //选择PLL作为系统时钟 rcu_system_clock_source_config(RCU_CKSYSSRC_PLL); //等待PLL成功用于系统时钟 while(0U == rcu_system_clock_source_get()) { } } } /********************************************************************************************************* * API函数实现 *********************************************************************************************************/ /********************************************************************************************************* * 函数名称:InitRCU * 函数功能:初始化RCU模块 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ void InitRCU(void) { ConfigRCU(); //配置RCU } /********************************************************************************************************* * 函数名称:ViewRcuClock * 函数功能:查看各个时钟频率 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ void ViewRcuClock(void) { CLK_SYS=rcu_clock_freq_get(CK_SYS); //读取系统时钟频率 CLK_AHB=rcu_clock_freq_get(CK_AHB); //读取系统时钟频率 CLK_APB1=rcu_clock_freq_get(CK_APB1); //读取系统时钟频率 CLK_APB2=rcu_clock_freq_get(CK_APB2); //读取系统时钟频率 }