时钟
时钟系统就是CPU的脉搏,像人的心跳一样,重要性不言而喻。由于STM32本身十分复杂,外设非常多,但并不是所有的外设都需要系统时钟那么高的频率,比如看门狗以及RTC只需要几十k的时钟即可。并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题。
STM32F1xx官方资料:
《STM32中文参考手册V10》-第六章 复位和时钟控制 RCC
STM32的时钟系统
STM32的时钟系统图
上图是STM32的时钟系统图。STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL,在图中有红色方框标记的位置。从时钟频率来分可以分成高速时钟源和低速时钟源,在这5个中HSI、HSE和PLL是高速时钟源,LSI和LSE是低速时钟源。从时钟来源来分可以分成外部时钟源和内部时钟源。外部时钟源就是从外部通过接晶振的方式获取时钟源。其中,HSE和ISE是外部时钟源,其他的是内部时钟源。
下面来看看STM32的5个时钟源:
① HSI(High Speed Internal)是高速内部时钟,RC振荡器,频率为8MHz,精度不高;
② HSE(High Speed External)是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz;
③ LSI(Low Speed Internal)是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。独立看门狗的时钟源只能是LSI,同时LSI还可以做PTC的时钟源;
④ LSE(Low Speed External)是低速外部时钟,接频率为32.768kHz的石英晶体。这个主要是RTC的时钟源。
⑤ PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
下面分析一下,图中A-E标识的五个地方:
A:STM32可以选择一个时钟信号输出到MCO脚(PA8,时钟输出引脚)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。这个时钟可以用来给外部其他系统提供时钟源;
B:这里是RTC的时钟源,可以选择LSI、LSE以及HSE的128分频;
C:此处的USB时钟源来自于PLL时钟源。STM32有一个全速功能的USB模块,其串行接口引擎需要一个48MHz的时钟源。该时钟源只能由PLL输出端获取,若PLL输出72MHz,则1.5分频;若PLL输出48MHz,则1分频。也就是说,当需要使用USB模块的时候,PLL必须使能;
D:STM32的系统时钟SYSCLK,提供STM32的绝大多数部件工作的时钟源。它的来源可以是三个时钟源:HSI振荡器时钟、HSE振荡器时钟和PLL时钟。系统时钟的最大频率为72MHz。
E:这里指的就是其他的所有外设了,这些外设的时钟来源都是SYSCLK。SYSCLK通过AHB分频器分频后送给各模块使用。
这些模块包括:
① AHB总线、内核、内存和DMA使用的HCLK时钟(最大72MHz);
② 通过8分频后送给Cortex的系统定时器时钟,也就是systick了;
③ 直接送给Cortex的空闲运行时钟FCLK;
④ 送给APB1分频器。APB1分频器输出一路给APB1外设使用(PCLK1,最大频率36MHz),另一路给通用定时器使用;
⑤ 送给APB2分频器。APB2分频器输出一路给APB2外设使用(PCLK2,最大频率72MHz),另一路给定时器使用;
APB1和APB2的区别
这里需要理解一下APB1和APB2的区别:
![](http://mcu.eetrend.com/files/2019-05/wen_zhang_/100042857-68543-76.jpg)
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)口等。
在上面的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。当使用某模块时,记得一定要先使能其相应的时钟。
SystemInit函数
STM32时钟系统的配置除了初始化的时候在system_stm32f10x.c中的SystemInit函数中外,其他的配置主要在stm32f10x_rcc.c文件中,需要对这个文件好好研究一下。
本文主要看一下初始化时的SystemInit函数:
SystemInit函数主要就是完成系统初始化时的默认状态的设置,同时系统时钟默认是在SetSysClock()函数中来进行判断的,而判断的依据则是通过宏定义设置的。先看看SetSysClocks()函数:
static void SetSysClock(void) { #ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif defined SYSCLK_FREQ_36MHz SetSysClockTo36(); #elif defined SYSCLK_FREQ_48MHz SetSysClockTo48(); #elif defined SYSCLK_FREQ_56MHz SetSysClockTo56(); #elif defined SYSCLK_FREQ_72MHz SetSysClockTo72(); #endif /* If none of the define above is enabled, the HSI is used as System clock source (default after reset) */ }
这段代码很简单,就是判断系统宏定义的时钟是多少,然后设置相应值。系统默认的宏定义是72HMz:
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) /* #define SYSCLK_FREQ_HSE HSE_VALUE */ #define SYSCLK_FREQ_24MHz 24000000 #else /* #define SYSCLK_FREQ_HSE HSE_VALUE */ /* #define SYSCLK_FREQ_24MHz 24000000 */ /* #define SYSCLK_FREQ_36MHz 36000000 */ /* #define SYSCLK_FREQ_48MHz 48000000 */ /* #define SYSCLK_FREQ_56MHz 56000000 */ #define SYSCLK_FREQ_72MHz 72000000 #endif
接下来就选择进入SetSysClockTo72()函数,我们看一下这个函数的内容:
这里主要的内容就是下面这一段:
/* HCLK = SYSCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; /* PCLK2 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /* PCLK1 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
设置SYSCLK为72MHz,HCLK=SYSCLK,PCLK1=SYSCLK/2,PCLK2=SYSCLK。总而言之,即通过HSE(8MHz)倍频9倍成SYSCLK(72MHz),然后直接输出为HCLK(72MHz)、PCLK2(72HMz)、PCLK1(36HMz)。
相对应的,如果说宏定义不是SYSCLK_FREQ_72MHz ,而是其他的宏定义。那么就会进入各自的SetSysClockToxx()函数,比如说SetSysClockTo54()、SetSysClockTo36()等等。然后在相应的程序中,会对SYSCLK等进行赋值。
同时,在设置好系统时钟之后,可以通过变量SystemCoreClock来获取系统时钟值。这也是在stm32f10x.c文件中设置的:
总结与分析
这里总结一下SystemInit函数默认设置的系统时钟的大小:
![](http://mcu.eetrend.com/files/2019-05/wen_zhang_/100042857-68557-77.jpg)
来源:CSDN,作者:Yngz_Miao
原文:https://blog.csdn.net/qq_38410730/article/details/79826397
版权声明:本文为博主原创文章,转载请附上博文链接!
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2019-05/wen_zhang_/100042857-68542-75.jpg?itok=x0KfgGGv)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2019-05/wen_zhang_/100042857-68543-76.jpg?itok=qgMEIMga)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2019-05/wen_zhang_/100042857-68557-77.jpg?itok=iOxjc1tO)
第1种
在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部时钟方式和外部时钟方式,如下图所示。
![](http://mcu.eetrend.com/files/2019-04/wen_zhang_/100042608-67773-1.jpg)
在内部方式时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路,通常C1和C2一般取30pF,晶振的频率取值在1.2MHz~12MHz之间。对于外接时钟电路,要求XTAL1接地,XTAL2脚接外部时钟,对于外部时钟信号并无特殊要求,只要保证一定的脉冲宽度,时钟频率低于12MHz即可。
晶体振荡器的振荡信号从XTAL2端送入内部时钟电路,它将该振荡信号二分频,产生一个两相时钟信号P1和P2供单片机使用。时钟信号的周期称为状态时间S,它是振荡周期的2倍,P1信号在每个状态的前半周期有效,在每个状态的后半周期P2信号有效。CPU就是以两相时钟P1和P2为基本节拍协调单片机各部分有效工作的。
第2种
![](http://mcu.eetrend.com/files/2019-04/wen_zhang_/100042608-67774-2.jpg)
MCS-51片内有一个高增益反相放大器,其输入端(XTAL1)和输出端(XTAL2)用于外接石英晶体和微调电容,构成振荡器,如图所示。电容C2和C3对频率有微调作用,电容容量的选择范围一般为30pF士10pF。振荡频率的选择范围为1.2~12MHz。
在使用外部时钟时,8051的XTAL2用来输入外时钟信号,而XTAL1则接地。
第3种
![](http://mcu.eetrend.com/files/2019-04/wen_zhang_/100042608-67775-3.jpg)
上图为时钟电路的原理图。分为最小单片机系统、单片机复位电路、按键电路、数码管位选电路、数码管段选电路、数码管显示电路、蜂鸣器电路、温度采集电路。
使用单片机的P2口进行数模的输出,P1^4、P1^5、P1^6与74HC138连接实现数码管位选,按键电路接入P1^0、P1^1、P1^2、P1^3四个I\O口,通过程序控制,扫描该四个引脚的信号实现时间的调节。蜂鸣器通过与三极管8550连接,最终接入P1^7,时间设定启动使其发声。温度传感器接入P3^7,将采集到的模拟信号转化为数字信号后传到单片机。
第4种
ATmega16单片机的时钟电路和输出I/O电路:
![](http://mcu.eetrend.com/files/2019-04/wen_zhang_/100042608-67776-4.jpg)
第5种
按键处理设置为:当有没键按下时,时钟正常运行;当按一次K1,时钟停止走动,按K2对秒进行调整;当K1按2次时,按K2对分进行调整;当K1按下3次时,按K2对小时进行调整,当按下4次K1时,校时完毕,时钟按设定的时间进行正常走时。
当按1次K3进入闹钟设置界面,时钟继续进行走时,按K2对秒进行设置;当按2次K3,按K2对分进行设置;当按3次K3,按K2对秒进行设置;当按下4次K3时,闹钟设置完毕进入时钟显示界面。电路图如下:
![](http://mcu.eetrend.com/files/2019-04/wen_zhang_/100042608-67777-5.jpg)
第6种
单片机利用外部12MHZ晶振构成振荡电路作为时钟源,时钟电路的原理如下图。
![](http://mcu.eetrend.com/files/2019-04/wen_zhang_/100042608-67778-6.jpg)
第7种
![](http://mcu.eetrend.com/files/2019-04/wen_zhang_/100042608-67779-7.jpg)
P10控制调时分秒的哪一位,P11调时分秒的加,P12按下显示时间,P13按下显示闹铃,P14按下显示秒表,并且P14还是秒表的暂停和复位开关。
来源:网络,玩转单片机 ,转载此文目的在于传递更多信息,版权归原作者所有。
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2019-04/wen_zhang_/100042608-67773-1.jpg?itok=nFh3f3Ul)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2019-04/wen_zhang_/100042608-67774-2.jpg?itok=rSQSTKcG)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2019-04/wen_zhang_/100042608-67775-3.jpg?itok=JywDHgd4)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2019-04/wen_zhang_/100042608-67776-4.jpg?itok=noeO_Zt3)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2019-04/wen_zhang_/100042608-67777-5.jpg?itok=50upTaus)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2019-04/wen_zhang_/100042608-67778-6.jpg?itok=RIiKo2zY)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2019-04/wen_zhang_/100042608-67779-7.jpg?itok=9r8H7PE4)
业界首家性能和功耗领先的PCI Express Gen 5时钟和缓冲器
Si5332任意频率时钟、Si522xx PCIe时钟系列和Si532xx PCIe缓冲器系列
率先提供兼容PCIe Gen 5的解决方案
Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)日前推出了满足最新一代PCI Express®(PCIe®)5.0规范的完整时钟解决方案组合,能够提供同类最佳的抖动性能,且具有显著的设计余量。Si5332任意频率时钟系列产品可生成抖动性能达140fs RMS的PCIe Gen 5参考时钟,优化了PCIe SerDes性能,且同时满足Gen 5规范并有余量。Si5332时钟能够生成PCIe和通用频率的任意组合,可在各种应用中实现时钟树整合。
Silicon Labs还提供Si522xx PCIe时钟发生器和Si532xx PCIe缓冲器系列,能够提供2路、4路、8路或12路PCIe Gen 1/2/3/4/5兼容输出,是数据中心应用中各种PCIe端点时钟的理想选择。
包括网络接口卡(NIC)、PCIe总线扩展器和高性能计算(HPC)加速器在内的数据中心硬件设计越来越多地使用低功耗1.5V或1.8V电源,以便最大限度地降低总体功耗。Si522xx和Si532xx器件采用1.5 - 1.8V电源供电,是业界功耗最低的PCIe时钟和缓冲器。Si522xx和Si532xx输出驱动器利用Silicon Labs备受肯定的推挽式高速电流导引逻辑(HCSL)技术,无需传统PCIe时钟采用恒流输出驱动器技术所需的外部终端电阻。
Silicon Labs的新型时钟产品完全兼容PCIe Gen 5通用时钟、分离参考无展频(SRNS)和分离参考独立展频(SRIS)架构。尽管PCIe Gen 5具有更严格的抖动要求,但Silicon Labs的新型产品不需要分立电源滤波组件,这简化了PCB布局,同时确保了板级噪声不会降低时钟抖动性能。电路板设计人员可以无缝升级现有的PCIe Gen 1/2/3/4设计,使用引脚兼容的Si5332、Si522xx和Si532xx时钟轻松实现设计,以便利用更快的PCIe串行接口。
Silicon Labs时钟产品总经理James Wilson表示:“Silicon Labs致力于提供一流的时钟解决方案,以便轻松迁移至更高速PCI Express。数据中心设计人员希望利用PCIe Gen 5来提高CPU和工作负载加速器之间的互连速度,包括GPU、FPGA和专用加速器解决方案。增加网络、存储和AI资源的带宽将有助于行业向400G以太网过渡。”
Silicon Labs PCI Express时钟抖动工具已更新,包括精确测量PCIe Gen 5参考时钟抖动所需的滤波器。该软件大大简化了PCIe时钟抖动测量,确保按照PCI-SIG Gen 1/2/3/4/5通用时钟、SRNS和SRIS规范的要求应用适当的滤波器,同时提供易于读取的结果。该用户友好的实用程序可在silabs.com/pcie-learningcenter免费获取。
价格与供货
Si5332任意频率时钟、Si522xx PCIe时钟和Si532xx PCIe缓冲器现已批量生产,可提供样片。样片可在两周内发货,批量订购在四周内发货。采购量达一万片时单价如下:
- Si5332 6-12路输出器件单价为4.25-4.90美元;
- Si522xx 2-12路输出器件单价为1.27-2.76美元;
- Si532xx 4-12路输出器件单价为1.40-2.10美元。
以下开发套件可用于快速、简单的产品评估:
- Si5332任意频率时钟:Si5332-6EX-EVB,零售价149美元;
- Si522xx PCIe时钟:Si52204-EVB,零售价140美元;
- Si532xx PCIe缓冲器:Si53208-EVB,零售价175美元。
欲了解最新Silicon Labs PCIe时钟和缓冲产品的更多信息,或订购样片及开发套件,请访问:silabs.com/pcie-learningcenter。
在非常温的工作环境下,RTC时钟出现偶发性的延时或者超时现象。成熟的RTC电路设计看似简单,但如何保证RTC时钟的精确度?在出现偶发性异常现象时,如何快速定位和解决问题?本文将分享一个案例。
案例情况
工控板使用了NXP的PCF8563 RTC 芯片方案,在研发做环境温度摸底测试的时候, RTC时钟出现偶发性延时或者超前现象,于是研发展开一系列的问题定位。
排查分析
1、工控板使用了NXP的PCF8563 RTC 芯片方案,该方案是外置32.768kHz的石英晶体和电容,该RTC芯片的输出精度取决于其外接的石英晶体输出的时钟频率是否精准。
石英晶体本身输出频率带有一定的误差,常温25℃下,频率的误差为±20ppm,平均误差可达5分钟/年。且随着时间的增加,晶体电路元件的缓慢变化会造成长期性的频率漂移。同时,在外部温度较为极端的时候,时钟震荡回路可能出现异常,影响到RTC的正常计时。
2、工控板RTC芯片供电电池选用了型号为CR2032的锂二氧化锰电池,该电池理论工作温度范围是-30℃~60℃。
和其他锂电池类似,若外部温度较为极端的时候,会改变其内部的化学反应,导致电池寿命的降低或者电压异常的风险,从而影响RTC电路的正常工作。
![RTC时钟偶发性延时或超时该怎么办?](http://mcu.eetrend.com/files/2018-11/wen_zhang_/100015982-53655-1.jpg)
解决方案
极限温度下长时间的高精度保证,有以下的解决方案:
1、选择带有温度补偿的RTC芯片如EPSON的RX-8025T。这款芯片是内置32.768kHz的晶体,具有高精度的温度补偿功能,输出的波形都是经过温度补偿校准过的,这样可以提高RTC的稳定性和精度。因为内嵌的晶体已经经过高温老化处理,比独立的晶体有更好的稳定性,精度误差在-40℃~85℃范围内小于±5ppm。
2、选择工业级电池(例如:FANSO ER14505)。理论上在工作温度-40~85°范围内能正常工作。参考电路图如图2所示:
![RTC时钟偶发性延时或超时该怎么办?](http://mcu.eetrend.com/files/2018-11/wen_zhang_/100015982-53656-2.jpg)
由图2可知,RTC芯片工作电源由系统VCC_3.3电源和电池电源两部分组成。此电源电路的设计目的是当有外部电源供电时,RTC时钟工作时使用由外部电源经LDO转化而来的VCC_3.3电源,当外部电源停止供电时就自动切换到电池电源供电。这样可以保证RTC芯片一直能够正常地工作,同时可以延长电池的使用时间。
此电路的设计如以下所述:
1、电源切换电路设计
由RX-8025T芯片的数据手册上可知:
• 其工作电压范围是1.7V到5.5V;
• 系统电源为3.3V、工业级电池ER14505电压为3.6V;
• 可以通过二极管的正向导通特性来自动切换系统电源和电池电源的供电状态,使得RTC芯片能够保持正常工作状态。
由于系统电源电压为3.3V,电池电压为3.6V;如果要做到优先使用系统电源,那么就需要系统电源经过二极管后的电压比电池经过二极管后的电压要高,这样才能保证由系统电源优先工作。
可以通过选择两只不同管压降的二极管来实现,二极管SS14的正向导通电压为0.2V左右,1N4148的正向导通电压为0.7V左右。那么可以在系统电源线路上串接一只SS14二极管,而在电池供电线路上串接一只1N4148二极管;这样当外部供电时,系统电源经过SS14后得到的电压值大于电池经过1N4148后的电压值,此时由主电源供电;当外部电源停止供电后,电路自动切换成电池供电状态。
![RTC时钟偶发性延时或超时该怎么办?](http://mcu.eetrend.com/files/2018-11/wen_zhang_/100015982-53657-3.jpg)
2、电压滞后处理
ER14505电池是一种供电电压为3.6V ,容量为2700mAh的锂亚硫酰氯电池;它的自身容量损耗极小,可以忽略不计。以待机电流为20uA计算,电池的供电可以达15年左右。
但是在实际应用中,发现在系统电源长期供电后,突然切换到电池供电时发生电压不足,导致RTC时钟出现异常,其根本原因是电池发生了钝化现象。
当RTC芯片由系统电源供电时,锂电池相当于闲置开路,如果电池闲置的时间过长,那么电池的内部会产生钝化膜,而切换到锂电池供电时,如果滞后的电压低于时钟芯片的工作电压,那么时钟芯片就会完全“失压”,系统时钟就会恢复到初始时间,导致时钟工作异常。为了消除这种现象的影响,我们可以通过在时钟芯片的电源上增加储能电容,以消除这种影响。
![RTC时钟偶发性延时或超时该怎么办?](http://mcu.eetrend.com/files/2018-11/wen_zhang_/100015982-53658-4.jpg)
3、控制钝化膜生成
电池的钝化膜是由于电池长时间处于闲置开路状态而形成的,那么我们可以使电池一直维持在一个较小的电流放电工作状态,这样可以减缓电池的钝化膜生成的速度。通过选择合适的电阻值,使电池处于放电状态,比如放电电流控制在待机电流20uA左右,这样电池容量足够支撑15年左右,同时不会使钝化膜过厚而出现电压滞后导致RX-8025T完全掉电现象,从而影响RTC时钟的正常工作。
• 当系统电源供电时,Q1导通,由电池BT1、R1、Q1形成回路,实现电池的放电状态;
• 当系统电源停止供电时,Q1截至,电池经过D2给RTC芯片U1供电。
经实测时钟芯片及电池内阻自放电的电流为8uA左右,那么我们需要控制的电阻R1的阻值为3.6V/(20-8)uA=300k。
![RTC时钟偶发性延时或超时该怎么办?](http://mcu.eetrend.com/files/2018-11/wen_zhang_/100015982-53659-5.jpg)
4、PCB设计
在PCB layout的时候需要注意RX-8052T与MCU的I2C走线应该越短越好,并且远离高频、高电流的信号线。同时旁路电容也应该靠近RX-8025T的电源端,并增加地线敷铜的面积,以防止干扰的产生。
来源: ZLG致远电子
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2018-11/wen_zhang_/100015982-53655-1.jpg?itok=4TfxLREm)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2018-11/wen_zhang_/100015982-53656-2.jpg?itok=OjUnEYia)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2018-11/wen_zhang_/100015982-53657-3.jpg?itok=gD8B6X_2)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2018-11/wen_zhang_/100015982-53658-4.jpg?itok=3H2ttx-i)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2018-11/wen_zhang_/100015982-53659-5.jpg?itok=SU6UlMCc)
对于高速的串行总线来说,一般情况下都是通过数据编码把时钟信息嵌入到传输的数据流里,然后在接收端通过时钟恢复把时钟信息提取出来,并用这个恢复出来的时钟对数据进行采样,因此时钟恢复电路对于高速串行信号的传输和接收至关重要。
CDR电路原理
时钟恢复的目的是跟踪上发送端的时钟漂移和一部分抖动,以确保正确的数据采样。时钟恢复电路(CDR:Clock Data Recovery)一般都是通过PLL(Phase lock loop)的方式实现,如下图所示。
输入的数字信号和PLL的VCO(Voltage-controlled oscillator,压控振荡器 )进行鉴相比较,如果数据速率和VCO的输出频率间有频率差就会产生相位差的变化,鉴相器对这个相位误差进行比较并转换成相应的电压控制信号,电压控制信号经过滤波器滤波后产生对VCO的控制信号从而调整VCO的输出时钟频率。
使用滤波器的目的是把快速的相位变化信息积分后转换成相对缓慢的电压变化以调整VCO的输出频率,这个滤波器有时又称为环路滤波器,通常是一个低通的滤波器。通过反复的鉴相和调整,最终VCO的输出信号频率和输入的数字信号的变化频率一致,这时PLL电路就进入锁定状态。
![一文看懂时钟是怎么恢复的?](http://mcu.eetrend.com/files/2018-08/wen_zhang_/100013842-47241-1.jpg)
环路带宽对眼图、抖动测量的影响
值得注意的是,在真实的情况下,输入的数字信号并不是一个纯净的信号,而是包含了不同频率成分的抖动。对于低频的抖动来说,其造成的是数据速率的缓慢变化,如果这个缓慢变化的频率低于环路滤波器的带宽,输入信号抖动造成的相位变化信息就可以通过环路滤波器从而产生对VCO输出频率的调整,这时VCO的输出时钟中就会跟踪上输入信号的抖动。
而如果输入信号中抖动的频率比较高,其造成的相位变化信号不能通过环路滤波器,则VCO输出的时钟中就不会有随输入信号一起变化的抖动成分,也就是说输入信号中的高频抖动成分被PLL电路过滤掉了。
如下图所示,我们通常会用PLL电路的JTF(Jitter Transfer Function,抖动传递函数)曲线描述PLL电路对于不同频率抖动的传递能力。JTF曲线通常是个低通的特性,反映了PLL电路对于低频抖动能很好跟踪而对高频抖动跟踪能力有限的特性。
![一文看懂时钟是怎么恢复的?](http://mcu.eetrend.com/files/2018-08/wen_zhang_/100013842-47242-2.jpg)
对于低频的抖动,PLL电路能够很好地跟踪,恢复出来的时钟和被测信号一起抖动。如果接收端的芯片用这个恢复时钟为基准对输入信号进行采样,由于此时时钟和被测信号一起抖动,所以这种低频的抖动不会被观察到,对于数据采样的建立保持时间也没有太大影响。
相反地,高频的抖动会被PLL电路过滤掉,因此输出的时钟里不包含这些高频的抖动成分。如果用这个时钟对数据信号进行采样,就会观察到输入信号里明显的抖动。接收端用恢复时钟进行采样时能够看到的抖动与抖动频率间的关系有时我们会用OJTF(Observed Jitter Transfer Function,观察到的抖动传递函数)曲线来描述,其随频率的变化曲线正好JTF曲线相反。
正因为时钟恢复电路对于低频抖动的跟踪特性,因此很多高速串行总线的接收芯片对于低频抖动的容忍能力会远远超过对高频抖动的容忍能力。下图是USB3.0总线对于接收端芯片对于不同频率抖动容忍能力的要求的一条曲线,可以看到其对低频的容忍能力非常大,甚至可以远超过1个UI(数据比特宽度)。
![一文看懂时钟是怎么恢复的?](http://mcu.eetrend.com/files/2018-08/wen_zhang_/100013842-47243-3.jpg)
时钟恢复电路的PLL的环路带宽设置不同,对于不同频率抖动跟踪能力也不一样。一般情况下,PLL的带宽设置越窄,恢复出来的时钟越纯净,但是对于抖动的跟踪能力越弱,用这个时钟为基准对数据做采样时看到的信号上的抖动会越多,看到的信号的眼图会越恶劣。
相反,如果PLL的带宽设置越宽,对于抖动的跟踪能力越强,恢复出来的时钟和信号的抖动越接近,用这个时钟为基准对数据做采样时看到的信号上的抖动会越少,看到的信号的眼图会越好。下图反映出的就是不同的PLL带宽设置对于恢复时钟抖动和以这个恢复时钟为基准对信号进行采样时看到的眼图的情况。
![一文看懂时钟是怎么恢复的?](http://mcu.eetrend.com/files/2018-08/wen_zhang_/100013842-47244-4.jpg)
转自:至秦单片机
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2018-08/wen_zhang_/100013842-47241-1.jpg?itok=GXKSZ-lN)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2018-08/wen_zhang_/100013842-47242-2.jpg?itok=lbq6NCaC)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2018-08/wen_zhang_/100013842-47243-3.jpg?itok=bBTm6odk)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2018-08/wen_zhang_/100013842-47244-4.jpg?itok=1OKn3QvP)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2018-08/wen_zhang_/100013736-46781-30.jpg?itok=2PtcZlkO)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2018-08/wen_zhang_/100013736-46782-31.jpg?itok=1IMc4C-H)
![](https://cdn.eetrend.com/files/styles/solid-pic-270x177/public/2018-08/wen_zhang_/100013736-46783-32.jpg?itok=w6sz3ta3)
一、RCC是什么?
RCC: Reset Clock Control,时钟和复位控制器
二、RCC的主要作用
1、设置系统时钟SYSCLK
2、设置AHB分频因子(决定HCLK等于多少)
3、设置APB2分频因子(决定PCLK2等于多少)
4、设置APB1分频因子(决定PCLK1等于多少)
5、设置各个外设的分频因子
6、控制AHB、APB2和APB1三条总线时钟的开启、控制每个外设时钟的开启。
注意:STM32库函数中时钟的标准配置为PCLK2=HCLK=SYSCLK=PLLCLK=72M,PCLK1=HCLK/2=36M
三、系统时钟库函数
对于系统时钟的配置,在固件库文件system_stm32f10x.c中。如下所示:
static void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ /* Enable HSE */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); /* Wait till HSE is ready and if Time out is reached exit */ do { HSEStatus = RCC->CR & RCC_CR_HSERDY; StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); if ((RCC->CR & RCC_CR_HSERDY) != RESET) { HSEStatus = (uint32_t)0x01; } else { HSEStatus = (uint32_t)0x00; } if (HSEStatus == (uint32_t)0x01) { /* Enable Prefetch Buffer */ FLASH->ACR |= FLASH_ACR_PRFTBE; /* Flash 2 wait state */ FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; /* HCLK = SYSCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; /* PCLK2 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /* PCLK1 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; #ifdef STM32F10X_CL /* Configure PLLs ------------------------------------------------------*/ /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); /* Enable PLL2 */ RCC->CR |= RCC_CR_PLL2ON; /* Wait till PLL2 is ready */ while((RCC->CR & RCC_CR_PLL2RDY) == 0) { } /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9); #else /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6); //12*6=72M #endif /* STM32F10X_CL */ /* Enable PLL */ RCC->CR |= RCC_CR_PLLON; /* Wait till PLL is ready */ while((RCC->CR & RCC_CR_PLLRDY) == 0) { } /* Select PLL as system clock source */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; /* Wait till PLL is used as system clock source */ while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) { } } else { /* If HSE fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error */ } }
四、STM32的HSE时钟
HSE是高速的外部时钟信号,可以由有源晶振或者无源晶振提供。频率为4-16MHz。
HSE最常用的是8M的无源晶振。当外部晶振为8M时,不需要对固件库中的系统时钟配置函数进行修改,但是,如果我们选择的外部晶振不是8M的,则需要对固件库中的系统时钟的配置做一修改。如我们所使用的外部晶振为12M,则需要做如下修改。
1、修改stm32f10x.h文件
打开stm32f10x.h文件,修改如下代码(119行)
#define HSE_VALUE ((uint32_t)8000000) //修改之前
#define HSE_VALUE ((uint32_t)12000000) //修改之后
2、修改system_stm32f10x.c中的系统时钟配置函数
打开system_stm32f10x.c文件,修改如下代码(1056行)
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); //修改之前,HSE=8M,9倍频之后为8*9=72M
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6); //修改之后,HSE=12M,6倍频之后为12*6=72M
转自:Tangledice
页面
![订阅 RSS - 时钟](https://cdn.eetrend.com/misc/feed.png)