RCC时钟控制
STM32H7 有如下六种时钟可供使用:
-
HSI (High-speed internal oscillator) : HSI 是内部的高速 RC 振荡器,频率 64MHz,可被用于系统时钟。优势是低成本,无需外部时钟,快速启动(仅需几个微秒),缺点是精度差,即使经过校准。 -
HSE (High-speed external oscillator): HSE 是外部的高速振荡器,通过外接时钟源,有源或者无源晶振驱动,时钟范围 4-48MHz。优势是精度高,缺点是增加成本。 -
LSE (Low-speed external oscillator) : LSE 是外部的低速振荡器,通过外接时钟源,有源或者无源晶振驱动,一般接 32.768KHz,主要用于RTC 实时时钟。 -
LSI (Low-speed internal oscillator) : LSI 是内部的低速 RC 振荡器,频率约是 32KHz,主要用于独立看门狗和自动唤醒,也可以用于 RTC实时时钟。 -
CSI (Low-power internal oscillator) : CSI 是内部低速振荡器,频率约是 4MHz,相比 64MHz 的 HSI,主要用于低功耗。 -
HSI48 (High-speed 48 MHz internal oscillator) : HSI48 是内部高速振荡器,频率约是 48MHz,用于给特定的外设提供时钟,比如 USB。
时钟树
时钟配置
STM32H7 开发板使用的外部晶振频率是 25MHz,下面分步说明如何让其通过这个频率工作到 400MHz 的主频。
-
在 stm32h7xx_hal_conf.h 文件配置 HSE_VALUE 配置的大小要跟板子的实际晶振大小匹配。 #if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)8000000)
#endif
-
系统上电后,在启动文件 startup_stm32h743xx.s 的复位中断服务程序里面会调用函数 SystemInit。 Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
-
以往 STM32F1 和 STM32F4 系列都会在函数 SystemInit 里面配置 PLL 锁相环,使用了 HAL 后,需要在 main 函数里面配置。也就是在 main() 里面调用 SystemClock_Config() 进行配置。 -
SystemClock_Config() 可以使用 STM32Cubemx 进行配置,如果要自己实现会相对复杂,需要对比寄存器手册。
CubeMx 配置系统时钟
RCC 时钟的配置可以使用 stm32 官方提供的 CubeMX 进行配置。
下载地址 STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics
使用
打开 STM32CubeMX 选择 MCU 进行配置 这时候会创建一个工程 创建工程后,我们找到 System Core 里的 RCC 我们选择 HSE 使用外部晶振: 如上我们打开 Clock Configuration 配置。
时钟源我们选择和开发板一样的晶振频率(安富莱v7),然后可以按照如下图配置。 然后打开 Project Manager 选择 Toolchain/IDE 这里我们生成 MDK 工程,设置好输出的路径后,我们就可以点击右上方的 GENERATE CODE 生成 MDK 工程了。
然后我们就可以打开 main.c 文件,可以找到一个 SystemClock_Config() 函数,该函数就是对 RCC 时钟的配置,只需要将其复制黏贴到我们的工程中就可以了。
|