GD32F4(8):配置GD32F450时钟输出

配置GD32F450时钟输出

1. 环境

  • win10
  • IDE:keil5
  • 板卡:GD32F450VK
  • GD32库函数版本:2.6

2. 需求

有的时候我们需要配置mcu输出时钟,作为外部设备的有源时钟,这样既可以节省pcb空间,也可以节约成本。

下面我们就分析一下GD32F450配置时钟输出的方法。

3. 分析

先看一下时钟树,表明GD32F450最多支持2路时钟输出,并且可以单独配置。

在这里插入图片描述

在用户手册中,对于时钟输出有如下描述:

时钟输出功能输出从32kHz到240MHz的时钟。通过设置时钟配置寄存器0(RCU_CFG0)中的CK_OUT0时钟源选择位域CKOUT0SEL能够选择不同的时钟信号。相应的GPIO引脚应该被配置成备用功能I/O(AFIO)模式来输出选择的时钟信号。CK_OUT1时钟输出源选择通过设置时钟配置寄存器RCU_CFG0中的CKOUT1SEL位域实现。

下表是时钟输出0的时钟源选择 :

时钟输出 0 的时钟源选择位域 时钟源
00 CK_IRC16M
01 CK_LXTAL
10 CK_HXTAL
11 CK_PLLP

下表是时钟输出1的时钟源选择:

时钟输出1 的时钟源选择位域 时钟源
00 CK_IRC16M
01 CK_LXTAL
10 CK_HXTAL
11 CK_PLLP

通过配置RCU_CFG0寄存器的CKOUT0DIV位域,可以将CK_OUT0输出时钟的频率按比例分频,进而降低CK_OUT0的输出频率。 通过配置RCU_CFG0寄存器的CKOUT1DIV位域,可以将CK_OUT1输出时钟的频率按比例分频,进而降低CK_OUT1的输出频率。

4. 实现

通过查看数据手册可知:

  • CK_OUT0对应引脚是PA8

  • CK_OUT1对应引脚是PC9

我们下面通过配置CK_OUT0来说明输出的配置方式,CK_OUT1是类似的。

CK_OUT0时钟输出是通过配置时钟配置寄存器 0(RCU_CFG0)来实现的,我们不直接配置寄存器,而是使用库函数来实现。

rcu_periph_clock_enable(RCU_GPIOA);

gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_8);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_8);

/* enable SYSCFG clock */
rcu_periph_clock_enable(RCU_SYSCFG);
  
/* choose DIV2 to get 50MHz from 200MHz on CKOUT0 pin (PA8) to clock the PHY */
rcu_ckout0_config(RCU_CKOUT0SRC_PLLP, RCU_CKOUT0_DIV4);

这个rcu_ckout0_config函数很重要,它先择了配置输出的源和分频值。函数的这两个参数:

  • 时钟源我们通过时钟树可知道有四种。
  • 分频值通过时钟树可知道有1、2、3、4、5分频。

5. 注意

通过上面我们可以知道时钟源的选择和分频系数的选择,但是我们也发现,GD32F450的时钟输出不可以任意配置,而是只能输出几个固定的时钟,因此若想配置成你想要的时钟,有的时候可能要在系统时钟上进行取舍,或者将外部时钟换成你想要的时钟的倍数,比如您想要25M时钟,这时候要不将CK_HXTAL换成25M,要不就是在配置系统时钟的时候将mcu主频调低(200M即使五分频也到不了25M)。

猜你喜欢

转载自blog.csdn.net/Zhichao_Zhang/article/details/127317774