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