Skip to content

先搞懂它是什么

  • 时钟(Clock):芯片的“心跳”,所有模块(CPU、串口、定时器、Wi-Fi)都靠一个节拍信号工作,节拍越快,干活越快、功耗也越高。
  • 时钟树(Clock Tree):把少数几个“源头时钟”(晶振/RC)经过分频、倍频,分发给不同外设的一套分配网络,就像城市的发电厂 → 变电站 → 各楼栋。
  • 启动流程(Boot):芯片上电后先跑固化在 ROM 里的引导代码,再加载用户固件、初始化堆栈与时钟,最后进入 main()——这一串动作的顺序就是启动流程。
  • 为什么要懂:串口乱码、外设不工作、低功耗唤醒异常,八成和时钟配置有关;面试和课程考试也常考“时钟树怎么走、启动分几步”。

层层拆解原理

1. 时钟源(Clock Sources)

MCU 的时钟源头通常有几种,成本、精度、功耗各不相同:

时钟源精度特点典型用途
外部高速晶振(XTAL)需要外围晶振电路,上电稳定慢系统主时钟、无线射频参考
内部 RC 振荡器(RC)中低免外围器件、上电快,但温漂大快速启动、低功耗模式
外部低速晶振(32.768kHz)极省电RTC、低功耗定时唤醒
PLL(锁相环)由输入决定把低频倍频到高频高主频运行

Bouffalo SDK 里能看到对应接口:app_set_clock_source(CLOCK_SOURCE_PASSIVE) 选择外部无源晶振作为时钟源(wl_ble_lp 低功耗例程用它),set_clock_source 1/2/3 命令可切换 RC / 无源晶振 / 有源晶振。

2. 时钟分配:分频 + 门控

高频主时钟不能直接给所有外设,需要:

  • 分频:降低频率给低速外设,例如把系统时钟分频后给 UART 做波特率基准、给定时器做计数基准。
  • 门控(Clock Gating):不用某个外设时把它的时钟“关掉”,这是低功耗的重要手段。SDK 低功耗例程里的 GLB_CGEN_* 寄存器就是这类开关(如 GLB_CGEN_S1A_UART0 控制 UART0 时钟)。

3. 启动流程(Boot Sequence)

对应到 SDK 例程,main() 里常见的前几步就是启动流程的缩影:board_init() → 串口初始化(shell_init_with_task)→ rfparam_init 射频参数 → 创建应用任务 → vTaskStartScheduler()

4. 复位来源(Reset Sources)

芯片可以被多种原因复位:上电复位(POR)、外部复位引脚(RST)、看门狗复位(WDG)、软件复位(bl_sys_reset_system() 一类接口)。区分复位来源是排查“为什么程序重启”的第一步,SDK 的系统控制栏目有对应实验(软件重启崩溃调试)。

结合 SDK 看实现

以 SDK 低功耗例程的时钟恢复代码为例,可以看到“上电主频 → 分频降频 → 门控外设时钟”的完整思路:

c
/* 低功耗唤醒后:把 CPU 主频降到 80M 档,并只保留必要外设时钟 */
static void set_cpu_bclk_80M_and_gate_clk(void)
{
    GLB_Set_MCU_System_CLK_Div(0, 3);   /* 系统时钟分频 */
    CPU_Set_MTimer_CLK(ENABLE, BL_MTIMER_SOURCE_CLOCK_MCU_CLK, /* 定时器时钟重新校准 */);

    /* 门控:只保留 CPU/DMA/UART0/Flash 等必要模块,其余外设关时钟 */
    /* 例:GLB_CGEN_S1A_UART0 = 1 保留 UART0,GLB_CGEN_S2_WIFI = 1 保留 Wi-Fi */
}

常见考点 / 面试题

为什么外设需要独立的时钟,而不是直接用 CPU 主频?

不同外设对频率和精度的要求不同(如 UART 需要精确的波特率基准、定时器需要可调分频),且外设时钟门控是实现低功耗的关键——不用时关掉,能大幅省电。

系统上电后为什么要经过 ROM 引导,而不是直接运行用户程序?

ROM 引导负责初始化堆栈、基础时钟,并从 Flash 校验/加载用户固件,保证固件完整性和统一的启动入口;这也是 OTA 升级能“换了固件仍能启动”的基础。

串口乱码可能和时钟有什么关系?

波特率是根据时钟分频算出来的,如果系统时钟源/分频配置变了而波特率没重算,收发双方频率不一致就会出现乱码;低功耗唤醒后忘记恢复时钟也是常见原因。

RTC 为什么常用 32.768kHz 的外部晶振?

32.768kHz = 2^15 Hz,分频后正好得到 1 秒的计数节拍,且极低功耗,适合掉电后仍走时、定时唤醒。

PLL、分频器、门控三者分别解决什么问题?

PLL 负责“倍频”得到更高主频;分频器负责“降压”适配不同外设;门控负责“开关”节省功耗。三者配合构成完整时钟树。

遇到问题?

如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

Released under the MIT License. Build Time 2026-09-11 14:52:23