🔬 实验08:时钟实验
📌 实验目标
- 掌握 STM32 系统时钟的配置方法
- 理解时钟树结构和 PLL 倍频原理
- 学会配置 HSE、PLL、SYSCLK
- 掌握 SystemCoreClock 变量的使用
一、实验内容
- 使用 HSE(外部晶振)作为时钟源
- 配置 PLL 倍频到 72MHz
- 监测不同时钟频率下 LED 闪烁速度的变化
- 学习 SystemCoreClockUpdate() 函数
二、SystemInit 函数
在启动文件 startup_stm32f10x_md.s 中,复位后首先调用 SystemInit() 函数进行时钟初始化。该函数位于 system_stm32f10x.c 中。
系统默认时钟配置为:HSI(8MHz) / 8 × 9 = 72MHz(前提是 HSE 可用)。
三、时钟配置代码
时钟频率由 system_stm32f10x.c 顶部的宏定义决定,改宏即可改主频,无需改其他代码:
修改系统时钟频率宏(system_stm32f10x.c)
/* system_stm32f10x.c 顶部注释掉的选项:
可选:SYSCLK_FREQ_24MHz / 36MHz / 48MHz / 56MHz / 72MHz */
// 只保留你需要的宏定义,其余注释掉:
#define SYSCLK_FREQ_72MHz 72000000 // 72MHz(课程默认)
// 改为 36MHz 只需换成:
// #define SYSCLK_FREQ_36MHz 36000000
// 初始化完成后系统时钟变为 36MHz,
// 用 SystemCoreClock 变量读取当前频率:SystemCoreClock == 36000000main.c — 验证时钟频率(LED 闪烁快慢)
#include "stm32f10x.h"
void Delay_loop(uint32_t n)
{
while (n--);
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能 GPIOB 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// PB5 推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
while (1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_5); // LED 亮(低电平有效)
Delay_loop(1000000);
GPIO_SetBits(GPIOB, GPIO_Pin_5); // LED 灭
Delay_loop(1000000);
}
}
/* 实验:把 SYSCLK_FREQ_72MHz 改成 SYSCLK_FREQ_36MHz 再编译下载,
会发现 LED 闪烁明显变慢 —— 说明同一个 Delay_loop 循环
在更低主频下需要更长的实际时间。这就是「时钟频率怎么用」。 */💡 这段代码怎么用?
- 在
system_stm32f10x.c中切换SYSCLK_FREQ_xxMHz宏,即可改变整颗芯片主频 - 编译下载后观察 LED 闪烁速度变化,直观体会「主频越高、同样代码执行越快」
- 配合串口打印
SystemCoreClock,可实时确认当前实际主频(详见实验 11 串口发送)
⚠️ 注意事项
- 修改宏后
SystemInit()会自动重新配置 PLL 倍频,但要保证结果 ≤ 72MHz - 外设时钟跟着总线走:APB1 ≤ 36MHz、APB2 ≤ 72MHz,超出上限的外设会不稳定
- 如果板载晶振不是 8MHz,PLL 倍频结果会偏离预期——先确认原理图晶振值
四、参考资料
| 资料 | 文件 |
|---|---|
| 时钟实验 PPT | 实验3 时钟.pptx |
| 实验指导文档 | 实验3 时钟.docx |
| 代码工程 | 8.timeLED.rar |