CPU为什么需要时钟
脉冲,类似于人类的心跳。对于一个方形脉冲,脉冲幅值从0上升到最大值的过程叫做上升沿;反之,叫做下降沿。一个脉冲称为CPU的一个时钟信号,或者时钟脉冲。一个脉冲周期就叫CPU时钟周期。
从对时钟的需求角度分类,CPU分为需要时钟:同步CPU (synchronous CPU),和不使用时钟工作的异步CPU (asynchronous CPU)。由于异步CPU设计复杂成本高昂,目前广泛应用的都是同步CPU。
时钟是为了同步CPU中各种门电路的动作。
举一个例子,先有如下逻辑电路:
当A=B=1时,Q=0。当输入信号发生变化时,逻辑元件不会立即对输入变化做出反应,会有一个传播时延(propagationdelay)。当B变化为0时,由于B也作为XOR的直接输入,所以XOR异或门会立即感知一个输入变为0的状态变化,XOR输出变为了1。但是由于传播时延的作用,AND与门的输出会过一小段时间才变为0,XOR的输出会在变为1后隔一小段时间重新变为0。表现为下图就是这样:
上面这种现象叫作空翻(racecondition),即指输出中出现了一个不希望有的脉冲信号。一个简单的办法就是在输出端放置一个边沿触发器:
边沿触发器的作用就是只有当CLK端输入从0变到1时,数据端D的输入才会影响边沿触发器的输出。这样,所有的传播时延都会被边沿触发器所隐藏掉,这时Q端的输出将变得稳定。比如:
其中蓝色的部分代表没有边沿触发器时的Q端输出状态。可以看出,当有了边沿触发器后,Q端的输出变得稳定,基本消除了传播时延。
从上面的例子可以看出CPU为什么要时钟:目前绝大多数的微处理器都是被同步时序电路所驱动,而时序电路由各种逻辑门组成。正如上面说的那样,逻辑门需要一小段时间对输入的变化做出反应(propagation delay)。所以需要时钟周期来容纳传播时延,并且时钟周期应当大到需要容纳所有逻辑门的传播时延。
STM32的时钟源
MCU是一个集成芯片,由非常复杂的数字电路和其它电路组成, 需要稳定的时钟脉冲信号才能保证正常工作。时钟如同人体内部的心脏一样,心脏跳动一下,推动血液流动一下。时钟产生一次脉冲,就推动处理器执行一下指令。 一个脉冲周期就叫CPU时钟周期,一个时钟周期内时钟信号震荡一次。
芯片运行的时钟频率越高,芯片处理的速度越快,但同时功耗也越高。为了功耗和性能兼顾,微处理器一般有多个时钟源,同时还将时钟分频为多个大小,适配不同需求的外设。
可以看到一共有四个时钟源:
①HSI(High Speed Internal clock signal):
HSI是内部的高速时钟信号,频率8MHz。因为是内部提供,可以降低成本,缺点是精度较差。
②HSE(High Speed External clock signal):
HSE是外部的高速时钟信号,需要外部电路晶振,输入频率范围要求为4-16MHz。因为需要外部电路提供,成本会增加,但精度较好。
③LSE(Low Speed External clock signal):
LSE是外部的低速时钟信号,需要外部电路晶振,输入频率范围要求为32.768KHz。 一般用于RTC实时时钟。
④LSI(Low Speed Internal clock signal):
LSI是内部的低速RC振荡器,频率40KHz。一般用于看门狗、 RTC实时时钟等。
对于上述的STM32F103的系统时钟SYSCLK最高为72MHz,从图中左侧的选择器SW可看到来源有三个,分别是:
①内部高速时钟HSI、②锁相环时钟PLLCLK和③外部高速时钟HSE,而锁相环时钟PLLCLK由内部高速时钟HSI和外部高速时钟HSE,经过分频和PLL锁相环倍频而来。
内部高速时钟HSI可直接经过选择器SW给系统时钟SYSCLK,此时系统时钟SYSCLK为8MHz; 内部高速时钟HSI先2分频,再经过选择器PLLSRC进入锁相环PLLMUL,最大倍频为16倍,得到64MHz的锁相环时钟PLLCLK给系统时钟SYSCLK;
当外部高速时钟HSE(假设外接晶振为8MHz时)直接给选择器SW,则系统时钟SYSCLK为8MHz;
当外部高速时钟HSE(假设外接晶振为8MHz时)直接经过选择器PLLXTPRE给PLLSRC,再经过PLLMUL 9倍频,得到72MHz的PLLCLK给系统时钟SYSCLK。
对于STM32F103系列的MCU, 都需要一个高速时钟和一个低速时钟,而这两个时钟可以选择使用内部时钟源节约成本,也可以选择外部时钟源输入提高精度。 如果使用内部时钟源,则无需设计外部电路,反之,则需要时钟电路。