大家应该都知道,微控制器最重要的就是时钟频率,时钟频率会影响指令周期、定时器、RTC等等所有涉及时钟的总线。
GD32F350开发板的外部高速时钟8MHZ晶振和外部低速时钟32.768KHZ晶振没有焊接,大家有需要自行焊接。
我用的是内部时钟8MHZ,当然,如果需要用时钟频率进行定时器中断设置的,建议使用外部晶振,因为外部晶振精度高,偏移量小,但是缺点在于功耗就大了,内部时钟功耗低,但是精度会差一些;
以下是我的时钟配置
- /* system frequency define */
- #define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */
- #define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */
- #define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */
- /* select a system clock by uncommenting the following line */
- #if defined (GD32F330)
- //#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)
- //#define __SYSTEM_CLOCK_72M_PLL_IRC48M_DIV2 (uint32_t)(72000000)
- #define __SYSTEM_CLOCK_84M_PLL_HXTAL (uint32_t)(84000000)
- //#define __SYSTEM_CLOCK_84M_PLL_IRC8M_DIV2 (uint32_t)(84000000)
- #endif /* GD32F330 */
- #if defined (GD32F350)
- //#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)
- //#define __SYSTEM_CLOCK_84M_PLL_HXTAL (uint32_t)(84000000)
- //#define __SYSTEM_CLOCK_84M_PLL_IRC8M_DIV2 (uint32_t)(84000000)
- //#define __SYSTEM_CLOCK_96M_PLL_HXTAL (uint32_t)(96000000)
- //#define __SYSTEM_CLOCK_96M_PLL_IRC8M_DIV2 (uint32_t)(96000000)
- //#define __SYSTEM_CLOCK_96M_PLL_IRC48M_DIV2 (uint32_t)(96000000)
- //#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000)
- //#define __SYSTEM_CLOCK_108M_PLL_IRC8M_DIV2 (uint32_t)(108000000)
- #endif /* GD32F350 */
- #define SEL_IRC8M 0x00
- #define SEL_HXTAL 0x01
- #define SEL_PLL 0x02
- /* set the system clock frequency and declare the system clock configuration function */
- #ifdef __SYSTEM_CLOCK_8M_HXTAL
- uint32_t SystemCoreClock = __SYSTEM_CLOCK_8M_HXTAL;
- static void system_clock_8m_hxtal(void);
- #elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL)
- uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL;
- static void system_clock_72m_hxtal(void);
- #elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2)
- uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2;
- static void system_clock_72m_irc8m(void);
- #elif defined (__SYSTEM_CLOCK_72M_PLL_IRC48M_DIV2)
- uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC48M_DIV2;
- static void system_clock_72m_irc48m(void);
- #elif defined (__SYSTEM_CLOCK_84M_PLL_HXTAL)
- uint32_t SystemCoreClock = __SYSTEM_CLOCK_84M_PLL_HXTAL;
- static void system_clock_84m_hxtal(void);
- #elif defined (__SYSTEM_CLOCK_84M_PLL_IRC8M_DIV2)
- uint32_t SystemCoreClock = __SYSTEM_CLOCK_84M_PLL_IRC8M_DIV2;
- static void system_clock_84m_irc8m(void);
- #elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL)
- uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_HXTAL;
- static void system_clock_96m_hxtal(void);
- #elif defined (__SYSTEM_CLOCK_96M_PLL_IRC8M_DIV2)
- uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_IRC8M_DIV2;
- static void system_clock_96m_irc8m(void);
- #elif defined (__SYSTEM_CLOCK_96M_PLL_IRC48M_DIV2)
- uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_IRC48M_DIV2;
- static void system_clock_96m_irc48m(void);
- #elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL)
- uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL;
- static void system_clock_108m_hxtal(void);
- #elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M_DIV2)
- uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_IRC8M_DIV2;
- static void system_clock_108m_irc8m(void);
- #else
- uint32_t SystemCoreClock = __SYSTEM_CLOCK_8M_IRC8M;
- static void system_clock_8m_irc8m(void);
- #endif /* __SYSTEM_CLOCK_8M_HXTAL */
- /* configure the system clock */
- static void system_clock_config(void);
- /*!
- \brief setup the microcontroller system, initialize the system
- \param[in] none
- \param[out] none
- \retval none
- */
- 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);
- #if (defined(GD32F350))
- RCU_CFG0 &= ~(RCU_CFG0_USBFSPSC);
- RCU_CFG2 &= ~(RCU_CFG2_CECSEL | RCU_CFG2_USBFSPSC2);
- #endif /* GD32F350 */
- RCU_CTL0 &= ~(RCU_CTL0_HXTALEN | RCU_CTL0_CKMEN | RCU_CTL0_PLLEN | RCU_CTL0_HXTALBPS);
- RCU_CFG1 &= ~(RCU_CFG1_PREDV | RCU_CFG1_PLLMF5 | RCU_CFG1_PLLPRESEL);
- RCU_CFG2 &= ~(RCU_CFG2_USART0SEL | RCU_CFG2_ADCSEL);
- RCU_CFG2 &= ~RCU_CFG2_IRC28MDIV;
- RCU_CFG2 &= ~RCU_CFG2_ADCPSC2;
- RCU_CTL1 &= ~RCU_CTL1_IRC28MEN;
- RCU_ADDCTL &= ~RCU_ADDCTL_IRC48MEN;
- RCU_INT = 0x00000000U;
- RCU_ADDINT = 0x00000000U;
- /* configure system clock */
- system_clock_config();
- }
- /*!
- \brief configure the system clock
- \param[in] none
- \param[out] none
- \retval none
- */
- 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();
- #elif defined (__SYSTEM_CLOCK_84M_PLL_HXTAL)
- system_clock_84m_hxtal();
- #elif defined (__SYSTEM_CLOCK_84M_PLL_IRC8M_DIV2)
- system_clock_84m_irc8m();
- #elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL)
- system_clock_96m_hxtal();
- #elif defined (__SYSTEM_CLOCK_96M_PLL_IRC8M_DIV2)
- system_clock_96m_irc8m();
- #elif defined (__SYSTEM_CLOCK_96M_PLL_IRC48M_DIV2)
- system_clock_96m_irc48m();
- #elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL)
- system_clock_108m_hxtal();
- #elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M_DIV2)
- system_clock_108m_irc8m();
- #else
- system_clock_8m_irc8m();
- #endif /* __SYSTEM_CLOCK_8M_HXTAL */
- }
复制代码