为什么 STM32 要有多个时钟源?

因为首先 STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及 RTC 只需要几十 k 的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的 MCU 一般都是采取多时钟源的方法来解决这些问题。

STM32F1 的五个时钟源

在 STM32 中,有五个时钟源,为 HSI、 HSE、 LSI、 LSE、 PLL。 STM32F1 时钟配置 - 图1 从时钟频率来分可以分为高速时钟源和低速时钟源,在这 5 个中 HIS, HSE 以及 PLL 是高速时钟, LSI 和 LSE 是低速时钟。
从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中 HSE 和 LSE 是外部时钟源,其他的是内部时钟源。
image.png

HAL 库的 SystemInit 函数并没有像标准库的 SystemInit 函数一样进行时钟的初始化配置。 HAL 库的 SystemInit 函数除了打开 HSI 之外,没有任何时钟相关配置,所以使用 HAL 库我们必须编写自己的时钟配置函数。

STM32F1 通过 HAL 库时钟使能和配置

STM32 的外设时钟使能是在 RCC 相关寄存器中配置的。RCC 相关寄存器非常多,可以在《STM32 中文参考手册 V10》 6.3 小节查看所有 RCC 相关寄存器的配置。

在 STM32F1 的 HAL 库中,外设时钟使能操作都是在 RCC 相关固件库文件头文件 stm32f1xx_hal_rcc.h 定义的。外设时钟使能在 HAL 库中都是通过宏定义标识符来实现的。

那么我们只需要在我们的用户程序中调用宏定义标识符 __HAL_RCC_GPIOA_CLK_ENABLE() 就可以实现 GPIOA 时钟使能。