【STM32】系统时钟RCC详解(超详细,超全面)

发布者:灵感发电站最新更新时间:2020-08-19 来源: eefocus关键字:STM32  系统时钟  RCC 手机看文章 扫描二维码
随时随地手机看文章

1什么是时钟

时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。

 

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

STM32本身十分复杂,外设非常多  但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费   并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题。所以便有了STM32的时钟系统和时钟树

 

总括:

  • STM32时钟系统主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的耗能。

  • 系统时钟,是处理器运行时间基准(每一条机器指令一个时钟周期)

  • 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。

  • 一个单片机内提供多个不同的系统时钟,可以适应更多的应用场合。

  • 不同的功能模块会有不同的时钟上限,因此提供不同的时钟,也能在一个单片机内放置更多的功能模块。
    对不同模块的时钟增加开启和关闭功能,可以降低单片机的功耗

  • STM32为了低功耗,他将所有的外设时钟都设置为disable(不使能),用到什么外设,只要打开对应外设的时钟就可以, 其他的没用到的可以还是disable(不使能),这样耗能就会减少。  这就是为什么不管你配置什么功能都需要先打开对应的时钟的原因

 

STM32的时钟系统框图

 

乍一看很吓人,但其实很好理解,我们看系统时钟SYSCLK 的左边  系统时钟有很多种选择,而左边的部分就是设置系统时钟使用那个时钟源,   

系统时钟SYSCLK 的右边,则是系统时钟通过AHB预分频器,给相对应的外设设置相对应的时钟频率

 

从左到右可以简单理解为  各个时钟源--->系统时钟来源的设置--->各个外设时钟的设置

时钟系统

1各个时钟源    (左边的部分)

STM32 有4个独立时钟源:HSI、HSE、LSI、LSE。
①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。
②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。  
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

其中LSI是作为IWDGCLK(独立看门狗)时钟源和RTC时钟源 而独立使用 

而HSI高速内部时钟 HSE高速外部时钟 LSI低速内部时钟  这三个经过分频或者倍频 作为系统时钟来使用

 

PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。  通过倍频之后作为系统时钟的时钟源

 

举个例子:Keil编写程序是默认的时钟为72Mhz,其实是这么来的:外部晶振(HSE)提供的8MHz(与电路板上的晶振的相关)通过PLLXTPRE分频器后,进入PLLSRC选择开关,进而通过PLLMUL锁相环进行倍频(x9)后,为系统提供72MHz的系统时钟(SYSCLK)。之后是AHB预分频器对时钟信号进行分频,然后为低速外设提供时钟。

或者内部RC振荡器(HSI) 为8MHz  /2 为4MHz 进入PLLSRC选择开关,通过PLLMUL锁相环进行倍频(x18)后 为72MHz

 

PS:  网上有很多人说是5个时钟源,这种说法有点问题,学习之后就会发现PLL并不是自己产生的时钟源,而是通过其他三个时钟源倍频得到的时钟

2系统时钟SYSCLK

系统时钟SYSCLK可来源于三个时钟源:
①、HSI振荡器时钟
②、HSE振荡器时钟
③、PLL时钟
最大为72Mhz

 

3USB时钟

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取(唯一的),,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz

4把时钟信号输出到外部

STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。可以把时钟信号输出供外部使用

5系统时钟通过AHB分频器给外设提供时钟(右边的部分)  重点

 

从左到右可以简单理解为  系统时钟--->AHB分频器--->各个外设分频倍频器 --->   外设时钟的设置

 

右边部分为:系统时钟SYSCLK通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用: 

 ①内核总线:送给AHB总线、内核、内存和DMA使用的HCLK时钟。 

 ②Tick定时器:通过8分频后送给Cortex的系统定时器时钟。 

 ③I2S总线:直接送给Cortex的空闲运行时钟FCLK。 

 ④APB1外设:送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给通用定时器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2-7使用。 

 ⑤APB2外设:送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给高级定时器。该倍频器可选择1或者2倍频,时钟输出供定时器1和定时器8使用。

 

另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。 

需要注意的是,如果 APB 预分频器分频系数是 1,则定时器时钟频率 (TIMxCLK) 为 PCLKx。否则,定      时器时钟频率将为 APB 域的频率的两倍:TIMxCLK = 2xPCLKx。 

APB1和APB2的对应外设

F1系列

APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、USART2、USART3、UART4、UART5、SPI2、SP3等;

而APB2上面连接的是高速外设,包括UART1、SPI1、Timer1、ADC1、ADC2、ADC3、所有的普通I/O口(PA-PE)、第二功能I/O(AFIO)口等。


F4系列

这个和F1系列类似,我们就举几个特殊的

 APB2总线:高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11   UTART1,USART6

 APB1总线:通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7  UTART2~UTART5

F4系列的系统时钟频率最高能到168M

 

具体  可以在 stm32f10x_rcc.h  和stm32f40x_rcc.h   中查看

或者通过 STM32参考手册搜索“系统架构”或者“系统结构”  查看外设挂在哪个时钟下,

 

RCC相关寄存器:

这里我们以F1系列为例


RCC 寄存器结构,RCC_TypeDeff,在文件“stm32f10x.h”中定义如下:

 

1059行->1081行。:  

typedef struct  

{  

vu32 CR;                  //HSI,HSE,CSS,PLL等的使能  

vu32 CFGR;              //PLL等的时钟源选择以及分频系数设定 

vu32 CIR;                // 清除/使能 时钟就绪中断 

vu32 APB2RSTR;      //APB2线上外设复位寄存器 

vu32 APB1RSTR;      //APB1线上外设复位寄存器 

vu32 AHBENR;         //DMA,SDIO等时钟使能 

vu32 APB2ENR;       //APB2线上外设时钟使能 

vu32 APB1ENR;      //APB1线上外设时钟使能 

vu32 BDCR;           //备份域控制寄存器 

vu32 CSR;             

} RCC_TypeDef; 

可以对上上面的时钟框图和RCC寄存器来学习,对STM32的时钟系统有个大概的了解   其实也就是我们上面介绍的流程,理解了自然也就能写出来


RCC初始化:

这里我们使用HSE(外部时钟),正常使用的时候也都是使用外部时钟


使用HSE时钟,程序设置时钟参数流程:

1、将RCC寄存器重新设置为默认值   RCC_DeInit;

2、打开外部高速时钟晶振HSE       RCC_HSEConfig(RCC_HSE_ON);

3、等待外部高速时钟晶振工作      HSEStartUpStatus = RCC_WaitForHSEStartUp();

4、设置AHB时钟         RCC_HCLKConfig;

5、设置高速AHB时钟     RCC_PCLK2Config;

6、设置低速速AHB时钟   RCC_PCLK1Config;

7、设置PLL              RCC_PLLConfig;

8、打开PLL              RCC_PLLCmd(ENABLE);

9、等待PLL工作          while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

10、设置系统时钟        RCC_SYSCLKConfig;

11、判断是否PLL是系统时钟     while(RCC_GetSYSCLKSource() != 0x08)

12、打开要使用的外设时钟      RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()


代码实现:

对RCC的配置函数(使用外部8MHz晶振)  


系统时钟72MHz,APH 72MHz,APB2 72MHz,APB1 32MHz,USB 48MHz TIMCLK=72M


void RCC_Configuration(void)

{

//----------使用外部RC晶振-----------

RCC_DeInit(); //初始化为缺省值

RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟 

while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer

FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state

RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK

RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 =  HCLK

RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ

RCC_PLLCmd(ENABLE); //Enable PLLCLK

 

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock

while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source

//---------打开相应外设时钟--------------------

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2外设的GPIOA的时钟  

}

也就是我们时钟树框图从左到右的配置


时钟监视系统(CSS)

STM32还提供了一个时钟监视系统(CSS),用于监视高速外部时钟(HSE)的工作状态。倘若HSE失效,会自动切换(高速内部时钟)HSI作为系统时钟的输入,保证系统的正常运行。

关键字:STM32  系统时钟  RCC 引用地址:【STM32】系统时钟RCC详解(超详细,超全面)

上一篇:【STM32】STM32CubeMX教程--功能介绍
下一篇:【STM32】STM32F4 GPIO八种模式及工作原理详解

推荐阅读最新更新时间:2024-11-16 20:35

讲讲开发STM32的四种库
1.我是选择寄存器开发STM32,还是标准外设库呢? 2.你有STM32L0标准外设库吗? 3.HAL库和LL库有什么差异? 下面就来讲讲开发STM32的四种库: STM32Snippets Standard Peripheral Library STM32Cube LL STM32CubeHAL 1、STM32Snippets 什么是STM32Snippets? STM32Snippets可翻译为“代码片段”、“裁剪”,其实他就是我们常说的“寄存器”开发STM32的底层驱动代码。 比如配置ADC引脚的代码片段: __INLINE void ConfigureGPIOforADC(void) { /* (1) Enable
[单片机]
讲讲开发<font color='red'>STM32</font>的四种库
STM32开发笔记9: STM32CubeF0固件架构
单片机型号:STM32CubeF0 本文介绍STM32CubeF0固件架构。 STM32CubeF0固件架构图如下图所示。 1、Board Support Package (BSP) This layer offers a set of APIs relative to the hardware components in the hardware boards (such as LCD, Audio, microSD and MEMS drivers). It is composed of two parts: • Component This is the driver
[单片机]
<font color='red'>STM32</font>开发笔记9: STM32CubeF0固件架构
基于机智云物联网平台的停车场管理系统设计
本文介绍的智慧停车场系统是由安徽理工大学殷雨彤设计开发完成。该停车场管理系统是以STM32F103ZE作为系统核心控制器,融合窄带物联网技术(NB-IoT技术)、红外传感技术以及机智云物联网平台,实现数据实时监测及传输、用户端远程控制,车位管理更便捷高效,车位分配更快速和合理。 01引 言 窄带物联网(NB-IoT)技术适合在停车管理等场景中应用。由传感模块进行数据采集,STM32芯片进行数据处理,窄带物联网模块将参数上传至云端,即可实现用户远程监测停车场信息并进行有效调度。 02系统整体架构设计 由于智慧停车场管理系统需要对停车场的车位信息进行收集,并上传至云平台以实现大数据监控和车库管理系统与汽车调度,因此主要采用了三
[单片机]
基于机智云物联网平台的停车场管理<font color='red'>系统</font>设计
stm32---CAN通信
can.c #include can.h /************************************************************* 函数名:CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode) 功能:CAN初始化 变量: //tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1tq~ CAN_SJW_4tq //tbs2:时间段2的时间单元. 范围:CAN_BS2_1tq~CAN_BS2_8tq; //tbs1:时间段1的时间单元. 范围:CAN_BS1_1tq ~CAN_BS1_16tq //brp :波特率分频器.范围:
[单片机]
STM32学习笔记之ADC
程序功能是把ADC1模块里通道14的输入电压转换后通过USART2发送到PC,在PC机上用串口调试助手观察接收数据: STM32是12位ADC,测量结果基本还可以!程序用了DMA来传输ADC转换值,调高了读取速度。串口部分用是上一篇串口调试笔记里的代码。 /************************************************************************ Copyright (c) 2008 wormchen All rights reserved 文 件 名: main.c 说 明: 将ADC转换值通过串口发送到PC端 主要硬件: EMSTM32V1+miniSTMV1
[单片机]
<font color='red'>STM32</font>学习笔记之ADC
stm32 l0相关的eeprom
内部FLASH和EEPROM这种掉电后还能保存内容的内存统称为non-volatile memory(NVM),STM32L053内部有2K的EEPROM. 内部EEPROM的页大小为一个Word为单位,擦除是必须以页为单位,所以库函数里的擦除函数也是每次擦除4个字节: view plaincopy to clipboardprint? /** * @brief Erase a word in data memory. * @param Address: specifies the address to be erased. * @note To correctly run this function,
[单片机]
STM32 输入捕获
PWM 输入捕获模式 xmlnamespace prefix = o ns = urn:schemas-microsoft-com:office:office / 一、概念理解 PWM输入捕获模式时输入捕获模式的特例 1、每个定时器有四个输入通道IC1、IC2、IC3、IC4,且IC1 IC2一组,IC3 IC4一组,并可是设置管脚和寄存器的对应关系 2、两个TI输出映射了两个ICx信号 3、这两个ICx信号分别在相反的极性边沿有效 4、两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式 5、当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获 一个PWM周期(即连续的两个上升沿或下降沿) ,他
[单片机]
[STM32] 关于USART接收中断的BUG和注意事项
今天在使用USART模块,遇到了一些问题并解决了,于是发贴共享。 问题描述: 在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低一个级别,而接收中断上一个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发!问题就出来,不到1分钟时间,通讯没有反应了。USART配置代码如下: void uart_config(void) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = UART_GetBaud(BaudRate); USART_In
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved