正点原子 STM32F407 时钟配置笔记:25MHz 闪退至 8MHz 晶振修改指南
📌 背景背景
ST 官方固件库(包括标准库和 HAL 库)默认是基于官方评估板(Discovery)设计的,其外部高速晶振(HSE)频率默认为 25MHz。
然而,正点原子(Alientek)STM32F407 开发板(如探索者、最小系统板)板载的外部晶振实际为 8MHz。
🚨 如果不修改的后果:
若直接使用官方默认配置,会导致单片机内部的主频计算基准错误,系统时钟彻底错乱,具体表现为:
-
❌ 串口通信乱码(波特率计算错误,例如设定的 115200 实际变成了错乱的数值)。
-
❌
Delay延时严重不准(延时函数会变慢约 3 倍,Delay_ms(1000)实际会变成约 3 秒)。
🛠️ 解决方案
根据项目所使用的库类型,选择以下对应的修改方案:
方案一:标准库(Standard Peripheral Library)
标准库需要手动修改源码工程中的两个宏定义。
1. 修改外部晶振主频宏定义
-
目标文件:
stm32f4xx.h -
操作方法:全局搜索
HSE_VALUE,将原有的25000000修改为8000000。
// ==================== 修改前 ====================
#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#endif
// ==================== 修改后 ====================
#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)8000000) /*!< 将 25M 修改为 8M */
#endif
2. 修改 PLL 输入分频系数
-
目标文件:
system_stm32f4xx.c -
操作方法:全局搜索
PLL_M。为了让输入给 PLL(锁相环) 的时钟保持为 1MHz 以便后续倍频至 168MHz 主频,必须将分频系数由 25 改为 8。
// ==================== 修改前 ====================
// 25MHz 晶振时:25MHz / 25 = 1MHz 输入给 PLL
#define PLL_M 25
// ==================== 修改后 ====================
// 8MHz 晶振时:8MHz / 8 = 1MHz 输入给 PLL
#define PLL_M 8
⚠️ 注意:修改完成后,务必在 Keil 中点击 Rebuild(全编译按钮,即三个箭头的图标),只点 Build(单个箭头)可能不会触发这两个头文件的重新编译。
方案二:HAL库 / STM32CubeMX
如果在图形化工具中开发,无需手动改代码,直接在软件的时钟树中进行图形化配置。
-
使能 HSE:
在左侧控制栏点击
Clock Configuration->RCC,将High Speed Clock (HSE)配置为 Crystal/Ceramic Resonator(外部晶振)。 -
修改输入频率:
点击上方的 Clock Configuration 标签页进入时钟树界面。
-
更改基准值:
找到左侧的 Input Frequency 输入框,把默认的
25手动改为8。 -
锁定最高主频:
在最右侧的系统主频 HCLK 框中输入
168MHz,敲击回车,CubeMX 就会自动计算并配置好内部所有的 M、N 分频与倍频系数。
💡 验证时钟是否配置成功
完成上述修改并烧录后,可以通过以下“最土但最有效”的方法来测试时钟是否完全恢复正常:
在 main.c 的主循环中编写一个简单的 LED 翻转延迟程序:
int main(void)
{
Delay_Init();
LED_Init(); // 假设已经初始化好 LED
while(1)
{
LED_Toggle(); // 翻转 LED 灯状态
Delay_ms(1000); // 严格延时 1 秒
}
}
-
正常现象:用手机秒表肉眼观察,如果 LED 灯非常严格地每隔 1 秒闪烁一次,代表时钟完全配置正确,后续的串口通信、定时器也都能精准工作。
-
异常现象:如果灯闪烁得极慢(等了差不多 3 秒才闪一下),说明
PLL_M或HSE_VALUE有某个地方漏改或没全编译。

浙公网安备 33010602011771号