配置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)。