在不影响外围设备的情况下更改 STM32 上的时钟频率?

Changing clock frequency on STM32 without impacting peripherals?

我对 STM32L486 时钟管理有点迷茫。

我想在 运行 时间更改时钟频率。通常我希望大部分时间处于低功耗 Run/Sleep 模式,其余时间处于全频率。

我知道如何使用 PLL 将 SysClk 设置为 80MHz 或使用 MSI 设置为 1MHz。

然而,问题是更改 Sysclk 会打乱大多数外围设备设置。例如,如果我更改时钟,USART 将不再工作。

这样做(在 运行 时间改变频率)是一种常见的做法吗?

我需要使用的外围设备是:LPTIM(没问题,因为它们可以独立于 SysClk 计时)、ADC、AES 加速器、USART、TIM、SPI。

在 STM32L4xx 上并不难,如果您查看数据表中的 "Clock tree" 图,许多依赖于时钟的外设(USART、LPTIM、I2C、..)可以使用除BUS时钟,也可以使用LSE或内部HSI。

虽然内部 HSI 不受 crystal 控制,但根据我的经验,对于 UART 来说足够准确,而且在更大的温度范围内,但是您可以通过将其频率与外部和更准确的频率进行比较来调整该振荡器的频率运行时时钟,或使用自动波特率检测。