STM32工作笔记0037---STM32时钟系统精讲-M3

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152

时钟系统类似于,芯片的脉搏.

上是STM32的框图.

可以看到下面,框中5个的蓝色的部分,这5个就是时钟源,

也就是整个开发版,的时钟来源

再看上面有个系统时钟,这个很重要,可以看到所有外设的时钟都来自于,这个系统时钟,

会以系统时钟为代表讲解.

这里有个HSI RC,这个时钟,是high speed inte..内部高速时钟,这个时钟是由rc振荡器,产生的,

RC振荡器产生的时钟是不稳定的,他会产生一个约为8MHZ的时钟.

再看一下这部分,可以看到HSI RC连接到了系统时钟上,右边梯形的图形,是一个选择的意思,

也就是说,系统时钟,可以选择HSI作为系统时钟.

然后再看HSE时钟.

可以看到这里的HSE这个时钟,是通过外部的高速晶振设备产生的时钟,实际上这个外部的晶振设备,可以是4到16MHZ的一个晶振

而这个最初的4到16mhz的震荡,会有两个选择,往右,可以看到可以直接连接到选择器1,作为选择器1的一个晶振源输入,

同时也可以经过分频/2,作为选择器1的,第二个输入,而选择器1也可以作为选择器2的一个输入.

然后HSI RC这个时钟,也可以经过分频,作为选择器2的一个输入,然后,选择器2的输入,可以作为PLL这个时钟的,输入,

而PLL这个时钟也可以作为,系统时钟的一个输入SYSCLK,PLLCLK可以作为SYSCLK的一个震荡的输入.

注意这里PLL实际上是一个锁相环(就是保证相位不变),也就是稳定时钟频率的作用,但是他还可以作为倍频工具,

比如输入是4-16mhz的频率,那么可以经过PLL进行倍频比如10倍,就是40-160mhz的频率了.

也就是PLL锁相环可以倍频.

所以这里,总结一下,PLL这个时钟,来源可以有三个,也就对应的是三个箭头,一个是下面的通过

HSE时钟,然后分频,然后连接到选择器1,然后连接到选择器2,然后再连接到PLL时钟的来源.

第二个是,通过HSE-->选择器1-->选择器2-->PLL这个时钟的来源.这个来源没有经过分频

第三个HSI RC经过分频,连接选择器2,然后再连接到PLL的来源.

然后对于系统时钟也有三个来源.

一个是HSE 时钟经过下面的那个线,直接连接到系统时钟上.

一个是通过PLL这个倍频后,来源的时钟.

一个是HSIRC 这个振荡器,连接到系统时钟上的来源.

再来看一下,有一个叫CSS的单元,这个单元叫做,时钟监视系统,这个作用是,

因为一般咱们用的时候,都会通过HSE,来接一个外部晶振来用,

而这个外部晶振有时候,可能会不稳定,比如用着用着,这个晶振坏掉了,这个时候

CSS单元的作用,就是时钟监控系统,监控时钟有问题,就会自动切换到比如HSI,这个时钟来源.

咱们刚才说系统时钟来源有三个,但是两个是依赖于外部HSE晶振提供的时钟,所以HSE出问题

css就会自动把时钟切换到HSI,保证了系统不至于崩溃.

上面这几个H..的时钟,都是高速时钟.

这里的HSE OSC就是外部晶振的意思.

再继续看,上图中.

这个LSE OSC这个也是个外部晶振时钟,这个不是低速的,可以产生32.768khz的时钟频率,

LSI RC这个振荡器提供内部的一个低速震荡频率40khz,

而这里LSE 和LSI 都可以给RTCCLK提供时钟来源.

可以看到RTCCLK这个时钟来源,也可以有三个,一个是来自HSE的128分频的时钟频率,

一个是来自LSE的一个时钟频率.

还有一个来自LSI 内部低速振荡器的一个时钟频率

当LSI内部振荡器,产生的频率还可以给IWDGCLK这个独立看门狗时钟提供

这里有个MCO这个引脚是PA8,这个是可以输出内部时钟的一个输出口.

这里这个MCO输出内部时钟,这个引脚的来源,可以有SYSCLK这个系统时钟,也可以来源于

HSI这个内部高速时钟,也可以来源于HSE这个外部高速晶振,也可以来源于这个锁相环时钟,PLLCLK.

看完左边的时钟再看一下右边的时钟,先看右下角的那个

USB Prescaler这个usbclk这个usb时钟,可以看到这个usb时钟的,频率来源

可以来源于PLLCLK这个倍频时钟,PLLCLK输出的频率是48mhz,或者72mhz

当输入72mhz的时候,usb时钟,可以进行分频,这里可以有1.5倍的分频,也就是72mhz/1.5=48mhz

如果输入的是48mhz的时候,这里分频是1,也就是就不需要分频就是48mhz了,因为usb分频

需要48mhz的频率.

注意这里PLLCLK这个锁相环时钟,倍频时钟,是可以设置输出48mhz还是72mhz的.

f1系列的开发版的时钟,最大产生72mhz的时钟.

再继续看,这里因为STM32F1系列的开发版,在不倍频的情况下,最高能产生72mhz的频率,

如果这个时候,产生了一个72mhz的频率,这个频率经过上图的AHB,这个预分频器,经过某个分频因子进行分频,这里的分频因子就是

比如1,就是/1,2就是/2这样,可以看到如果72mhz的频率,经过AHB预分频器,最高可以产生HCLK UP TO 72MHZ的频率,

然后经过AHB分频的频率,再经过APB1这个预分频器,可以产生PCLK1 UP TO 36MHz的频率,这个频率,可以给

通过定时器时钟啊,一些对频率要求低的,外设提供时钟频率.

还可以看到系统时钟经过AHB分频,在经过APB2分频,可以产生PCLK2 UP TO 72MHZ的频率,可以给下面的

定时器啊,ADC,模拟电路转数字电路这个,需要时钟频率高的外设提供时钟频率.

看右上角,这里我们知道,我们使用设备之前,都需要使能设备时钟,为什么呢

因为,由程序人员使能这样的一个设计,是为了降低设备的功耗,来设计的,如果不设计使能,

芯片,所有的外设直接就可以用,这需要时钟频率,一直是打开的,这样的话就会造成功耗

特别多,尤其是对于穿戴设备,这种对于硬件的功耗,要求高的情况.更有必要设计使能的这样一种用法,

使用的时候再打开时钟,这样来降低功耗.

接下来,再总结一下时钟系统的知识,因为这个太重要了.

AHB对应HCLK UP TO 72MHZ

APB1对应PCLK1 UP TO 36MHZ

APB22对应PCLK2 UP TO 72MHZ

咱们可以看到上面有很多,分频器,预分频器,那么在寄存器中是怎么分配的呢

可以看文档中写了,每个寄存器的哪一位可以来初始化时钟.

里面有写的.

这个时钟在代码中如何体现的呢

下面打开代码看一下

打开这个代码看看

这个代码中,与时钟相关的代码:

头文件

实现的文件

上一讲说的,寄存器地址映射

这里面做了大部分的寄存器映射.

来看看,时钟RCC的c文件

可以看到这里,做了映射,这个RCC_TypeDef就是时钟的结构体.

下面这个时钟结构体给了个讲解.

上面的这三个寄存器,可以用来使能外设来用.

这里面的寄存器使能.

这里的ICR是用来使能时钟的和就绪标志位的.

比如这里HSI 这个RC振荡器,也是需要使能以后才能用.

而且使能以后这个时钟,还是不可以用的,还要等他稳定才能用,所以这里有个就绪位的设置,

这里要把就绪位设置为1才能用.

HSE也是这样的.

这个就绪的标志位实际上也是在CR寄存器中定义的.

可以去看看文档,这里可以看到这里位0,用来使能内部高速时钟,使能以后,还有个位1 ,这个是内部高速时钟就绪标志位

标志位是0的时候,表示这个时钟还没有就绪,标志位是1的时候表示时钟稳定了可以用了.

然后还需要看这个CFGR这个寄存器,这个用来设置PLL等这个倍频时钟的,时钟源选择,和分频系数的设定.

可以看到,前面也有说,这里的梯形部分就是选择器,对应的AHB,APB1等,这些都是,可以看到这个选择器,可以设置时钟源,

还有个作用是可以设置分频因子,也就是分频系数.

然后看一下CFGR寄存器.

再看一下这里,这个CFGR寄存器,可以看到,

这里系统时钟 位1到0,这个可以设置系统时钟源,00的时候用HSI作为系统时钟,这个内部高速时钟.

相应的,01,10的时候..设置其他来源

然后再看看这个AHB预分频,他可以有512个分频.

上面时钟框图中也有说.

后面大家可以去看参考手册,代码的话

可以看到这里声明了很多的寄存器.

函数,通过这些函数,间接去操作寄存器.

第一个是使能时钟的函数,第二个是时钟源配置函数,

第三个是配置分频系数

然后第四个是配置,外设时钟使能.这咱们经常用的.

第五个,这里是其他外设的时钟,比如这类的ADC,模拟转数字,还有RTC时钟的配置.

第六个可以用来获取状态的参数,比如获取时钟的参数,获取系统时钟的参数等.

然后第7个是RCC中断相关的函数.


 

猜你喜欢

转载自blog.csdn.net/lidew521/article/details/108099662