历史上的今天

今天是:2024年08月25日(星期日)

正在发生

2020年08月25日 | STM32时钟详解

发布者:清新心情 来源: eefocus关键字:STM32  时钟  耗能 手机看文章 扫描二维码
随时随地手机看文章

1.概述
时钟是单片机的脉搏,是单片机的驱动源,使用任何一个外设都必须打开相应的时钟。这样的好处是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。每个时钟tick,系统都会处理一步数据,这样才能让工作不出现紊乱。


2.原理
首先,任何外设都需要时钟,51单片机,STM32,430等等,因为寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。


51单片机不需要配置时钟,是因为一个时钟开了之后所有的功能都可以用了,而这个时钟是默认开启的,比如有一个水库,水库有很多个门,这些门默认是开启的,所以每个门都会出水,我们需要哪个门的水的时候可以直接用,但是也存在一个问题,其他没用到的门也在出水,即也在耗能。这里水库可以认为是能源,门可以认为是每个外设的使用状态,时钟可以认为是门的开关。


STM32之所以是低功耗,他将所有的门都默认设置为disable,在你需要用哪个门的时候,开哪个门就可以,也就是说用到什么外设,只要打开对应外设的时钟就可以,其他的没用到的可以还是disable,这样耗能就会减少。


在51单片机中一个时钟把所有的都包了,而stm32的时钟是有分工的,并且每类时钟的频率不一样,因为没必要所有的时钟都是最高频率,只要够用就行,好比一个门出来水流大小,我只要洗脸,但是出来的是和洪水一样涌出来的水,那就gg了,消耗能源也多,所以不同的时钟也会有频率差别,或者在配置的时候可以配置时钟分频。


拓展:为何要先配置时钟,再配置GPIO(功能模块)

所有寄存器都需要时钟才能配置,寄存器是由D触发器组成的,只有送来了时钟,触发器才能被改写值。


任何MCU的任何外设都需要有时钟,8051也是如此;STM32为了让用户更好地掌握功耗,对每个外设的时钟都设置了开关,让用户可以精确地控制,关闭不需要的设备,达到节省供电的目的。


51单片机不用配置IO时钟,只是因为默认使用同一个时钟,这样是方便,但是这样的话功耗就降低不了。例如,某个功能不需要,但是它还是一直运行。


stm32需要配置时钟,就可以把不需要那些功能的功耗去掉。当你想关闭某个IO的时候,关闭它相对应的时钟使能就是了,不过在51里面,在使用IO的时候是没有设置IO的时钟的,还有在STM32中,有外部和内部时钟之分。ARM的芯片都是这样,外设通常都是给了时钟后,才能设置它的寄存器(即才能使用这个外设)。STM32、LPC1XXX等等都是这样。这么做的目的是为了省电,使用了所谓时钟门控的技术。这也属于电路里同步电路的范畴:同步电路总是需要1个时钟。


3.详述STM32时钟

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


系统时钟,是处理器运行时间基准(每一条机器指令一个时钟周期)
在这里插入图片描述
乍一看很吓人,但其实很好理解,我们看系统时钟SYSCLK 的左边 系统时钟有很多种选择,而左边的部分就是设置系统时钟使用那个时钟源,
系统时钟SYSCLK 的右边,则是系统时钟通过AHB预分频器,给相对应的外设设置相对应的时钟频率
从左到右可以简单理解为:
各个时钟源—>系统时钟来源的设置—>各个外设时钟的设置

a. 时钟源

在STM32中,可以用内部时钟,也可以用外部时钟,在要求进度高的应用场合最好用外部晶体震荡器,内部时钟存在一定的精度误差。
准确的来说有4个时钟源可以选分别是HSI、LSI、HSE、LSE(即内部高速,内部低速,外部高速,外部低速),高速时钟主要用于系统内核和总线上的外设时钟。低速时钟主要用于独立看门狗IWDG、实时时钟RTC。
①、HSI是高速内部时钟,RC振荡器,频率为8MHz,上电后默认的系统时时钟 SYSCLK = 8MHz,Flash编程时钟
①、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz
③、LSI是低速内部时钟,RC振荡器,频率为40kHz,可用于独立看门狗IWDG、实时时钟RTC
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体

PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 通过倍频之后作为系统时钟的时钟源
( 网上有很多人说是5个时钟源,这种说法有点问题,学习之后就会发现PLL并不是自己产生的时钟源,而是通过其他三个时钟源倍频得到的时钟)

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


b.系统时钟

系统时钟SYSCLK可来源于三个时钟源:
①、HSI振荡器时钟
②、HSE振荡器时钟
③、PLL时钟
最大为72Mhz
在这里插入图片描述
c.PLL 锁相环倍频(输入和输出)

PLL的输入3种选择:
①、PLLi = HSI /2
①、PLLi = HSE /2
③、PLLi = HSE

PLL的输出有15种选择: PLLout = PLLi Xn (n = 2…16)
在这里插入图片描述
d. USB时钟
在这里插入图片描述STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取(唯一的),可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。


e.把时钟信号输出到外部
在这里插入图片描述
STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。可以把时钟信号输出供外部使用。


f.系统时钟通过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对应外设

F4系列:
在这里插入图片描述
APB2总线:高级定时器timer1, timer8、通用定时器timer9, timer10, timer11、UTART1,USART6

APB1总线:通用定时器timer2timer5、通用定时器timer12timer14、基本定时器timer6,timer7、UTART2~UTART5

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

具体可以在 stm32f40x_rcc.h 中查看

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


g.RCC相关寄存器

Reset and clock control (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初始化

这里我们使用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的时钟        

}


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

关键字:STM32  时钟  耗能 引用地址:STM32时钟详解

上一篇:STM32系统学习——RCC(使用HSE/HSI配置时钟)
下一篇:STM32 HAL 库学习笔记之-------(系统时钟配置)

推荐阅读

2018年8月23日上午,随着中国国际智能产业博览会(以下简称“智博会”)在重庆国际博览中心揭开序幕,重庆已全面进入了智博会时刻。 首届智博会以“智能化:为经济赋能,为生活添彩”为主题,共设综合展区、大企业展区、创新展区、展区以及未来智能生活体验区五大区域,为全球奉献了一场智能科技盛宴。 子公司海康机器人受邀坐镇大企业展区,与众多智能...
特拉华大学的研究人员已经确定氨是工程燃料电池的一种来源,它可以为汽车、卡车和公共汽车提供廉价而强大的燃料,并减少碳排放。燃料电池是一种无污染的能源,它能将化学能转化为高效、零排放的电能。特拉华大学的研究人员正在研究使燃料电池更便宜、更强大的技术,以便燃料电池汽车将来可以成为所有人的可行选择。传统的燃料电池研究涉及氢燃料电池,但特...
近日一款三星新机通过了 WiFi 联盟认证,型号为 SM-F415F/DS。尽管确切的机型未知,但型号表明这是 Galaxy 可折叠智能手机。作为参考,第一代 Galaxy Fold 的型号为 F900,而 Z Flip 的型号为 F700(三星旗下的折叠屏手机型号均是 SM-F 开头)。新认证的 SM-F415F/DS 型号被认为是 Fold 的廉价版本,因为该型号将进入 F400 系列中。...
一段时间没有使用KEIL建立MDK工程了,今天新建一个工程,测试串口输出,发现突然不能打印输出了,反复观察,程序确实没有问题,以为硬件问题,就将原来可以执行的程序烧写,结果居然可以,那么这就是程序问题了。 经过仔细观察,发现是这里的原因,实在好久不用就不好发现,记之! 使用自带的迷你库,才能包含printf函...

史海拾趣

问答坊 | AI 解惑

X波段高稳定相干频率源倍频-放大组件设计

摘 要:本文介绍X波段高稳定相干频率源倍频-放大组件的设计方法和实验结果\"为满足设计要求,对其电磁兼容性进行分析,给出了电磁兼容性设计和具体实施措施\"…

查看全部问答∨

学习应从哪里入手

所要学习的面很广,但学习应该从元器件入手。 元器件是组成电子电路的最小单位,是分析电路工作原理的基础,也是修理中最终检测、更换的对象,从了解、掌握元器件的外形特征、结构、工作原理、主要特性、检测方法入门,再进入电路工作原理的学 ...…

查看全部问答∨

基于DSP的液晶模块的显示原理及实现

1 硬件电路接口的设计 图1给出了液晶显示模块的硬件电路接口设计框图,该系统采用TI公司的TMS320F206芯片(以下简称F206),其内部带有4KB的FLASH存储器,可以根据系统需要外挂EEPROM作为外部程序存储区。 SED1335控制器是日本EPSON公司生产 ...…

查看全部问答∨

一个应届毕业生3家公司的工作经历及迷茫(转)

当我再次看《读大学究竟读什么?》这本书时。眼中又多了几分迷茫。像覃大哥BLOG上说的《职业规划:定体则无,大体须有》《专科生的发展之路》可能是我理解能力太差了吧到现在。我实在是不知道我应该怎样走。。。。。。 08年12月18日,我来到了北京 ...…

查看全部问答∨

刚知道LM3S CM3能挂SDRAM~~

刚知道LM3S CM3(比较新的9B系列)能挂SDRAM~~~…

查看全部问答∨

proteus 问题

我把 74ls164 修改成  74ls164.bus 为什么在仿真的时候 提示 PIn ‘clock’ is not modelled. 怎么处理?…

查看全部问答∨

在vxworks里使用文件系统,是如何实现的?

是直接把文件系统组件添加了,就可以了吗? 还需要干什么? 需要什么工具制作吗?…

查看全部问答∨

请教“打开文件”界面设计问题

请教各位高手, 形如: \\windows\\my music\\       <...>       xxx.mp3 第一行显示当前的路径, 第二行单击返回上一级路径 第三行显示当前路径里的所有文件,如果是文件夹,单击则进入该文件 ...…

查看全部问答∨

急!在线等待!在evc 使用directshow时,用模拟器调试的时候,CoCreateInstance 失败!

怀疑是没有在模拟器上注册,然后我将\\Program Files\\Microsoft eMbedded C++ 4.0\\EVC\\WCE400\\TARGET\\X86\\REGSVRCE.EXE 拷贝到模拟器目录下,在命令行REGSVRCE.EXE msfilter.dll ,失败!提示loadlirary(msfilter.dll) failed 请各位大虾指 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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