STM32时钟系统RCC配置详解与时钟树深度解析——零基础入门STM32第X课(四十一)
| 主题 | 内容 | 教学目的/扩展视频 |
|---|---|---|
| RCC时钟的设置 | 什么是RCC时钟,如何改主频,如何切换时钟源。认识需要时钟的各功能与总线。 | 学会主频的修改,了解各种功能的时钟开关与设计。 |
师从洋桃电子,杜洋老师
📑文章目录
▲ 回顾上期🔍STM32功能介绍—时钟、复位和电源 | 零基础入门STM32第五步
(图1:STM32时钟树结构图)
一、时钟树核心架构解析
1.1 时钟树全景示意图解
(根据时钟树图分析)
HSI
HSE
PLLCLK
HCLK
PCLK1
PCLK2
时钟源
分频/倍频器
系统时钟SYSCLK
AHB总线
APB1总线
APB2总线
1.2 关键路径参数详解
1.2.1 主时钟生成路径
1.2.2 分频器配置规则
| 分频节点 | 分频系数 | 典型配置 | 输出频率 |
|---|---|---|---|
| AHB | 1/2/4/8/16/64/128/…/512 | 1 | 72MHz |
| APB1 | 1/2/4/8/16 | 2 | 36MHz |
| APB2 | 1/2/4/8/16 | 1 | 72MHz |
| USB | 1/1.5 | 1.5 | 48MHz |
二、时钟树关键模块详解
2.1 主时钟源选择
// 时钟源切换代码示例
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 选择PLL作为系统时钟
while(RCC_GetSYSCLKSource() != 0x08); // 等待切换完成
时钟源对比表
| 时钟源 | 路径说明 | 应用场景 |
|---|---|---|
| HSI | 内部8MHz RC → 直接使用或PLL输入 | 备用时钟/低功耗 |
| HSE | 外部4-16MHz晶振 → PLL倍频 | 高精度主时钟 |
| PLLCLK | HSI/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);
时钟使能规则
三、时钟树配置实战案例
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 频率限制表
| 模块 | 最大频率 | 配置要点 |
|---|---|---|
| SYSCLK | 72MHz | 需配合FLASH等待周期 |
| APB1 | 36MHz | 定时器自动倍频机制 |
| APB2 | 72MHz | 高速外设时钟源 |
| USB | 48MHz | 必须精确配置分频系数 |
| ADC | 14MHz | 影响转换精度,需降频使用 |
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)
作者:触角01010001