RK平台时钟(CLK)开发:核心知识+调试步骤+问题汇总 电子说
在 RK(瑞芯微)平台开发中,时钟(CLK)子系统是 SOC 的 “心脏”——CPU 变频、DDR 数据传输、以太网通信、LCD 显示等所有组件的稳定运行,都依赖精准的时钟信号。但时钟树复杂、配置参数多、调试踩坑频繁,一直是开发者的痛点。
今天这篇文章,从核心知识、实操调试步骤到常见问题解决方案,帮你系统掌握 RK 平台 CLK 开发,少走弯路!

时钟子系统的核心是“精准分配与控制”,需先掌握 3 大核心模块:基础框架、GPIO 输出时钟、PLL 展频(降 EMI 关键)。
RK 平台时钟以 “树状结构”(时钟树)分配,从源头(晶振 / PLL)到终端(外设),依赖 4 类关键组件:
|
组件
|
作用
|
关键细节
|
|
晶振(Oscillator)
|
时钟源头,提供基础频率(如 24M 无源晶振)
|
所有 PLL 的输入基准,信号质量直接影响后续时钟稳定性
|
|
PLL(锁相环)
|
对晶振频率倍频,生成高频时钟(如 CPU、DDR 所需)
|
RK 主流 PLL 分工明确:- APLL:独占给 CPU(随 CPU 变频调整)- DPLL:独占给 DDR- GPLL:总线 / 外设备份(常设 594M/1200M)- CPLL/NPLL:LCDC/GMAC 独占
|
|
Divider(分频器)
|
对 PLL 输出频率分频,适配不同外设需求(如 200M→50M)
|
支持整数分频(如 / 2)和小数分频(如 I2S/UART 需精准频率)
|
|
MUX(多路选择器)
|
选择时钟来源(如外设可从 GPLL 或 CPLL 取时钟)
|
寄存器配置选择路径,需注意“父时钟与子时钟的兼容性”
|
|
GATING(时钟门控)
|
控制时钟开关,降低功耗(设备不工作时关闭时钟)
|
有引用计数机制:子时钟打开时自动打开父时钟;所有子时钟关闭才关父时钟
|
此外,总线时钟分“高速” 和 “低速” 两类,需根据外设需求选择:
•高速总线(PERI):ACLK_PERI(100-300M,如 EMMC/USB/GMAC)、HCLK_PERI(37-150M)
•低速总线(BUS):ACLK_BUS(100-300M,如 I2C/I2S/SPI)、PCLK_BUS(50-150M)
很多场景下,可通过 SOC 的 GPIO 输出时钟替代外部晶振(如 WiFi、摄像头),减少外围电路成本。但需满足 3 个前提:
1.IOMUX 配置:GPIO 必须支持 “CLK 输出” 功能(需查芯片 TRM 确认);
2.频率匹配:优先选择晶振 bypass 输出(如 24M),信号质量最优;若从 PLL 分频,需确认外设是否接受信号抖动;
3.驱动能力:部分 GPIO 输出波形差,需调整 IO 驱动能力寄存器。
|
芯片型号
|
时钟名称
|
对应 GPIO
|
支持频率
|
|
RK3399
|
SCLK_TESTOUT
|
GPIO2_D1/GPIO0_B0
|
24M、32K
|
|
RK3566/8
|
CLK_MAC0_OUT
|
GPIO2_C1
|
24M、25M、50M、125M
|
|
RK3588
|
REFCLKOUT
|
GPIO0_A0
|
24M
|
|
RK3576
|
REF_CLK0_OUT
|
GPIO0_A0
|
12M、24M、27M 等
|
时钟信号是 EMI(电磁干扰)的主要来源 —— 高频时钟能量集中在窄频段,易超标。PLL 展频(SSCG) 通过“将能量分散到宽频段”,降低 EMI 峰值,是合规关键。
•调制速度:30-120KHz(需高于人耳听觉范围 20KHz,避免噪音);
•调制深度:0.1%-4%(深度越大,EMI 降得越多,但需兼容外设频率容忍度)。
•非 RK3588 芯片:需先开启 PLL 小数模式(dsmpd=0),再配置展频幅度(ssmod_spread)和速率(ssmod_divval);
•RK3588 芯片:单独配置 sscg_en 使能,再设幅度(mrr)、速率(mfr)和模式(center spread 最优,降抖动)。
调试时钟需按“先看状态→再控参数→最后测输出” 的流程,以下是关键步骤和命令:
先确认当前时钟树结构、频率、使能状态,定位异常时钟:
# 查看所有时钟的父时钟、当前频率、使能计数cat /sys/kernel/debug/clk/clk_summary
关键关注:
•parent:是否为预期的父时钟(如 LCDC 时钟应指向独占 PLL);
•rate:当前频率是否符合需求(如百兆以太网需 50M);
•enable count:使能计数是否为 1(0 表示时钟未开启)。
通过/sys/kernel/debug/clk/[时钟名]/节点,直接调整频率和使能:
# 1. 查看指定时钟当前频率(以saradc为例)cat /sys/kernel/debug/clk/clk_saradc/clk_rate# 2. 设置时钟频率(如设为24M)echo 24000000 > /sys/kernel/debug/clk/clk_saradc/clk_rate# 3. 使能时钟(kernel <6.1)echo 1 > /sys/kernel/debug/clk/clk_saradc/clk_enable_count# 3. 使能时钟(kernel ≥6.1,需用prepare_enable)echo 1 > /sys/kernel/debug/clk/clk_saradc/clk_prepare_enable# 4. 关闭时钟echo 0 > /sys/kernel/debug/clk/clk_saradc/clk_enable_count
若需用 GPIO 输出 24M 时钟(替代外部晶振),步骤如下:
# 1. 设置测试时钟频率为24Mecho 24000000 > /sys/kernel/debug/clk/clk_testout1_pll_src/clk_rateecho 24000000 > /sys/kernel/debug/clk/clk_testout1/clk_rate# 2. 使能测试时钟echo 1 > /sys/kernel/debug/clk/clk_testout1/clk_enable_count# 3. 配置GPIO2_D1为CLK输出功能(IOMUX)io -4 0xff77e004 0x000c0008
其他芯片参考:
•RK3566/8 输出 CAM_CLK:io -4 0xfdc60064 0x70001000 + echo 27000000 > /sys/kernel/debug/clk/clk_cam0_out/clk_rate
•RK3588 输出 REFCLKOUT:io -4 0xfd5f0000 0x000f0001
若需直接测量时钟波形(如确认 LCDC DCLK),需配置 TEST_CLK_OUT 引脚:
1.配置 MUX:选择要输出的时钟源(如 ACLK_PERI);
# RK3399配置TEST_CLK源为24M(寄存器CRU_MISC_CON,地址0xff76050c)io -4 0xff76050c 0x00000800
1.配置 DIV:设置分频比(如 1 分频,输出原频率);
# RK3399配置分频比为1(寄存器CRU_CLKSEL58_CON,地址0xff7601e8)io -4 0xff7601e8 0x0f000000
1.使能 GATING:打开时钟门控;
# RK3399使能TEST_CLK(寄存器CRU_CLKGATE13_CON,地址0xff760334)io -4 0xff760334 0x00000001
1.用示波器测量 TEST_CLK_OUT 引脚波形。
若 EMI 超标,需配置 PLL 展频:
# 1. 设置展频速率30KHz、幅度0.5%、模式为center spreadio -4 0xfd7c01cc 0x00ff000c # 速率30KHzio -4 0xfd7c01cc 0x3f000500 # 幅度0.5%io -4 0xfd7c01cc 0xc0008000 # center spread模式# 2. 使能展频功能io -4 0xfd7c01d0 0x00010001
•现象:调用clk_set_rate设置 PLL 频率,返回负数;
•原因:目标频率不在 PLL 频率表格中(如 RK3399 的rk3399_pll_rates);
•解决方案:按 PLL 公式补全频率表格:
// 公式:VCO=24M*FBDIV/REFDIV(450M~2200M);FOUT=VCO/POSTDIV1/POSTDIV2// 示例:添加594M频率(VCO=1188M=24*99/2,FOUT=1188/2/1)RK3036_PLL_RATE(594000000, 2, 99, 2, 1, 1, 0),
•现象:I2S/UART 用小数分频后,信号抖动超外设容忍范围;
•原因:未满足“小数分频父时钟频率 ≥ 分频后频率 ×20”;
•解决方案:调整父时钟频率(如分频后需 12M,父时钟需≥240M)。
•现象:百兆以太网(需 50M)/ 千兆以太网(需 125M)丢包、ping 不通;
•原因:PLL 输出时钟精度不足,或未使用独立时钟源;
•解决方案:
a.确认 PLL 频率精准(如 GMAC 独占 CPLL,设为 50M/125M);
b.若仍不精准,改用外部晶振(需硬件支持)。
•现象:LCD 无显示或显示异常,排查后是 DCLK 问题;
•原因:LCDC 未独占指定 PLL(如 RK3399 双显需 VOP0 绑定 VPLL、VOP1 绑定 CPLL);
•解决方案:在 DTS 中配置独占 PLL:
// RK3399 VOP0(HDMI)绑定VPLL&vopb_rk_fb {assigned-clocks = <&cru DCLK_VOP0_DIV>;assigned-clock-parents = <&cru PLL_VPLL>;};
•现象:打开 PLL 展频后,DDR 崩溃、USB 2.0 频率测试不通过;
•原因:展频幅度过大,超出 DDR/USB PHY 的容忍范围;
•解决方案:
a.降低展频幅度(如从 2% 降至 0.5%);
b.DDR 展频需在 LOADER 阶段配置(避免运行中调整时钟);
c.USB 需确认 PHY 弹性 buffer 大小(buffer 小则幅度需更小)。
•现象:外设(如 I2C)启动失败,clk_summary 显示时钟 enable count 为 0;
•原因:时钟未配置“常开” 属性,初始化后被系统关闭;
•解决方案:
a.kernel <6.1:添加CLK_IGNORE_UNUSED flag;
GATE(PCLK_PMUGRF_PMU, "pclk_pmugrf_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 1, GFLAGS),
a.kernel ≥6.1:添加CLK_IS_CRITICAL flag,或在 bootargs 加clk_gate.always_on=1。

1.芯片差异是关键:不同 RK 芯片(如 RK3588 vs RK3328)的时钟方案、寄存器地址差异大,调试前务必参考对应芯片的 TRM 和官方指南;
2.优先软件调试,再动硬件:先通过 sys/debug 节点调整时钟,确认逻辑正确后,再固化到 DTS 或驱动;
3.展频需谨慎:展频虽降 EMI,但可能影响敏感外设(如以太网、CAN),需充分做稳定性测试;
4.文档参考:遇到问题可查阅瑞芯微官方文档:
◦《Rockchip Clock 开发指南》(时钟子系统框架);
◦《Rockchip Gpio Output Clocks》(GPIO 输出时钟配置);
◦《Rockchip PLL 展频功能详细说明》(EMI 优化)。
时钟子系统虽复杂,但掌握“基础框架→调试工具→问题定位” 的逻辑后,就能轻松应对。如果本文对你有帮助,欢迎点赞、转发,评论区交流你的调试踩坑经历!
全部0条评论
快来发表一下你的评论吧 !