背景:
- 由于项目为了降成本将stm32f407平台换为gd32f303平台,硬件设计没有按照官方参考的8M外部晶振设计,而是采用了25M晶振,因此需要在官方库基础上修改晶振频率,使系统达到更高的主频。
- 本文将系统主频配置为100Mhz,根据系统时钟树可知25M晶振经过1或者2分频后在倍频2~63倍不能得到120M
实验环境:
- 主芯片:GD32F303VET6
- 库版本:GD32F30x_Firmware_Library_V2.1.3
- 编译环境:keil5
修改方法:
1.修改晶振频率宏定义 HXTAL_VALUE
- 文件 gd32f30x.h
/* define value of high speed crystal oscillator (HXTAL) in Hz */
#if !defined HXTAL_VALUE
#ifdef GD32F30X_CL
#define HXTAL_VALUE ((uint32_t)25000000) /*!< value of the external oscillator in Hz */
#else
//修改这里的 8M 为 25M
//#define HXTAL_VALUE ((uint32_t)8000000) /* !< from 4M to 32M *!< value of the external oscillator in Hz*/
#define HXTAL_VALUE ((uint32_t)25000000) /* !< from 4M to 32M *!< value of the external oscillator in Hz*/
#endif /* HXTAL_VALUE */
#endif /* high speed crystal oscillator value */
PS: 仅仅修改此处,系统会运行在25Mhz频率下
2.修改系统主频选择
- 文件 system_gd32f30x.c
- 默认选择 __SYSTEM_CLOCK_HXTAL是打开的,这里选择所需的主频,我选择120M,实际是配置不成120M的
/* use HXTAL(XD series CK_HXTAL = 8M, CL series CK_HXTAL = 25M) */
//#define __SYSTEM_CLOCK_HXTAL (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000)
//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000)
//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000)
#define __SYSTEM_CLOCK_120M_PLL_HXTAL (uint32_t)(120000000)
3.修改时钟配置函数中PLL倍频参数
- 文件 system_gd32f30x.c
- 找到步骤2中选择的时钟频率配置函数 static void system_clock_120m_hxtal(void)
#if (defined(GD32F30X_HD) || defined(GD32F30X_XD))
/* select HXTAL/2 as clock source */
RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0);
RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0);
/* CK_PLL = (CK_HXTAL/2) * 30 = 120 MHz */
RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5);
//将RCU_PLL_MUL30改为RCU_PLL_MUL8
//CK_PLL = (25/2) * 8 = 100 MHz
//RCU_CFG0 |= RCU_PLL_MUL30;
RCU_CFG0 |= RCU_PLL_MUL8;
#elif defined(GD32F30X_CL)
PS: 根据系统时钟树可知,25M晶振不能配置出120M主频,因此此处选择了100M
实验结果:
- 获取系统主频
获取时钟频率
/*!
\brief get the system clock, bus and peripheral clock frequency
\param[in] clock: the clock frequency which to get
only one parameter can be selected which is shown as below:
\arg CK_SYS: system clock frequency
\arg CK_AHB: AHB clock frequency
\arg CK_APB1: APB1 clock frequency
\arg CK_APB2: APB2 clock frequency
\param[out] none
\retval clock frequency of system, AHB, APB1, APB2
*/
uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock)