锁相环是什么,为什么可以用来放大时钟频率,怎么做到的,还有预分频起,为什么可以进行分频和倍频?

一、锁相环(PLL)是什么?

锁相环(Phase-Locked Loop,PLL) 是一种反馈控制电路,它的核心功能是:

  • 使输出信号的相位与参考信号的相位保持同步

  • 从而间接使频率也同步,并且可以按设定比例放大频率

PLL 的基本组成(4个部分):

外部时钟(如8MHz晶振)

  1. 鉴相器(Phase Detector, PD) ← 比较参考时钟和反馈时钟的相位差

  1. 低通滤波器(Low-Pass Filter, LPF) ← 将相位差转换为电压信号(平滑)

  1. 压控振荡器(Voltage-Controlled Oscillator, VCO) ← 电压控制输出频率

  1. 分频器(/N) ← 将输出分频后反馈给鉴相器

└─────────────┘

这是一个闭环负反馈系统


二、PLL 如何"放大"频率?

关键在分频器(/N)

工作过程:

  1. 参考频率 = 外部晶振频率(如 8 MHz)

  2. 反馈回路 中有一个 ÷N 分频器

  3. 系统稳定时,鉴相器检测到的相位差为0,这意味着:

    参考频率=VCO输出频率N参考频率=NVCO输出频率

  4. 因此:

    VCO输出频率=参考频率×NVCO输出频率=参考频率×N

举例(STM32F103 常见配置):

外部晶振 = 8 MHz

PLL倍频系数 N = 9

则 PLL输出 = 8 MHz × 9 = 72 MHz

实际上PLL内部还有预分频器(M)后分频器(P、Q等),更完整的公式是:

fout=fin×N(M×P)fout​=fin​×(M×P)N​

在STM32F103中,常见的配置是输入8MHz,经过PLL后输出72MHz。


三、分频器为什么能分频?

数字分频原理(以预分频器为例):

分频器本质是一个计数器

  • 每输入 N 个时钟脉冲,输出 1 个脉冲

  • 例如 ÷2 分频器

输入时钟: (周期 T)

输出时钟: ▁▁▁▁▁▁_▁▁ (周期 2T)

频率减半,周期加倍。

实现方式:
  1. D触发器级联:每个D触发器实现÷2

    输入 → D1(Q) → D2(Q) → ... → 输出

    每个触发器在时钟上升沿翻转一次

  2. 计数器+比较器:可编程任意分频比

    计数器从0计数到N-1,然后复位并输出一个脉冲


四、为什么STM32F103C8T6要采用PLL作为系统时钟?

STM32F103C8T6的核心需求:

  • CPU需要高速运行(最高72 MHz)

  • 但外部晶振不能太高(通常4-16 MHz)

原因分析:

1. 高频晶振的缺点
  • 成本高

  • 体积大

  • 功耗大

  • 稳定性差(高频下更易受干扰)

2. PLL的优点
  • 使用低频晶振产生高频时钟(如8MHz晶振→72MHz系统时钟)

  • 频率灵活可调(通过配置倍频系数N)

  • 时钟质量好:PLL有滤波功能,输出时钟抖动小

  • 低功耗:外部晶振低频工作,内部PLL按需提供高频

3. STM32F103的时钟树结构

外部晶振 (HSE, 8MHz)

PLL倍频 (×9)

系统时钟 (SYSCLK, 72MHz)

分发给:CPU、AHB总线、APB总线等

4. 性能需求
  • 72 MHz 时钟使CPU能快速执行指令

  • 高速外设(如SPI、定时器)需要高时钟频率

  • 但又要保持外部电路的简洁和低成本


五、PLL的实际配置(STM32F103代码示例)

cs 复制代码
// 典型配置:8MHz晶振 -> 72MHz系统时钟
void SystemClock_Config(void) {
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    
    // 1. 使能HSE(外部8MHz晶振)
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    
    // 2. 配置PLL:输入8MHz,输出72MHz
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 倍频系数 N=9
    
    // 3. 设置AHB/APB分频
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;  // 系统时钟源选择PLL
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;        // AHB不分频 = 72MHz
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;         // APB1 = 36MHz(最大)
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;         // APB2 = 72MHz
}

六、总结对比表

特性 直接使用高频晶振 使用PLL(低频晶振+倍频)
外部晶振频率 高(如72MHz) 低(如8MHz)
成本
功耗 低(晶振部分)
频率灵活性 固定 可编程调节
时钟质量 一般 好(抖动小)
启动时间 稍长(PLL锁定时间)

核心要点记忆

  1. PLL不是"放大"能量 ,而是通过反馈控制生成高频时钟信号

  2. 分频器本质是计数器,数到N就输出一个脉冲

  3. STM32用PLL 是为了:低成本晶振 + 高性能运行的完美平衡

  4. 锁相是关键:通过比较相位差来调整频率,直到相位锁定

这就是为什么现代MCU几乎都使用PLL技术来生成系统时钟------它实现了成本、性能和灵活性的最佳平衡。

相关推荐
请叫我7plus1 小时前
用QEMU进行嵌入式Linux开发
linux·驱动开发·嵌入式硬件
YJlio1 小时前
Active Directory 工具学习笔记(10.3):AdExplorer 实战(三)— 配置与偏好、导出与安全
笔记·学习·安全
数据门徒1 小时前
《人工智能现代方法(第4版)》 第10章 知识表示 学习笔记
人工智能·笔记·学习
狐572 小时前
2025-12-04-LeetCode刷题笔记-2211-统计道路上的碰撞次数
笔记·算法·leetcode
Lynnxiaowen2 小时前
今天我们学习kubernetes内容Ingress资源对象
学习·容器·kubernetes
雍凉明月夜2 小时前
Ⅳ人工智能机器学习之监督学习的概述
人工智能·深度学习·学习
三块可乐两块冰2 小时前
【第二十二周】机器学习笔记二十一
人工智能·笔记·机器学习
IMPYLH2 小时前
Lua 的 type 函数
开发语言·笔记·后端·junit·lua
齐齐大魔王2 小时前
python爬虫学习进程(四)
爬虫·python·学习