STM32U5 内置 HSI16、MSI、HSI48 等内部 RC 振荡器,温漂与电压波动会显著拉低频率精度;本文严格依据 AN5676 应用笔记,以LSE / 高精度外部信号为参考、TIM16 输入捕获为测量核心,通过最小误差、固定误差、校准曲线三种方案完成校准,搭配官方 X-CUBE-RC-CALIB 固件可快速落地,让内部 RC 时钟在全温域满足高精度应用要求。
资料获取:【应用笔记】AN5676 如何在 STM32U5 系列上校准内部 RC 振荡器
1. 校准必要性:出厂校准撑不住全温域工况
STM32U5 的内部 RC 振荡器均在 30℃ 完成出厂校准,在 - 40℃~125℃工业温域内,精度会明显劣化:
- HSI16:±0.5% → 温漂后偏差扩大
- MSI:±0.6% → 温漂后偏差扩大
- HSI48:±4% → 对 USB、RNG 等时序敏感外设不友好
内部 RC 虽有无外部元件、启动快、功耗低优势,但精度弱于外部晶振;仅靠出厂值无法满足通信、采样、计时等高精度场景,必须做用户级校准补偿温漂。
2. STM32U5 内部 RC 振荡器核心组成
STM32U5 提供多套内部 RC 时钟,分工明确,可覆盖系统时钟与专用外设时钟需求:
| 振荡器 | 典型频率 | 核心用途 | 校准支持 |
|---|---|---|---|
| HSI16 | 16 MHz | 系统时钟源 | 支持用户微调 |
| MSI | 100 kHz~48 MHz | 系统时钟 (MSIS)、外设时钟 (MSIK) | 支持用户微调 |
| HSI48 | 48 MHz | USB、RNG、SDMMC | 支持 CRS 自动校准 |
| LSI | 32 kHz | IWDG、RTC、LCD | 不可校准,仅支持测量 |
| SHSI | 48 MHz | SAES 专用安全时钟 | 专用校准 |
3. 校准核心原理与硬件实现
3.1 通用校准原理
- 把待校准 RC 振荡器设为系统时钟
- 接入高精度参考信号(LSE 32.768 kHz 优先,或 50/60 Hz 市电)
- 用 TIM16 输入捕获捕获参考信号周期,计算实际频率
- 算出频率误差,调整TRIM 微调位至最优值
- 写入微调值后等待15 μs稳定(频率过冲 / 下冲最大约 2.5%)
核心公式:
测量频率 = (IC1ReadValue2 - IC1ReadValue1) × 参考频率
频率误差 = | 测量频率 - 典型频率 |
3.2 两种硬件参考方案
方案 1:LSE 作参考(推荐,无额外接线)
- 硬件:仅需将 32.768 kHz LSE 晶振接 OSC32_IN/OSC32_OUT
- 配置:TIM16_CH1 内部直连 LSE,TI1SEL[3:0] = 5
方案 2:外部高精度信号作参考
4. 三种校准方法:适配不同场景需求
AN5676 提供三种校准策略,可按精度、耗时需求选择,均有配套固件函数:
| 校准方法 | 实现逻辑 | 优势 | 适用场景 | 核心函数 |
|---|---|---|---|---|
| 最小误差校准 | 遍历 32 个微调值,选误差最小点 | 精度最高 | 追求极致精度 | HSI16_CalibrateMinError() MSI_CalibrateMinError() |
| 固定误差校准 | 二分搜索,快速达标用户设定误差 | 速度快 | 有明确误差上限 | HSI16_CalibrateFixedError() MSI_CalibrateFixedError() |
| 校准曲线法 | 预存微调 - 误差表,单次测量查表补偿 | 速度最快 | 批量 / 重复校准 | HSI16_CalibrateCurve() MSI_CalibrateCurve() |
5. HSI48 专属校准:CRS 时钟恢复系统
HSI48 为 USB、RNG 等外设提供 48 MHz 时钟,采用6 位 TRIM [6:0] 微调,步长 0.12%(约 57 kHz),默认值 64。
STM32U5 内置CRS 时钟恢复系统,可全自动校准:
- CRS 测量频率误差
- 自动递增 / 递减 TRIM 值
- 达标后开启自动补偿,抵消实时温漂可先写入预计算值加速校准,再启用自动模式做平滑补偿。
6. LSI 振荡器:只测量、不校准
LSI 为 32 kHz 低速内部 RC,用于看门狗、RTC,不可校准,仅支持频率测量评估偏差。
测量步骤:
- HSI16 驱动 TIM16 计数器
- TIM16_CH1 内部直连 LSI,TI1SEL[3:0] = 6
- 输入捕获测周期,按公式计算:LSI 频率 = 输入捕获预分频 × HSI16 频率 / 捕获计数值官方提供LSI_FreqMeasure() 函数直接调用。
7. 官方固件:X-CUBE-RC-CALIB 快速上手
AN5676 配套X-CUBE-RC-CALIB扩展包,包含完整校准源码与示例工程:
- 支持 HSI16/MSI/HSI48 全系列校准、LSI 测量
- 默认用LSE 参考 + 最小误差法,可宏定义切换校准方式
- 校准结果通过 USART 打印,可直接观察校准前后频率差异
- 适配 Nucleo 开发板,开箱即用
8. 实操建议与校准性能
8.1 实操避坑
- 校准前暂停通信、ADC 等任务,避免时钟配置冲突
- 温度剧变时,用 ADC 看门狗触发实时校准
- 校准后重新配置 RCC、TIM16 等外设
- 高低频参考信号需合理设置 TIM16 预分频器
8.2 校准耗时(参考)
以 LSE 为参考(32768 Hz/8=4096 Hz)、测量周期 10 次:
校准时间 = (10+1)×32 / 4096 ≈ 86 ms
固定误差法耗时≤最小误差法,曲线法耗时最短。
STM32U5 内部 RC 振荡器校准以高精度参考 + TIM16 输入捕获为核心,三种方法覆盖精度与速度需求;HSI48 依托 CRS 实现全自动校准,LSI 可快速完成频率评估。配合官方 X-CUBE-RC-CALIB 固件,工程师可快速完成校准,让内部 RC 时钟在低成本、低功耗前提下,满足全温域高精度嵌入式应用需求。
128