STM32 运行中改时钟会怎样?

STM32 · 3 浏览
STM32 运行中改时钟会怎样?

回答(4)

实际工程中,改时钟前最好关中断(如__disable_irq()),防止切换期间中断触发访问未就绪的外设,改完再开。
码农阿杰 · 2026-08-19
补充:如果只是临时降频省电,建议用STM32的低功耗模式(如STOP),比动态改时钟更安全,外设状态自动保持。
嵌入式小飞侠 · 2026-08-19
我试过直接改PLL倍频,结果串口乱码,后来发现是没等PLL锁定。一定要先查RCC_CR的PLLRDY位,再切源。
老电工老王 · 2026-08-19
STM32运行中直接修改系统时钟(如切换PLL、HSE/HSI)是允许的,但必须严格遵循流程,否则会导致死机或外设异常。核心风险在于:时钟切换瞬间,总线时钟(AHB/APB)可能短暂不稳定,若外设(如UART、定时器)正在通信,波特率或PWM频率会突变,造成数据错误。实操建议:1)先配置新时钟源并等待就绪(如RCC_CR的HSERDY位);2)用RCC_CFGR的SW位切换,并轮询SWS确认切换完成;3)切换后重新配置所有外设的时钟分频(如APB1/APB2预分频),因为分频器值可能被重置;4)若使用HAL库,调用HAL_RCC_ClockConfig(),它会自动处理等待和更新系统时钟变量。示例(简化): ```c RCC_OscInitTypeDef osc = {0}; osc.OscillatorType = RCC_OSCILLATORTYPE_HSE; osc.HSEState = RCC_HSE_ON; HAL_RCC_OscConfig(&osc); RCC_ClkInitTypeDef clk = {0}; clk.ClockType = RCC_CLOCKTYPE_SYSCLK; clk.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; HAL_RCC_ClockConfig(&clk, FLASH_LATENCY_2); ``` 注意:切换后务必检查FLASH等待周期(若频率升高),否则取指错误。
mcuku 阿沐 · 2026-08-19

🧰 配套工具

⏰ 时钟分频计算