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

Arm 在不影响外围设备的情况下更改STM32上的时钟频率?,arm,stm32,firmware,Arm,Stm32,Firmware,我对STM32L486时钟管理有点迷茫 我想在运行时更改时钟频率。通常,我希望大部分时间处于低功耗运行/睡眠模式,其余时间处于全频率 我知道如何使用PLL在80MHz或使用MSI在1MHz设置SysClk 然而,问题是更改Sysclk会弄乱大多数外围设备的设置。例如,如果我更改时钟,USART将不再工作 这样做(在运行时更改频率)是常见做法吗 我需要使用的外围设备有:LPTIM(没问题,因为它们可以独立于SysClk进行计时)、ADC、AES加速器、USART、TIM、SPI。在STM32L4x

我对STM32L486时钟管理有点迷茫

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

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

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

这样做(在运行时更改频率)是常见做法吗


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

在STM32L4xx上,这并不难,如果您查看数据表中的“时钟树”图,许多外围设备都是时钟相关的(USART、LPTIM、I2C,…)可以使用总线时钟以外的其他时钟源驱动,也可以使用LSE或内部HSI


虽然根据我的经验,内部HSI不是晶体控制的,对于UART来说足够精确,也可以在更大的温度范围内,但您可以通过在运行时将其频率与外部更精确的时钟进行比较来调整此振荡器的频率,或者使用自动buadrate检测。

不幸的是,它没有那么简单。时钟改变后,许多外围设备必须复位。但通常会有空闲的时候(或者你可以强迫他们空闲)。请描述你的具体问题。哪些外围设备,哪个时钟源等等。你甚至还没有告诉我你有什么控制器。@berendi这更像是一个一般性的问题。在STM32L4上,在运行时更改CPU频率是常见的做法,还是更常见的做法是一次性设置?我不认为几个STM32L4在这个话题上有很大的区别?我定义了我想要使用的时钟源,我将添加外围设备。唯一的问题是功耗增加,这在使用低功耗UCU时可能是一个问题。SPI master呢?由于主模式下的STM32本身会生成时钟,因此更改SysClk可以吗?