一、STM32f4时钟树(图)
附:
基本概念:
- 等腰梯形:选择器,从若干个不同的时钟输入,选择其中一个输出
- /M 为M分频,把频率变为原来的1/M
- ×N 为N倍频,把频率变为原来的N倍
注:
- MCO最大输出频率有100M
- 任何外设在使用之前要先使能对应的时钟
- 对于每个时钟源来说,在未使用时都可单独打开或者关闭,以降低功耗
二、STM32时钟源(5个)
① LSI是低速内部时钟,RC振荡器,频率为32kHz,提供低功耗时钟。主要供独立看门狗和自动唤醒单元使用。
② LSE是低速外部时钟,接频率为32.768kHz的石英晶体。RTC
③ HSI是高速内部时钟,RC振荡器,频率为16MHz,精度不高。可以直接作为系统时钟或者用作PLL时钟输入。
④ HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz。
⑤ PLL为锁相环倍频输出。STM32F4有两个PLL:
- 主PLL(PLL)由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟。
- 第一个输出PLLP用于生成高速的系统时钟(最高168MHz)
- 第二个输出PLLQ用于生成USB OTG FS的时钟(48MHz),随机数发生器的时钟和SDIO时钟。
- 专用PLL(PLLI2S)用于生成精确时钟,从而在I2S接口实现高品质音频性能。
三、系统时钟(SYSCLK)
在上图的“系统时钟”标识处可以看出,系统时钟可以由三种不同的时钟源来驱动,分别为:
● HSI 振荡器时钟
● HSE 振荡器时钟
● 主 PLL (PLLCLK) 时钟
一般来说多数是选择使用PLLCLK时钟来驱动系统时钟,因为PLLCLK的时钟频率最高可以达到168MHz,比HSI和HSE要高。
而主PLL时钟的时钟频率是可以通过用户自行配置的,在上图的标识⑤处,下面是PLLCLK的计算公式:
PLLCLK =
f
M
×
N
P
\frac{f}{M} \times \frac{N}{P}
Mf×PN
其中f为HSI或者HSE频率,通过选择器自行选择,M N P通过RCC_CFGR寄存器来设置关于STM32F40xx时钟配置
1. CSS时钟安全系统
一般来说系统时钟是使用PLLCLK作为时钟源,而PLLCLK默认是使用HSE作为时钟源,但是HSE是外部时钟,如果这个外部时钟出现了问题,那么将间接导致系统时钟的错乱,这个时候CSS系统会在 系统时钟源选择器(上图中的SW) 切换HSI来驱动系统时钟,保证系统还能执行。
2. AHB与APB
- AHB(Advanced High performance Bus),高级高性能总线,这是一种 “系统总线”,分频后的时钟标识为HCLK。
AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接。AHB 系统由主模块、从模块和基础结构(Infrastructure)3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。 - APB(Advanced Peripheral Bus),这是一种外围总线,分频后的时钟标识为PCLK。
APB主要用于低带宽的周边外设之间的连接,例如UART、1284等,它的总线架构不像 AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥。
AHB预分频器是通过操作RCC相关寄存器的RCC_CFGR寄存器,对HPRE进行设置,当设置成1分频,那么HCLK的频率等于系统时钟的频率。
四、RCC寄存器、头文件和固件库源文件(参考)
RCC常用寄存器
- RCC_CR (RCC clock control register)RCC 时钟控制寄存器
- RCC_PLLCFGR(RCC PLL configuration register)RCC PLL 配置寄存器
- RCC_CFGR(RCC clock configuration register)RCC 时钟配置寄存器
RCC相关头文件和固件库源文件
- 头文件: stm32f4xx_rcc.h
- 源文件:stm32f4xx_rcc.c
时钟使能配置:
RCC_HSICmd, RCC_LSICmd, RCC_PLLCmd, RCC_PLLI2SCmd, RCC_PLLSAICmd, RCC_RTCCLKCmd,RCC_AHBxPeriphClockCmd
RCC_APBxPeriphClockCmd
时钟源和时钟相关配置:
RCC_HSEConfig, RCC_LSEConfig, RCC_PLLConfig, RCC_PLLI2SConfig, RCC_PLLSAIConfig, RCC_MCO1Config, RCC_MCO2Config, RCC_SYSCLKConfig, RCC_HCLKConfig,RCC_PCLK1Config,RCC_PCLK2Config,RCC_RTCCLKConfig,RCC_I2SCLKConfig
外设复位函数
RCC_AHB1PeriphResetCmd,RCC_AHB2PeriphResetCmd,RCC_AHB3PeriphResetCmd,RCC_APB1PeriphResetCmd,RCC_APB2PeriphResetCmd
状态参数获取参数:
RCC_GetSYSCLKSource,RCC_GetClocksFreq,RCC_GetFlagStatus,RCC_ClearFlag
RCC中断相关函数 :
RCC_ITConfig,RCC_ClearITPendingBit,RCC_GetITStatus