🔬 实验08:时钟实验

📌 实验目标
  • 掌握 STM32 系统时钟的配置方法
  • 理解时钟树结构和 PLL 倍频原理
  • 学会配置 HSE、PLL、SYSCLK
  • 掌握 SystemCoreClock 变量的使用

一、实验内容

  1. 使用 HSE(外部晶振)作为时钟源
  2. 配置 PLL 倍频到 72MHz
  3. 监测不同时钟频率下 LED 闪烁速度的变化
  4. 学习 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 == 36000000
main.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 循环
   在更低主频下需要更长的实际时间。这就是「时钟频率怎么用」。 */
💡 这段代码怎么用?
  1. system_stm32f10x.c 中切换 SYSCLK_FREQ_xxMHz 宏,即可改变整颗芯片主频
  2. 编译下载后观察 LED 闪烁速度变化,直观体会「主频越高、同样代码执行越快」
  3. 配合串口打印 SystemCoreClock,可实时确认当前实际主频(详见实验 11 串口发送)
⚠️ 注意事项
  • 修改宏后 SystemInit() 会自动重新配置 PLL 倍频,但要保证结果 ≤ 72MHz
  • 外设时钟跟着总线走:APB1 ≤ 36MHz、APB2 ≤ 72MHz,超出上限的外设会不稳定
  • 如果板载晶振不是 8MHz,PLL 倍频结果会偏离预期——先确认原理图晶振值

四、参考资料

资料文件
时钟实验 PPT实验3 时钟.pptx
实验指导文档实验3 时钟.docx
代码工程8.timeLED.rar