STM32的时钟系统学习笔记(基于STM32F407)

本文详细介绍了STM32F4的RCC复位时钟控制器,包括时钟树结构、时钟源选择、PLL配置及系统时钟切换步骤。重点解析了常用的时钟源如HSI、HSE和PLL,以及系统时钟频率的计算。此外,还列举了标准库中与时钟配置相关的函数,并提供了时钟配置实例。
摘要由CSDN通过智能技术生成

 

目录

RCC(Reset clock Control 复位时钟控制器)

 STM32F407时钟树关系图(重点理解经常用到)

时钟总线

 Sys Tick时钟(系统定时器)

 系统时钟源

PLL配置

PLL时钟作为系统时钟的配置步骤

 常用函数(标准库)


RCC(Reset clock Control 复位时钟控制器)

时钟源(时钟生成)

常规:外部晶振、芯片内部振荡器、锁相环(PLL)

PS:(Phase Locked Loop): 为锁相回路或锁相环

其他:以太网、USB OTG FS、或其他外设的时钟源

 STM32F407时钟树关系图(重点理解经常用到)

 

 

时钟总线

RCC通过多个预分频器配置时钟总线

PS:预分频器 (Prescaler-PSC)用来将定时器时钟源进行分频输出

总线类型:AHB、低速APB1、高速APB2

PS:   

AHB(Advanced High Performance Bus),高级高性能总线

APB(Advanced Peripheral Bus),(高级)外围总线

常用总线时钟配置表
系统时钟频率=168MHz
时钟总线时钟总线的时钟标记名允许最大频率
AHBHCLK168MHz
APB1(低速)PCLK142MHz
APB2(高速)PCLK284MHz

 Sys Tick时钟(系统定时器)

时钟源
Sys TickHCLK/8
系统时钟FCLK

PS:

SysTick时钟,俗称“嘀嗒定时器”,它能按设定的时间产生一次中断,根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放,或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。---------STM32菜鸟成长记录---系统滴答定时器(systick)应用

FCLK是CPU核供给时钟信号,所说的某一个cpu主频为200MHz,就是指的这个时钟信号 。

 系统时钟源

系统时钟可由三种不同的时钟源来驱动,可通过开关来选择。

1、HSI振荡器时钟

特点:内部集成、16MHz、RC复位时可直接用作系统时钟信号,因为启动速度快,但精度相对较低,其他时候很少用。

2、HSE振荡器时钟

特点:为外接的时钟输入源,可以是有源或无源的,频率范围要在4MHz-26MHz

3、主PLL(PLL)时钟

特点:PLL以HSI或HSE作为输入参考时钟,进行低频信号倍频到较高的频率,使微控制器在较高速度下运行。CPU的系统时钟信号大多由PLL提供

PS:系统复位后,系统时钟源是HSI,然后在进入main函数前,会先执行程序SystemInit进行配置切换PLL(一般情况)作为系统时钟源

SW:(系统时钟切换System clock switch)

软件置1和清零,用于选择系统时钟源。

由硬件置1,用于退出停机或待机时、或在直接或间接用作系统时钟的HSE发生故障时强制HSI的选择。

RCC配置寄存器段位[1:0]选择输入作为系统时钟

00:HSI

01:HSE

10:PLLCLK(也就是PLL(PLL))

11:   不允许

PS:

LSI 是低速内部时钟, RC 振荡器,频率为 32kHz 左右。供独立看门狗和自动唤醒单元使用。
LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。 这个主要是实时时钟RTC 的时钟源。(由第一张图可知)

PLL 为锁相环倍频输出。 STM32F4 有两个 PLL:
1) 主 PLL(PLL)由 HSE 或者 HSI 提供时钟信号,并具有两个不同的输出时钟。(下图)
第一个输出 PLLP 用于生成高速的系统时钟(最高 168MHz)
第二个输出 PLLQ 用于生成 USB OTG FS 的时钟(48MHz),随机数发生器的时钟和 SDIO
时钟。
2) 专用 PLL(PLLI2S)用于生成精确时钟,从而在 I2S 接口实现高品质音频性能

PLL配置

STM32F4 主 PLL 时钟图
 

主 PLL 时钟的时钟源(HSE(一般情况)或HSI)要先经过一个分频系数为 M 的分频器,然后经过倍频系数为 N 的倍频器出来之后的时候还需要经过一个分频系数为 P(第一个输出 PLLP)或者 Q(第二个输出 PLLQ)的分频器分频之后,最后才生成最终的主 PLL 时钟。
例如我们的外部晶振选择 8MHz。同时我们设置相应的分频器 M=8,倍频器倍频系N=336,
分频器分频系数 P=2,那么主 PLL 生成的第一个输出高速时钟 PLLP 为

PLL=8MHz * N/ (M*P)=8MHz* 336 /(8*2) = 168MHz
 

PLL时钟作为系统时钟的配置步骤

以设置HSE振荡器时钟作为PLL时钟源为例

(1)开启HSE振荡器,等待其稳定。

tip:如果PLLCLK已经作为系统时钟正在使用,若要更改PLL的输入参考时钟源,要先关闭PLL。因为在PLL运行期间,PLL不能配置成功。

(2)设置AHB、APB2、APB1的预分频系数。

(3)设置PLL的参数系数,输入预分频M、输出倍频N、PLLCLK预分频P、以及Q。(上图)

(4)开启PLL,等待PLL稳定。

(5)SW切换时钟,将PLLCK切换为系统时钟。

(6)读取时钟切换位,确保PLLCLK被选为系统时钟。

 常用函数(标准库)

头文件:stm32f4xx_rcc.h
源文件:stm32f4xx_rcc.c
1、外设时钟使能相关的函数:
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
若要使能APB2总线上的USART1的时钟,调用方法如:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
2、几种重要的时钟源使能函数:
void RCC_HSICmd(FunctionalState NewState);
void RCC_LSICmd(FunctionalState NewState);
void RCC_PLLCmd(FunctionalState NewState);
void RCC_PLLI2SCmd(FunctionalState NewState);
void RCC_PLLSAICmd(FunctionalState NewState);
void RCC_RTCCLKCmd(FunctionalState NewState);
若要使能 PLL 时钟,调用的函数为:
RCC_PLLCmd(ENABLE);
3、时钟源选择和分频因子配置函数:
void RCC_LSEConfig(uint8_t RCC_LSE);
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);//设置系统时钟源,有3种
void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
void RCC_PCLK1Config(uint32_t RCC_HCLK);
void RCC_PCLK2Config(uint32_t RCC_HCLK);
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);//设置实时时钟的时钟源
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t                                         PLLP, uint32_t PLLQ);//配置PLL的输入参考时钟源和和各参数。
若要设置系统时钟源为 HSI,调用的函数为
RCC_HCLKConfig(RCC_SYSCLKSource_HSI);// 配置时钟源为 HSI
设置 APB1 总线时钟为 HCLK 2 分频, 具体配置方法如下:
RCC_PCLK1Config(RCC_HCLK_Div2);
4、时钟外设复位函数。如下:
void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void RCC_AHB2PeriphResetCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void RCC_AHB3PeriphResetCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
函数使用方法与1基本一致,不同的是一个是用来使能外设时 钟,一个是用来复位对应的外设。
PS:复位外设,但不清除复位外设,则不能继续配置(读写)外设。所以ENABLE后要DISABLE
5、时钟配置状态函数
​​uint8_t RCC_GetSYSCLKSource(void);
系统时钟设置后确认时钟源是什么,实际返回RCC配置寄存器的位段[3:2],转换为uint8_t数值为
0(0000):HSI作为系统时钟
4(0100):HSE作为系统时钟
8(1000):PLLCLK作为系统时钟
ErrorStatus RCC_WaitForHSEStartUp(void);
检测HSE振荡器是否启动成功,返回SUCCESS或ERROR。
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);//获取RCC状态。
如:获取HSE振荡器是否就绪
RCC_GetFlagStatus(RCC_FLAG_HSERDY);
返回 SET 或 RESET 。

本文记录本人学习STM32的知识,便于以后复习所用,如有不妥之处,欢迎留言指正,共同进步! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值