【前言】
GD32由于没有象STM32等有图形化配置的界面,所以学习了解它的时钟是非常有必要的。GD32H759系列的时钟配置是在官方提供的CMSIS\Source目录下面的system_gd32h7xx.c文件中配置系统时钟。通过数据手册与该例程,基本了解了GD32H759_EVAL开发板的时钟配置。
1、经查看原理图开发板上板载了25M高速晶振,示例中大都是使用外部高速时钟运行程序。
在system_gd32h7xx.c中的第60行配置了总线高速时钟为600M
- GD32H759在上电复位后,汇编首先调用systemini进行系统时钟的复位与配置。
- systeminit函数是在system_gd32h7xx.c中定义。其内容如下:
void SystemInit(void)
{
/* 使能内部64M时钟 */
RCU_CTL |= RCU_CTL_IRC64MEN;
// 等待64MHz RC 振器器稳定标志位
while(0U == (RCU_CTL & RCU_CTL_IRC64MSTB)) {
}
RCU_APB4EN |= RCU_APB4EN_SYSCFG;
SYSCFG_SRAMCFG1 &= ~SYSCFG_SRAMCFG1_TCM_WAITSTATE;
RCU_CFG0 &= ~RCU_CFG0_SCS;
/* 复位时钟控制寄存器 */
/* reset HXTALEN, CKMEN, PLL0EN, PLL1EN, PLL2EN, PLLUSB0 and PLLUSB1 bits */
RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLL0EN | RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_HXTALBPS);
RCU_ADDCTL1 &= ~(RCU_ADDCTL1_PLLUSBHS0EN | RCU_ADDCTL1_PLLUSBHS1EN | RCU_ADDCTL1_LPIRC4MEN);
/* reset CFG0, CFG1, CFG2, CFG3 registers */
RCU_CFG0 &= ~(RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | RCU_CFG0_APB3PSC | RCU_CFG0_APB4PSC | RCU_CFG0_AHBPSC |
RCU_CFG0_I2C0SEL | RCU_CFG0_SCS | RCU_CFG0_RTCDIV);
RCU_CFG1 &= ~(RCU_CFG1_HPDFSEL | RCU_CFG1_TIMERSEL | RCU_CFG1_PERSEL |
RCU_CFG1_CAN0SEL | RCU_CFG1_CAN1SEL | RCU_CFG1_CAN2SEL |
RCU_CFG1_RSPDIFSEL | RCU_CFG1_USART0SEL | RCU_CFG1_USART1SEL | RCU_CFG1_USART2SEL | RCU_CFG1_USART5SEL | RCU_CFG1_PLL2RDIV);
RCU_CFG2 &= ~(RCU_CFG2_SAI2B1SEL | RCU_CFG2_SAI2B0SEL | RCU_CFG2_SAI1SEL | RCU_CFG2_SAI0SEL |
RCU_CFG2_CKOUT0SEL | RCU_CFG2_CKOUT1SEL | RCU_CFG2_CKOUT0DIV | RCU_CFG2_CKOUT1DIV);
RCU_CFG3 &= ~(RCU_CFG3_ADC01SEL | RCU_CFG3_ADC2SEL | RCU_CFG3_SDIO1SEL
| RCU_CFG3_I2C3SEL | RCU_CFG3_I2C2SEL | RCU_CFG3_I2C1SEL);
RCU_CFG4 &= ~(RCU_CFG4_EXMCSEL | RCU_CFG4_SDIO0SEL);
RCU_CFG5 &= ~(RCU_CFG5_SPI0SEL | RCU_CFG5_SPI1SEL | RCU_CFG5_SPI2SEL |
RCU_CFG5_SPI3SEL | RCU_CFG5_SPI4SEL | RCU_CFG5_SPI5SEL);
/* disable all interrupts */
RCU_INT = 0x14FF0000U;
RCU_ADDINT = 0x00700000U;
/* reset all PLL0 parameter */
RCU_PLL0 = 0x01002020U;
RCU_PLL1 = 0x01012020U;
RCU_PLL2 = 0x01012020U;
RCU_PLLALL = 0x00000000U;
RCU_PLLADDCTL = 0x00010101U;
RCU_PLLUSBCFG = 0x00000000U;
RCU_PLL0FRA = 0x00000000U;
RCU_PLL1FRA = 0x00000000U;
RCU_PLL2FRA = 0x00000000U;
/* configure system clock */
system_clock_config();
}复制代码
在复位结束后,进行新的进钟配置system_clock_config();在system_clock_config中根据宏定义,定位到了system_clock_600m_hxtal函数,其内容如下。
在system_clock_600m_hxtal函数中,首先将RCU_CTL;寄存器的外部高速时钟位使能,然后等待时钟稳定位硬件置1,如果超时,则系统挂起。
如果外部时钟配置成功,则进入以下设置时钟:
1、APB4使能
2、SRAM的等待设置。
3、AHB为系统时钟频率的1/2 即为300M
4、APB4为AHB的时钟频率1/2——150M
5、APB3 为AHB的时钟频率1/2——150M
6、APB2 为AHB的时钟频率——300M
7、APB1 为AHB的时钟频率——150M
然后使能RCU——PULLAL的所有时钟位。
最后全能RCU_CTL时钟寄存器的使能位,开启高速时钟,等待高速时钟稳定后就可以正式进入系统的其他应用之中。
【读后感】
从时钟的学习中,我初步了解了GD32H759的时钟配置的流程,虽然对GD32的各个时钟寄存器没有充分的掌握,但是可以在实际的应用中,知道如何去查找资料,在以后的各个外设的配置中,如果使用分频、计算速度的配置等。