[研电赛技术支持] 时钟树核心要点

[复制链接]
1824|38
Jiangxiaopi 发表于 2025-11-7 17:49 | 显示全部楼层 |阅读模式
理解GD32的时钟树并掌握其配置方法,是嵌入式开发的重要基础。下面是GD32时钟树的核心要点,并提供一个清晰的内部和外部时钟源配置流程。


一、GD32时钟树核心概述
GD32的时钟树是一个多源、多路径的分配网络,负责将各种时钟源灵活、安全地分配给内核、存储器和各个外设。

12218690d5ebfd719e.png

主要时钟源
GD32微控制器提供了丰富的内外部时钟源,以满足不同应用对精度、速度和功耗的需求。

38729690d5eaeb8fb9.png

时钟树关键路径
系统时钟 (SYSCLK) 选择:系统时钟 (CK_SYS) 是微控制器内核(Cortex-M)的心脏,其时钟源可以三选一:内部高速 RC 振荡器 (IRC8M/IRC16M)、外部高速晶振 (HXTAL) 或锁相环输出 (PLL)。
锁相环 (PLL) 配置:PLL 用于对输入时钟(如 HXTAL 或 IRC8M)进行倍频,以得到更高的系统时钟频率。其配置公式通常为:PLL输出频率 = (输入时钟频率 / PLL_PS) * PLL_N / PLL_P。
总线时钟分配:系统时钟 (SYSCLK) 通过分频产生不同总线的时钟。AHB 总线时钟通常与 SYSCLK 相同或通过分频获得,APB1 和 APB2 总线时钟则由 AHB 时钟分频而来。外设的时钟速率受其所在总线限制。
外设时钟门控:GD32 的每个外设都有一个时钟门控开关。在初始化外设前,必须先使能其时钟;不需要时,可关闭其时钟以节省功耗。

二、时钟配置流程(以HXTAL经PLL倍频为例)
以下是配置外部高速晶振(HXTAL)并通过PLL倍频获得更高系统时钟的通用步骤,以及切换到内部时钟源的基本方法。

/**
* @brief  配置系统时钟至最高性能状态(使用HXTAL和PLL)
* @NOTE   假设使用8MHz外部晶振,目标配置为168MHz系统时钟(公式仅供参考,请以具体型号手册为准)
*         例: PLL输出 = (HXTAL / PLL_PS) * PLL_N / PLL_P = (8MHz / 8) * 336 / 2 = 168MHz
*/
void SystemClock_Config(void)
{
    uint32_t timeout = 0U;
    uint32_t stab_flag = 0U;

    /* 1. 使能HXTAL */
    RCU_CTL |= RCU_CTL_HXTALEN; // 使能外部高速晶振
    /* 等待HXTAL稳定 */
    do {
        timeout++;
        stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
    } while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); // 超时等待

    /* 2. 配置PLL */
    /* 选择HXTAL作为PLL时钟源,并配置预分频PLL_PS、倍频PLL_N、后分频PLL_P等参数 */
    RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLMF4 | RCU_CFG0_PLLPREDV); // 清除相关位
    RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | (RCU_PLL_MUL21 & (~RCU_CFG1_PLLMF5))); // 配置PLL源和倍频系数等
    RCU_CFG1 |= (RCU_PLLPRESEL_HXTAL | RCU_PLL_PREDV4); // 设置预分频系数

    /* 3. 使能PLL并等待就绪 */
    RCU_CTL |= RCU_CTL_PLLEN; // 使能PLL
    while(0U == (RCU_CTL & RCU_CTL_PLLSTB)) { // 等待PLL稳定
    }

    /* 4. 配置总线分频器 */
    RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; // AHB 不分频
    RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; // APB2 2分频
    RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; // APB1 2分频

    /* 5. 切换系统时钟源到PLL */
    RCU_CFG0 &= ~RCU_CFG0_SCS;
    RCU_CFG0 |= RCU_CKSYSSRC_PLL; // 选择PLL作为系统时钟源
    /* 等待时钟源切换完成 */
    while(0U == (RCU_CFG0 & RCU_SCSS_PLL)) { // 等待PLL成为系统时钟
    }
}

/**
* @brief  切换到内部时钟源(IRC8M/IRC16M)
* @note   可在需要降低功耗或HXTAL失效时使用
*/
void SwitchTo_IRC8M(void)
{
    /* 1. 切换系统时钟源到IRC8M */
    RCU_CFG0 &= ~RCU_CFG0_SCS;
    RCU_CFG0 |= RCU_CKSYSSRC_IRC8M; // 选择IRC8M作为系统时钟源
    /* 等待时钟源切换完成 */
    while(0U == (RCU_CFG0 & RCU_SCSS_IRC8M)) {
    }

    /* 2. (可选)关闭不再使用的时钟源以节能,如HXTAL、PLL */
    RCU_CTL &= ~RCU_CTL_HXTALEN; // 关闭HXTAL
    RCU_CTL &= ~RCU_CTL_PLLEN;   // 关闭PLL
}




三、配置注意事项
时钟启动与稳定:使能 HXTAL/LXTAL 或 PLL 后,务必通过循环查询状态位等待其稳定。若长时间未就绪,需检查硬件连接(晶振、负载电容)或配置参数。
频率匹配与限制:
PLL 配置:仔细计算 PLL 的输入、VCO 及输出频率,确保所有参数均在芯片手册规定的范围内。
总线频率:注意 APB1 等总线的最大允许频率,超过可能导致外设工作异常。
Flash 等待周期:系统时钟频率较高时,需根据芯片要求设置正确的 Flash 读取等待周期 (WS),否则可能导致程序执行失败。
外设时钟使能:在初始化任何外设(如 UART、SPI、TIMER)之前,必须首先在 RCU 中使能该外设的时钟。
低功耗考虑:在低功耗应用中,应及时关闭未使用的外设时钟和不需要的时钟源(如 HXTAL、PLL)以降低动态功耗。

四、总结与建议
理解GD32时钟树的关键在于掌握 “源-路-目的” 的逻辑:

源 (Source):多种内部和外部时钟源。
路 (Path):通过 PLL 倍频/分频,以及多级分频器形成路径。
目的 (Destination):最终将合适的时钟频率安全地送达内核、存储器和各个外设。
————————————————
版权声明:本文为CSDN博主「蜀黍@猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_58087444/article/details/151855767

timfordlare 发表于 2025-11-10 16:14 | 显示全部楼层
核心要点是稳定、精准分配时钟信号,同时平衡性能、功耗与抗干扰
primojones 发表于 2025-11-11 11:55 | 显示全部楼层
通常选择HSE或HSI作为输入,经过内部的倍频和分频电路,输出一个远高于输入频率的时钟。
modesty3jonah 发表于 2025-11-11 13:33 | 显示全部楼层
掌握时钟树的核心要点后,开发者可快速配置MCU时钟,优化系统性能与功耗
bestwell 发表于 2025-11-11 16:54 | 显示全部楼层
HSI (Internal High-Speed oscillator) 内部RC振荡器。优点是启动快、无需外部元件;缺点是精度差。常用于系统启动时的临时时钟,或对精度要求不高的场合。
HSE (External High-Speed oscillator) 外部晶体振荡器。优点是精度高、稳定性好;缺点是需要外部晶振和电容,启动慢。通常用于需要精确波特率的通信或对时钟精度要求高的应用。
tabmone 发表于 2025-11-11 18:30 | 显示全部楼层
超过限制可能导致系统不稳定或硬件损坏。
averyleigh 发表于 2025-11-11 20:24 | 显示全部楼层
通过PLL倍频和合理分频,为高速外设提供足够时钟
1988020566 发表于 2025-11-11 21:19 | 显示全部楼层
时钟源​
时钟源是时钟树的“起点”,为整个系统提供基础时钟信号。常见类型:
内部高速时钟:
基于内部RC振荡器,无需外部元件,启动快,但精度较低;
典型频率:48MHz、8MHz。
外部高速时钟:
外部晶振/陶瓷谐振器,精度高,稳定性好;
典型频率:8MHz、12MHz、16MHz。
内部低速时钟:
32.768kHz RC振荡器,用于低功耗场景;
精度较低,但功耗极低。
外部低速时钟:
外部32.768kHz晶振,精度高,用于高精度RTC或低功耗计时。
2. 时钟倍频/分频模块​
PLL:
核心功能:将低频时钟源倍频至高频,作为系统时钟;
关键参数:倍频因子、输入分频、输出分频;
应用场景:需要高速单片机或外设时,通过PLL提升系统时钟。
分频器:
将主时钟分频为各外设所需的低速时钟;
典型分频系数:1/2/4/8/16。
3. 时钟门控​
功能:通过关闭非必要外设的时钟,降低系统功耗;
实现:每个外设的时钟由独立的门控单元控制,软件可动态开启/关闭;
示例:当UART未使用时,关闭其时钟,减少约1mA功耗。
4. 时钟监控与保护​
时钟安全系统(CSS,Clock Security System):
检测主时钟源(如HIRC)是否失效(如RC振荡器漂移),自动切换至备份时钟源(如外部晶振或LICK);
应用场景:工业控制、汽车电子等对时钟稳定性要求高的场景。
PLL锁定检测(PLL Lock Detect):
监测PLL是否锁定(输出频率稳定),未锁定时触发中断或切换至备用时钟。
everyrobin 发表于 2025-11-11 22:38 | 显示全部楼层
PLL/DLL实现时钟倍频、分频和移相,需保证输入时钟连续且占空比接近50%
uytyu 发表于 2025-11-12 11:01 | 显示全部楼层
输入频率超出范围或倍频系数过大,导致 PLL 失锁,系统无时钟输出。
earlmax 发表于 2025-11-12 11:49 | 显示全部楼层
[时钟源: HSI/HSE] --> [PLL (倍频)] --> [MUX (选择)] --> [SYSCLK (CPU时钟)]
                                          |
                                          v
                                   [AHB分频器] --> [HCLK]
                                          |
                     +---------------------+---------------------+
                     v                                           v
              [APB1分频器] --> [PCLK1] (低速外设)         [APB2分频器] --> [PCLK2] (高速外设)
timfordlare 发表于 2025-11-12 12:31 | 显示全部楼层
为 单片机、外设提供匹配其工作要求的时钟信号,确保指令执行、数据传输、模拟采样等操作时序正确。
beacherblack 发表于 2025-11-12 13:13 | 显示全部楼层
睡眠模式:仅关闭CPU时钟,外设时钟可保持运行。
深度睡眠模式:关闭1.2V域时钟,需通过EXTI/RTC唤醒。
待机模式:关闭所有时钟,仅备份域供电。
houjiakai 发表于 2025-11-12 14:08 | 显示全部楼层
时钟树的配置需遵循“从源到端、逐级分配、按需优化”的原则
bartonalfred 发表于 2025-11-12 16:14 | 显示全部楼层
PLL锁定不稳定、时钟源温度漂移、PCB布线过长导致信号干扰
biechedan 发表于 2025-11-12 16:46 | 显示全部楼层
高速场景:优先选外部晶振+ PLL倍频;
低功耗场景:优先选内部低速时钟或关闭非必要时钟源;
高精度场景:选外部低速晶振驱动RTC,或外部高速晶振保证SYSCLK精度。
modesty3jonah 发表于 2025-11-12 18:20 | 显示全部楼层
PLL 是核心倍频模块,需配置倍频系数,同时需确保输入 PLL 的时钟频率在芯片规定范围,避免 PLL 失锁。
earlmax 发表于 2025-11-12 18:54 | 显示全部楼层
动态调节时钟频率,在高性能需求时提频、低功耗场景时降频,实现 “性能 - 功耗” 平衡。
timfordlare 发表于 2025-11-12 19:25 | 显示全部楼层
选择高精度时钟源,启用时钟监控。
jkl21 发表于 2025-11-12 19:43 | 显示全部楼层
PLL输入时钟:通常为外部晶振分频后的信号;
PLL倍频因子:根据目标SYSCLK计算;
SYSCLK分配:确定SYSCLK后,通过分频器设置AHB/APB总线时钟。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

300

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部