STM32 系统时钟变慢
STM32 系统时钟变慢
好的,STM32 系统时钟变慢通常是由几个主要原因造成的。以下是详细的排查方向和解决方案:
1. 时钟源切换(最常见)
- 现象: 原本使用高速外部晶振(HSE),但系统实际运行在低速内部时钟(HSI)上。
- 原因:
- 硬件问题导致 HSE 失效:
- 晶振损坏: 物理损坏或老化。
- 负载电容不正确/损坏: 电容值不匹配晶振要求(通常参考数据手册或晶振规格书),或者电容本身损坏、虚焊。
- 焊接不良: 晶振引脚、电容引脚、MCU 相关引脚(OSC_IN/OSC_OUT)虚焊、冷焊。
- PCB 布线问题: 晶振走线过长、靠近噪声源、未按高速信号要求布局布线(参考阻抗、包地等)。
- 电源噪声: 晶振供电电源不稳定或有较大噪声。
- 软件配置问题:
- 时钟配置错误: 初始化代码中错误地选择了 HSI 作为系统时钟源,或者根本没有正确配置 HSE 和 PLL。
- 意外切换: 程序在运行中错误地将系统时钟源切换到了 HSI(例如调试中断后错误修改寄存器)。
- 时钟安全系统(CSS)触发:
- STM32 的时钟安全系统如果使能,在检测到 HSE 失效时会自动将系统时钟切换到 HSI,并通过中断或 NMI 通知用户。这是安全机制,但会导致时钟变慢。
- 硬件问题导致 HSE 失效:
- 排查:
- 读取时钟源寄存器: 使用调试器(如 STM32CubeIDE, Keil, IAR)查看
RCC->CFGR寄存器中的SWS位。它指示当前的系统时钟源。如果是HSI而非预期的PLL(通常 PLL 由 HSE 驱动),说明问题出在时钟源上。 - 检查 CSS 状态: 查看
RCC->CSR寄存器中的CSSF标志位。如果置位,说明 HSE 失效触发了 CSS。 - 检查 HSE 状态: 查看
RCC->CR寄存器中的HSERDY和HSEON位。HSEON应该是 1(已开启),HSERDY也应该是 1(就绪稳定)。如果HSERDY为 0,说明 HSE 没有就绪。 - 硬件检查:
- 用示波器测量 OSC_IN 和 OSC_OUT 引脚波形(注意探头负载电容影响)。
- 检查晶振规格(频率、负载电容)是否正确。
- 检查负载电容值(通常 8-22pF,具体看晶振规格书和 STM32 参考手册)是否正确,焊接是否良好。
- 检查晶振本身是否损坏(替换法)。
- 检查电源滤波电容是否充足。
- 检查时钟配置代码: 仔细检查
SystemClock_Config()函数(或类似初始化时钟的函数)。确保:HSE被启用 (__HAL_RCC_HSE_ENABLE()或直接写RCC->CRbit)。HSE被成功选择为 PLL 源 (RCC_PLLSOURCE_HSE或对应寄存器配置)。- PLL 的倍频因子(
PLLM,PLLN,PLLP)设置正确,使得 PLL 输出达到目标系统时钟频率。 - 系统时钟源最终被正确设置为 PLL (
__HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_PLLCLK)或对应寄存器配置)。 - 等待时钟源切换完成(检查
RCC->CFGR的SWS位或使用__HAL_RCC_GET_SYSCLK_SOURCE()等待稳定)。
- 简化测试: 尝试最简代码(只初始化 GPIO 并翻转一个引脚),用逻辑分析仪或示波器测量翻转频率是否与预期时钟一致。
- 读取时钟源寄存器: 使用调试器(如 STM32CubeIDE, Keil, IAR)查看
? 2. PLL 配置错误
- 现象: 虽然使用了 HSE,但 PLL 的倍频/分频系数设置错误,导致 PLL 输出的系统时钟低于预期。
- 原因:
- 计算错误或代码中输入的
PLLN(主要倍频系数),PLLM(预分频),PLLP(系统时钟分频除数) 值不正确。 - 超出了芯片允许的频率范围(最大 SYSCLK 频率)。
- 输入频率 (
HSE / PLLM) 超出 PLL 输入频率范围(通常 1-2MHz 到 24MHz 左右,具体查芯片手册)。
- 计算错误或代码中输入的
- 排查:
- 检查 PLL 配置寄存器: 查看
RCC->PLLCFGR寄存器,确认PLLM,PLLN,PLLP的实际设置值。 - 重新计算: 严格按照目标频率和芯片手册规定的公式计算:
VCO 输出频率 = (HSE 频率 / PLLM) * PLLN系统时钟频率 (SYSCLK) = VCO 频率 / PLLP确保VCO 频率在芯片规定的范围(如 100-432MHz)。确保SYSCLK不超过最大额定值(如 72MHz, 168MHz, 取决于型号)。确保(HSE 频率 / PLLM)在 PLL 输入频率范围(如 1-24MHz)。 - 核对代码: 与芯片参考手册中时钟树图核对配置代码。
- 使用 STM32CubeMX: 使用图形化工具配置时钟并生成代码,确保配置有效且符合约束。
- 检查 PLL 配置寄存器: 查看
3. AHB/APB 预分频器设置过大
- 现象: 系统时钟
SYSCLK本身频率正确,但 Cortex 核心使用的HCLK或外设使用的PCLK1/PCLK2被分频器降低了。 - 原因:
RCC->CFGR寄存器中HPRE(AHB 预分频),PPRE1(APB1 预分频),PPRE2(APB2 预分频) 设置过大(分频系数过大)。 - 排查:
- 检查预分频器寄存器: 查看
RCC->CFGR中的HPRE,PPRE1,PPRE2位域设置。 - 核对预期: 确认这些分频系数是否是你需要的。例如,如果目标是
HCLK = SYSCLK,那么HPRE应该设置为1(不分频)。如果PPRE1被设置为0b101(HCLK 分频 4),则PCLK1频率只有HCLK/4。 - 注意外设限制: 某些外设(如 APB1 上的定时器、I2C)有最大时钟频率限制。过高的频率会导致外设工作异常(此时分频是必要的),但分频过大会导致外设运行变慢。这里的"变慢"主要是指外设,但有时用户会观察到整体响应变慢。
- 检查预分频器寄存器: 查看
? 4. 低功耗模式影响
- 现象: 系统进入了某个低功耗模式(Sleep, Stop, Standby),核心时钟停止或大幅降低。
- 原因: 程序主动进入低功耗模式,或者由于错误(如未正确处理中断、看门狗复位后错误状态)意外进入。
- 排查:
- 检查电源控制寄存器: 查看
PWR->CR和PWR->CSR寄存器,看是否进入了低功耗模式 (LPDS,PDDS,SBF等位)。 - 检查唤醒源: 检查程序是否在预期的时间内被唤醒(如定时器中断、外部中断)。
- 调试跟踪: 使用调试器暂停程序,查看程序是否卡在等待进入低功耗模式的循环(如
__WFI(),__WFE())中,或者是否在低功耗模式的唤醒处理函数中卡住。 - 检查中断: 确认唤醒所需的中断优先级设置正确,并且中断服务函数存在并能清除中断标志?️。
- 检查电源控制寄存器: 查看
? 5. 环境或硬件问题
- 原因:
- 温度影响: 内部 RC 振荡器 (HSI, LSI) 的频率随温度变化有一定漂移。如果依赖 HSI 且温度变化大,会引起轻微的频率变化(通常达不到"变慢"的程度,除非设计在临界点)。
- 电源电压影响: 供电电压过低或不稳,可能影响内部 RC 振荡器的稳定性或导致外部晶振工作异常。芯片可能进入欠压复位状态或工作不稳定。
- 噪声干扰: 强烈的电磁干扰可能影响晶振振荡或时钟信号完整性。
- 芯片损坏: 极少见,但时钟相关电路损坏也可能导致问题。
- 排查:
- 监测工作环境温度和电源电压是否在正常范围内。
- 检查电源稳定性,增加滤波电容。
- 在干扰环境下加强屏蔽和滤波。
- 更换芯片(最后手段)。
? 总结排查步骤建议
- 确认现象: 如何判断时钟变慢了?(比如:定时器定时不准、通信波特率错误、LED 闪烁变慢?)测量具体的外设工作频率(如 GPIO 翻转频率、定时器输出频率)是金标准。
- 读取关键寄存器(调试器):
RCC->CFGR:查看SW(目标源),SWS(实际源),HPRE,PPRE1,PPRE2,PLLSRC,PLLMUL(旧型号)/PLLCFGR(新型号 PLL 系数)。RCC->CR:查看HSION/HSIRDY,HSEON/HSERDY,PLLON/PLLRDY,CSSON(如果使用)。RCC->CSR:查看LSION/LSIRDY,CSSF(时钟安全系统标志)。PWR->CR/PWR->CSR:检查低功耗模式状态。
- 硬件检查:
- 示波器测量外部晶振引脚(频率、波形幅度)。
- 检查晶振型号、负载电容(值、焊接)。
- 检查供电电压和纹波。
- 软件检查:
- 仔细审查
SystemClock_Config()函数及其调用的底层函数。 - 确认使用 STM32CubeMX 配置时钟树是有效的(或手动计算符合约束)。
- 检查是否有意外修改时钟配置的地方。
- 检查低功耗模式进入/退出逻辑和中断处理。
- 仔细审查
- 简化测试: 创建一个仅初始化时钟和 GPIO 的简单程序,测量 GPIO 翻转频率并与预期值对比。
? 核心点: 绝大多数"时钟变慢"问题都是由 外部晶振未能成功起振导致系统回退到低速的内部时钟源 引起的。首先重点检查 HSE 相关的硬件(晶振、电容、焊接、布线)和软件配置(是否启用、是否用作 PLL 源、PLL 配置是否正确)以及 CSS 状态。
希望以上详细分析能帮你快速定位并解决 STM32时钟变慢的问题!
STM32F103C8T6时钟RTC每次启动变慢1s是为什么?
本人使用STM32F103C8T6自身的RTC时钟制作了一个时钟定时器,运行正常,但是发现一个问题:每次上电启动10次,大约会
STM32F103定时器变慢的原因?怎么解决?
STM32F103 利用定时器设置按键带长按功能和短按键,按键按键是系统关机,短按只是控制led亮灭。但是有时总会出现长按按键变成了控制led,长按时间也足够的长,在观察led的亮灭的频率也
STM32入门系列-STM32时钟系统,STM32时钟树
时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。时钟
资料下载
陈键
2022-01-17 11:22:35
GD32低功耗:深度睡眠唤醒系统时钟变慢问题
一、问题1、进入深度睡眠后,通过外部中断唤醒,发现系统时钟变慢。2、进入休眠模式,通过任何中断唤醒,
资料下载
王静
2021-12-02 15:06:13
理解STM32系统时钟和分频资料下载
电子发烧友网为你提供理解STM32系统时钟和分频资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用
资料下载
贾伟刚
2021-04-20 08:43:42
GD32进入深度睡眠后通过外部中断唤醒发现系统时钟变慢的原因
一、问题1、进入深度睡眠后,通过外部中断唤醒,发现系统时钟变慢。2、进入休眠模式,通过任何中断唤醒,
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机