Loading... # GD32E230F8修改时钟源-切换为内部震荡时钟源 GD32E230的Firmware Library默认时钟源为外部高速晶振,内部PLL为72M时钟,在一些非常小的方案板子上没设计外部HXTAL,所以需要使用内部RC时钟 ## 修改方法: * 打开 `Firmware/CMSIS/GD/GD32E23x/source/system_gd32e23x.c` * 在第45-49行,修改宏定义,可以选择 `__system_CLOCK_8M_IRC8M` 也可以选择 `__system_CLOCK_72M_PLL_IRC8M_DIV2` ```c /* select a system clock by uncommenting the following line */ //#define __SYSTEM_CLOCK_8M_HXTAL (__HXTAL) //#define __SYSTEM_CLOCK_8M_IRC8M (__IRC8M) #define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000) //#define __SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2 (uint32_t)(72000000) ``` - 也可以单独使用函数修改。参考官方demo ```c static void switch_system_clock_to_72m_irc8m(void) { uint32_t timeout = 0U; uint32_t stab_flag = 0U; /* select IRC8M as system clock source, deinitialize the RCU */ rcu_system_clock_source_config(RCU_CKSYSSRC_IRC8M); rcu_deinit(); /* enable IRC8M */ RCU_CTL0 |= RCU_CTL0_IRC8MEN; /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ do{ timeout++; stab_flag = (RCU_CTL0 & RCU_CTL0_IRC8MSTB); } while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); /* if fail */ if(0U == (RCU_CTL0 & RCU_CTL0_IRC8MSTB)){ while(1){ } } FMC_WS = (FMC_WS & (~FMC_WS_WSCNT)) | WS_WSCNT_2; /* AHB = SYSCLK */ RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; /* APB2 = AHB */ RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; /* APB1 = AHB */ RCU_CFG0 |= RCU_APB1_CKAHB_DIV1; /* PLL = (IRC8M/2) * 18 = 72 MHz */ RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF); RCU_CFG0 |= (RCU_PLLSRC_IRC8M_DIV2 | RCU_PLL_MUL18); /* enable PLL */ RCU_CTL0 |= RCU_CTL0_PLLEN; /* wait until PLL is stable */ while(0U == (RCU_CTL0 & RCU_CTL0_PLLSTB)){ } /* select PLL as system clock */ RCU_CFG0 &= ~RCU_CFG0_SCS; RCU_CFG0 |= RCU_CKSYSSRC_PLL; /* wait until PLL is selected as system clock */ while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ } } ``` Last modification:July 18, 2024 © Allow specification reprint Like 0 If you think my article is useful to you, please feel free to appreciate