
最近看了一下STM32的启动代码,在system_init函数中找到了RCC部分初始化的流程,有许多不解,查了一下资料,基本上搞清楚了RCC的原理。 RCC主要是管理系统复位和时钟控制的,系统复位这里不讨论,主要讲系统时钟。 时钟 STM32可以使用三种不同的时钟源来驱动系统时钟 (SYSCLK): ● HSI 振荡器时钟 ● HSE 振荡器时钟 ● 主 PLL (PLL) 时钟 器件具有以下两个次级时钟源: ● 32 kHz 低速内部 RC (LSI RC),该 RC 用于驱动独立看门狗,也可选择提供给 RTC 用 于停机/待机模式下的自动唤醒。 ● 32.768 kHz 低速外部晶振(LSE 晶振),用于驱动 RTC 时钟 (RTCCLK) 下面先看看STM32的时钟树: ![]() 我们一般会使用外部无源晶振作为芯片的输入时钟,外部晶振稳定和精确性都比较高,时钟走向如图中箭头所示。 STM32F4系列的单片机内部sysclk可以到168MHZ,所以想要达到这么高速时钟的要求,肯定是需要使用PLL来倍频的。 假设我们的外部晶振源是25M HZ,如箭头所示,进来后先需要分频,这里我们设置分频系数为25,那么vco的输入频率就是25MHZ/25 = 1MHZ。 ![]() N用来设置倍频系数: VCO输入频率的值乘倍频系数(这里假设N为400)得到VCO输出频率:1MHZ*400 = 400MHZ ![]() 而后还要再经过P分频才能得到SYSCLK的值: P设置为4 PLL输出频率= VCO输出频率/4 = 400MHZ/4 = 100MHZ ![]() 我使用的是STM32F411系列的单片机,SYSCLK为100MHZ。 AHB这里不做分频,AHB也是100Mhz,APB2也不分频,APB2也是100mhz,APB1做2分频,为50MHZ 这些分频数值需要根据实际需要的频率去计算出来。 注意: HSE 外部时钟的值是在stm32f4xx.h中定义的:
这里一定要改成外部晶振的值,否则标准库在使用它的时候会出现问题。 ———————————————— 版权声明:tony++ |
STM32 GUI LTDC 最大像素时钟评估方法
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南