示例成品 · 平台演示,按左边这组点选真跑出来的
我这边没看到你上传的实际文件内容,所以不能直接替你标红。下面给你一套**直接能用的核对表和报告草稿**。10%偏差,第一嫌疑是:**HSE_VALUE/PLL倍频系数配置和实板不一致**,不是晶振温漂。
---
## 一、按顺序查这5个环节
### 1. 时钟源选哪个
查 HAL 配置:
```c
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
```
或者寄存器:
- `RCC->PLLCKSELR` 的 `PLLSRC` 应选择 HSE,不是 HSI。
如果你代码里写的是 HSE,但实际 PLL 源选了 HSI,频率会不对。
---
### 2. 晶振实际多大
不要只看代码,要确认板上晶振实际值:
- 看原理图/晶振丝印,常见:25MHz、24MHz、8MHz。
- 用示波器量 MCO 输出 HSE 频率。
- 重点核对宏:
```c
// stm32h7xx_hal_conf.h
#define HSE_VALUE 25000000U
```
如果板子实际是 24MHz,但宏还是 25MHz,后面所有频率都偏。
---
### 3. PLL倍频多少
HAL 里重点看这几个数:
```c
RCC_OscInitStruct.PLL.PLLM = ?;
RCC_OscInitStruct.PLL.PLLN = ?;
RCC_OscInitStruct.PLL.PLLP = ?;
```
SYSCLK 计算:
```text
SYSCLK = HSE / PLLM * PLLN / PLLP
```
例如:
```text
25MHz / 5 * 160 / 2 = 400MHz
```
如果你配置出来是 400MHz,实测 440MHz,那不是 PLLN 写大就是 PLLP 写错,刚好差 10%。
---
### 4. 外设挂哪路
UART 乱码重点看 UART 时钟源和 APB 分频。
STM32H7 常见:
- USART1/6:APB2
- USART2/3、UART4/5/7/8:APB1
还要查:
- `RCC->D2CCIP2R` 中 UART 时钟源选择位
- `D2PPRE1`、`D2PPRE2` 分频系数
UART 波特率:
```text
波特率 = UART时钟 / UART_BRR / 16
```
如果 SYSCLK 差 10%,UART 时钟也会差 10%,波特率就偏 10%,必乱码。
---
### 5. 实测频率多少
最直接两种测法:
#### 方式 A:MCO 测 SYSCLK
把 MCO1 输出到 PA8,用示波器量。
#### 方式 B:测 UART TX 位宽
115200 波特率:
```text
位宽 = 1 / 115200 = 8.68us
```
如果实测位宽是:
```text
7.9us -> 偏快 10%
9.5us -> 偏慢 10%
```
那就可以确认 UART 时钟确实偏了 10%。
---
## 二、核对表
| 核对项 | 代码/配置值 | 实测/实际值 | 期望关系 | 判定 |
|---|---|---|---|---|
| 时钟源 | HSE | HSE | 一致 | ✅ |
| 外部晶振 | HSE_VALUE = ____MHz | ____MHz | 相等 | 🔴/✅ |
| PLL M | PLLM = ____ | ____ | HSE/PLLM 在手册范围 | 🔴/✅ |
| PLL N | PLLN = ____ | ____ | 满足目标 SYSCLK | 🔴/✅ |
| PLL P | PLLP = ____ | ____ | 满足目标 SYSCLK | 🔴/✅ |
| SYSCLK | ____MHz | ____MHz | 偏差 <0.5% | 🔴/✅ |
| UART挂在 | USARTx,APBy | PCLK = ____MHz | UART 时钟源正确 | 🔴/✅ |
| UART波特率 | ____bps | 位宽 ____us | 偏差 <2% | 🔴/✅ |
**标红规则:**
- 频率偏差 ≥2%:标红
- UART 波特率误差 ≥2%:标红,基本必乱码
- 10% 偏差:直接红,不要犹豫
---
## 三、报告草稿,可直接改
```text
STM32H7 时钟核对报告
结论:
配置与实测不一致。主要偏差项为:
🔴 SYSCLK:配置 400MHz,实测 440MHz,偏差 +10%
🔴 UART 波特率:配置 115200,实测约 126000,偏差 +10%
原因:
PLLN/PLLP 配置与实板晶振不匹配,或者 HSE_VALUE 与实际晶振不一致。
处理:
1. 改 HSE_VALUE = 实际晶振频率
2. 重算 PLLM/PLLN/PLLP
3. 重新核对 UART 所在总线时钟
4. 重新烧录并复测 MCO/UART 位宽
```
---
## 四、你现在最需要给我的数字
如果你把下面这些值贴出来,我可以直接帮你算完并标红:
```text
HSE_VALUE = ?
PLLM = ?
PLLN = ?
PLLP = ?
HPRE / D2PPRE1 / D2PPRE2 = ?
UART几?波特率多少?
UART时钟源选择位 = ?
示波器实测频率或UART位宽 = ?
```
**先把 HSE_VALUE 和 PLLN/PLLP 这三个数贴出来,基本就能锁定问题。**
点左边「开工 · 直接出成品」,出一份你自己的版本(文字免费)