这一章在干嘛?
看懂 STM32F4 时钟树全景:HSE / HSI / PLL / SYSCLK / AHB / APB1 / APB2 / 各类外设时钟关系。学会用 CubeMX 或代码修改主频,并掌握外设时钟使能 API。
11.1 认识时钟树
STM32F407 时钟源:
| 时钟源 | 频率 | 特点 |
|---|---|---|
| HSE 外部晶振 | 4~26 MHz(开发板 8 MHz) | 精准,推荐用 |
| HSI 内部 RC | 16 MHz | 上电默认,省晶振时用 |
| LSE 外部 | 32.768 kHz | RTC 专用 |
| LSI 内部 | 约 32 kHz | 独立看门狗 |
| PLL | HSE/HSI 倍频 | 主时钟源 |
原书图 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 配置路径
注意: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 配置流程图
STM32F407 主频最高多少?
168 MHz。
HSE 8MHz 想得到 168MHz,PLL 的 M/N/P 怎么配?
M=4, N=168, P=2。
168 MHz 时 APB1 最高频率是多少?
84 MHz。
主频改变后为什么要重设 Flash 等待周期?
CPU 取指速度跟不上 Flash 读取速度,需插入等待周期。