STM32 GD32 时钟设置
以GD32E230为例。
启动文件:startup_gd32e230x.s 中的代码:
系统初始化代码:
void SystemInit (void) { /* enable IRC8M */ RCU_CTL0 |= RCU_CTL0_IRC8MEN; while(0U == (RCU_CTL0 & RCU_CTL0_IRC8MSTB)){ } /* reset RCU */ RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC |\ RCU_CFG0_ADCPSC | RCU_CFG0_CKOUTSEL | RCU_CFG0_CKOUTDIV | RCU_CFG0_PLLDV); RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLMF4 | RCU_CFG0_PLLDV); RCU_CTL0 &= ~(RCU_CTL0_HXTALEN | RCU_CTL0_CKMEN | RCU_CTL0_PLLEN | RCU_CTL0_HXTALBPS); RCU_CFG1 &= ~(RCU_CFG1_PREDV); RCU_CFG2 &= ~(RCU_CFG2_USART0SEL | RCU_CFG2_ADCSEL); RCU_CFG2 &= ~RCU_CFG2_IRC28MDIV; RCU_CFG2 &= ~RCU_CFG2_ADCPSC2; RCU_CTL1 &= ~RCU_CTL1_IRC28MEN; RCU_INT = 0x00000000U; /* configure system clock */ system_clock_config(); #ifdef VECT_TAB_SRAM nvic_vector_table_set(NVIC_VECTTAB_RAM,VECT_TAB_OFFSET); #else nvic_vector_table_set(NVIC_VECTTAB_FLASH,VECT_TAB_OFFSET); #endif }
系统时钟配置函数:
static void system_clock_config(void)
{
#ifdef __SYSTEM_CLOCK_8M_HXTAL
system_clock_8m_hxtal();
#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL)
system_clock_72m_hxtal();
#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2)
system_clock_72m_irc8m();
#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC48M_DIV2)
system_clock_72m_irc48m();
#else
system_clock_8m_irc8m();
#endif /* __SYSTEM_CLOCK_8M_HXTAL */
}
根据不同的时钟源宏定义(选择不同的时钟源及频率),调用不同的函数,以选择system_clock_72m_hxtal()为例:
static void system_clock_72m_hxtal(void) { uint32_t timeout = 0U; uint32_t stab_flag = 0U; /* enable HXTAL */ RCU_CTL0 |= RCU_CTL0_HXTALEN; /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ do{ timeout++; stab_flag = (RCU_CTL0 & RCU_CTL0_HXTALSTB); } while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); /* if fail */ if(0U == (RCU_CTL0 & RCU_CTL0_HXTALSTB)){ while(1){ } } FMC_WS = (FMC_WS & (~FMC_WS_WSCNT)) | WS_WSCNT_2; // WFY增加2个等待状态 /* HXTAL is stable */ /* 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 = HXTAL * 9 = 72 MHz * 8MHz / RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLDV); RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9); // /* PLL = HXTAL * 6 = 72 MHz 9MHz */ // RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLDV); // RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6); /* 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)){ } }
函数选择的是 :HXTAL =8MH.
如果XHTAL用12MHz , 需要修改3处:
1、定义宏 , 使用12Mhz
2、修改代码
/* PLL = HXTAL * 6 = 72 MHz AAA */
RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLDV);
RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6);
3、修改文件gd32e23x.h
HXTAL_VALUE 为12000000