STM32时钟系统(RCC)配置与时钟树深度解析 | 零基础入门STM32第四十一步

主题内容教学目的/扩展视频
RCC时钟的设置什么是RCC时钟,如何改主频,如何切换时钟源。认识需要时钟的各功能与总线。学会主频的修改,了解各种功能的时钟开关与设计。

师从洋桃电子,杜洋老师



回顾上期🔍STM32功能介绍—时钟、复位和电源 | 零基础入门STM32第五步


(图1:STM32时钟树结构图)

一、时钟树核心架构解析

1.1 时钟树全景示意图解

(根据时钟树图分析)

HSI
HSE
PLLCLK
HCLK
PCLK1
PCLK2
时钟源
分频/倍频器
系统时钟SYSCLK
AHB总线
APB1总线
APB2总线

1.2 关键路径参数详解

1.2.1 主时钟生成路径
  • HSE路径:4-16MHz → PLL倍频 → 72MHz SYSCLK
  • HSI路径:8MHz RC → 直接作为系统时钟或PLL输入
  • PLL配置:输入频率×2~16 → 输出最高72MHz
1.2.2 分频器配置规则
分频节点分频系数典型配置输出频率
AHB1/2/4/8/16/64/128/…/512172MHz
APB11/2/4/8/16236MHz
APB21/2/4/8/16172MHz
USB1/1.51.548MHz

二、时钟树关键模块详解

2.1 主时钟源选择

// 时钟源切换代码示例
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  // 选择PLL作为系统时钟
while(RCC_GetSYSCLKSource() != 0x08);      // 等待切换完成
时钟源对比表
时钟源路径说明应用场景
HSI内部8MHz RC → 直接使用或PLL输入备用时钟/低功耗
HSE外部4-16MHz晶振 → PLL倍频高精度主时钟
PLLCLKHSI/HSE倍频后的时钟输出系统主时钟

2.2 外设时钟分配

// APB1总线外设时钟使能(TIM2-4, I2C1等)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_I2C1, ENABLE);

// APB2总线外设时钟使能(ADC1, SPI1等)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_SPI1, ENABLE);
时钟使能规则
  • APB1总线:最大36MHz,控制DAC、I2C、普通定时器等
  • APB2总线:最大72MHz,控制ADC、高级定时器、GPIO等
  • 定时器倍频:当APB分频≠1时,定时器时钟自动×2

三、时钟树配置实战案例

3.1 72MHz主频配置流程

void RCC_Configuration(void) {
    // 1. 启用HSE晶振
    RCC_HSEConfig(RCC_HSE_ON);
    while(!RCC_WaitForHSEStartUp());

    // 2. 配置PLL(HSE作为输入源)
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 8MHz×9=72MHz
    
    // 3. 设置总线分频
    RCC_HCLKConfig(RCC_SYSCLK_Div1);   // AHB=72MHz
    RCC_PCLK1Config(RCC_HCLK_Div2);    // APB1=36MHz
    RCC_PCLK2Config(RCC_HCLK_Div1);    // APB2=72MHz

    // 4. 配置FLASH等待周期
    FLASH_SetLatency(FLASH_Latency_2); // 72MHz需2个等待周期
    
    // 5. 切换系统时钟源
    RCC_PLLCmd(ENABLE);
    while(!RCC_GetFlagStatus(RCC_FLAG_PLLRDY));
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while(RCC_GetSYSCLKSource() != 0x08);
}

完整工程代码示例⏬超级终端显示日历程序

3.2 USB时钟配置(扩展)

// 配置USB时钟为48MHz
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); // 72MHz/1.5=48MHz
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);

四、时钟树重点参数速查

4.1 频率限制表

模块最大频率配置要点
SYSCLK72MHz需配合FLASH等待周期
APB136MHz定时器自动倍频机制
APB272MHz高速外设时钟源
USB48MHz必须精确配置分频系数
ADC14MHz影响转换精度,需降频使用

4.2 分频系数计算公式

APB1定时器实际频率

f_{TIM} = \begin{cases} 
f_{PCLK1} & \text{if } prescaler = 1 \\
2 \times f_{PCLK1} & \text{otherwise}
\end{cases}

USB时钟计算

f_{USB} = \frac{f_{PLLCLK}}{1.5} = 48MHz \quad (\text{当 } f_{PLLCLK}=72MHz)

五、时钟树调试技巧

5.1 时钟输出监测

// 通过MCO引脚输出时钟信号
RCC_MCOConfig(RCC_MCO_SYSCLK);  // 将SYSCLK输出到PA8引脚

5.2 时钟状态检测

// 检查HSE就绪状态
if(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == SET) {
    // HSE启动成功
}

// 获取当前系统时钟源
switch(RCC_GetSYSCLKSource()) {
    case 0x00: printf("HSI作为系统时钟"); break;
    case 0x04: printf("HSE作为系统时钟"); break; 
    case 0x08: printf("PLL作为系统时钟"); break;
}

六、相关资源

[1] 洋桃电子B站课程-STM32入门100步
[2] STM32F103xx官方数据手册
[3] STM32F103X8-B数据手册(中文)
[4] STM32F103固件函数库用户手册(中文)
[5] 超级终端显示日历程序


💬 技术讨论(请在评论区留言~)

📌 下期预告:下一期将探讨触摸按键的原理与驱动,欢迎持续关注!

点击查阅🔍往期【STM32专栏】文章

版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志

  • v1.0 初始版本(2025-02-28)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值