时钟管理
概述
RTL87x2G支持多种时钟源,系统和外设模块可以选择不同的时钟源,实现需要的时钟频率。
本文介绍RTL87x2G芯片的时钟配置方法,主要包括以下几部分:
支持选择的时钟源:低速32KHz时钟,高速40MHz时钟,PLL 时钟。
不同模块的时钟配置示例。
时钟配置相关的接口。
时钟配置步骤如下:
时钟源的频率配置。
系统和外设模块选择使用的时钟源。
系统和外设模块配置需要的分频,输出时钟。
备注
一个模块修改时钟源的频率可能影响其他使用相同时钟源的模块的时钟。
时钟源介绍
不同时钟源对各个模块的支持情况如下。
Clock Source |
CPU |
FMC |
RTC |
QDEC |
WDT |
TRNG |
Segment LCD |
Display |
SDHC |
PKE |
Ethernet |
USB |
UART |
I2C |
Timer |
Enhanced Timer |
IR |
SPI0 Master |
SPI0 Slave |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
32KHz Clock |
× |
× |
√ |
√ |
√ |
√ |
√ |
× |
× |
× |
× |
× |
× |
× |
√ |
× |
× |
× |
× |
40MHz Clock |
√ |
√ |
× |
× |
× |
× |
× |
√ |
√ |
√ |
× |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
PLL Clock |
√ |
√ |
× |
× |
× |
× |
× |
√ |
√ |
√ |
PLL1 |
√ |
× |
× |
√ |
√ |
√ |
√ |
√ |
低速32KHz时钟
低速的32KHz时钟在 DLPS 模式下仍然保持。
32KHz时钟源的频率不可以改变。
高速40MHz时钟
高速的40MHz时钟无法在DLPS模式下保持。
40MHz时钟源的频率不可以改变。
极速PLL时钟
极速的PLL时钟无法在DLPS模式下保持。
PLL时钟源的频率可以改变。
PLL1时钟
PLL1时钟的范围是400M - 500MHz,步长是20MHz。目前默认是500MHz。
PLL1时钟输出如下图所示,PLL1时钟源频率为CKO_PLL1_VCO。
PLL1可以输出四个时钟,其输出频率由CKO_PLL1_VCO产生。
CKO_PLL1_CPU: 只可以作为CPU和 FMC 的时钟源,通过CKO_PLL1_VCO分频 1/2得出。
CKO_PLL1_PERI: 可以作为大部分外设的时钟源,通过CKO_PLL1_VCO 分频 1/2,1/4,1/5得出。
CKO_PLL1_ETH: 只可以作为以太网的时钟源,CKO_PLL1_VCO(固定为500MHz) 分频 1/2,1/4。
CKO_PLL1_ETH50M:只可以作为以太网的时钟源,CKO_PLL1_VCO(固定为500MHz) 分频 1/10。
PLL2时钟
PLL2时钟的范围是80M - 240MHz。目前默认是160MHz。
PLL2时钟输出如下图所示,PLL2时钟源频率为CKO_PLL2_VCO。
PLL2只输出一个时钟,其输出频率由CKO_PLL2_VCO产生。
CKO_PLL2:可以作为CPU,FMC和Peripheral的时钟源,通过CKO_PLL2_VCO分频 1/1,1/2得出。
时钟配置使用示例
CPU和FMC 时钟配置
CPU时钟配置
CPU时钟源默认为40M时钟,为提升时钟频率可以选择CKO_PLL1_CPU和CKO_PLL2作为时钟源。CPU时钟最大可配置为125MHz。
CPU 需要调用
pm_cpu_freq_set()
配置CPU时钟。CPU 配置125M时钟。
uint32_t actual_mhz = 0; pm_cpu_freq_set(125, &actual_mhz);
备注
接口里面自动实现如下配置,PLL1 Clock 选择500MHz,CKO_PLL1_CPU为250MHz。 CPU 选择CKO_PLL1_CPU为时钟源,divider为1/2。
FMC 时钟配置
FMC时钟默认为40M时钟源,为提升时钟频率可以选择CKO_PLL1_CPU和CKO_PLL2作为时钟源。
FMC需要根据具体的模块,选择对应的接口。下面以Flash Nor为例。
Flash需要通过调用
fmc_flash_nor_clock_switch()
根据具体的Flash Nor ID配置时钟。Flash Nor选择FLASH_NOR_IDX_SPIC0 ID,时钟配置为160MHz。
uint32_t actual_mhz = 0; fmc_flash_nor_clock_switch(FLASH_NOR_IDX_SPIC0, 160, &actual_mhz);
备注
接口里面自动实现如下配置,PLL2 Clock 选择160MHz,CKO_PLL2为160MHz。SPIC0 选择CKO_PLL2为时钟源。
Peripheral 时钟配置
以太网时钟配置
使用以太网时,PLL1 Clock固定为500MHz。
以太网时钟源只能选择CKO_PLL1_ETH(125MHz,250MHz)或者CKO_PLL1_ETH50M(50MHz)。
以太网需要通过调用
pm_ethernet_freq_set()
配置选择的时钟源的频率。以太网时钟频率配置125MHz(只能选择50MHz,125MHz,250MHz)。
pm_ethernet_freq_set(CLK_PLL1_SRC, 125, 125);
备注
接口里面自动实现如下配置,PLL1时钟选择500MHz,CKO_PLL1_ETH为125MHz。参数required_mhz仅供记录。
Timer时钟配置
Timer的时钟源可以选择32KHz时钟,40MHz时钟,PLL1时钟的CKO_PLL1_PERI,PLL2时钟的CKO_PLL2。
目前接口不支持修改PLL1和PLL2的时钟频率,PLL1时钟频率固定为500MHz,PLL2时钟频率固定为160MHz。CKO_PLL1_PERI只能在100MHz,125MHz,250MHz中选择。
Timer 需要通过调用
pm_timer_freq_set()
配置选择的时钟源的频率。Timer 配置CKO_PLL1_PERI的频率为250MHz。
pm_timer_freq_set(CLK_PLL1_SRC, 250, 125);
备注
接口里面自动实现如下配置,PLL1时钟选择500MHz,CKO_PLL1_PERI = 250MHz。参数required_mhz仅供记录。
Timer 通过调用
TIM_StructInit()
和TIM_TimeBaseInit()
,选择CKO_PLL1_PERI为时钟源,divider为1/2,最终输出频率为125MHz。TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_StructInit(&TIM_InitStruct); TIM_InitStruct.TIM_ClockSrc = CK_PLL1_TIMER; TIM_InitStruct.TIM_SOURCE_DIV = TIM_CLOCK_DIVIDER_2; TIM_TimeBaseInit(TIMER_NUM, &TIM_InitStruct);