📖 第 11 章:STM32时钟系统(STM32 Clock System)

🔧 正点原子《DMF407 开发指南》V1.0 · Chapter 11
🗨️ 「时钟是 STM32 一切外设的节拍器:配错时钟 = 一切外设都不准。」
这一章在干嘛? 看懂 STM32F4 时钟树全景:HSE / HSI / PLL / SYSCLK / AHB / APB1 / APB2 / 各类外设时钟关系。学会用 CubeMX 或代码修改主频,并掌握外设时钟使能 API。
11.1 认识时钟树11.2 如何修改主频

11.1 认识时钟树

STM32F407 时钟源:

时钟源频率特点
HSE 外部晶振4~26 MHz(开发板 8 MHz)精准,推荐用
HSI 内部 RC16 MHz上电默认,省晶振时用
LSE 外部32.768 kHzRTC 专用
LSI 内部约 32 kHz独立看门狗
PLLHSE/HSI 倍频主时钟源

原书图 11.1.1:STM32F407 时钟树全景
原书图 11.1.1:STM32F407 时钟树全景

主时钟路径:

HSE 8MHz → /M (÷4) → ×N (×168) → /P (÷2) → SYSCLK 168MHz
                                  → /Q (÷7) → 48MHz (USB/SDIO/RNG)

SYSCLK → AHB prescaler (÷1) → HCLK = 168 MHz → APB1 prescaler (÷4) → PCLK1 = 42 MHz(外设时钟,但定时器时钟仍为 84 MHz)→ APB2 prescaler (÷2) → PCLK2 = 84 MHz。

原书图 11.1.2.1:PLL 配置路径
原书图 11.1.2.1:PLL 配置路径

注意:APB 分频系数 = 1 时外设时钟 = HCLK,否则 = HCLK × 2(手册里有这坑)。

11.2 如何修改主频

11.2.1 通过 CubeMX

Clock Configuration 标签页直接拖,蓝色字警告越界。

11.2.2 通过代码(HAL 库)

关键函数 HAL_RCC_OscConfig() 配置 HSE/HSI/PLL,HAL_RCC_ClockConfig() 配置 SYSCLK/AHB/APBx:

RCC_OscInitTypeDef osc = {0};
osc.OscillatorType = RCC_OSCILLATORTYPE_HSE;
osc.HSEState = RCC_HSE_ON;
osc.PLL.PLLState = RCC_PLL_ON;
osc.PLL.PLLSource = RCC_PLLSOURCE_HSE;
osc.PLL.PLLM = 4;
osc.PLL.PLLN = 168;
osc.PLL.PLLP = RCC_PLLP_DIV2;
osc.PLL.PLLQ = 7;
HAL_RCC_OscConfig(&osc);

RCC_ClkInitTypeDef clk = {0};
clk.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
                RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
clk.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
clk.AHBCLKDivider = RCC_SYSCLK_DIV1;
clk.APB1CLKDivider = RCC_HCLK_DIV4;
clk.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&clk, FLASH_LATENCY_5);

Flash 等待周期:168 MHz 必须配 5 WS,否则从 Flash 取指会出错。

原书图 11.2.2.1:HAL_RCC_OscConfig 配置流程图
原书图 11.2.2.1:HAL_RCC_OscConfig 配置流程图

🧠 小测验
STM32F407 主频最高多少?
168 MHz。
HSE 8MHz 想得到 168MHz,PLL 的 M/N/P 怎么配?
M=4, N=168, P=2。
168 MHz 时 APB1 最高频率是多少?
84 MHz。
主频改变后为什么要重设 Flash 等待周期?
CPU 取指速度跟不上 Flash 读取速度,需插入等待周期。
← 上一篇🏠 顶层目录下一篇 →