时钟

单片机应用中,常常会遇到这种情况,在用单片机制作电子钟或要求根据时钟启控的控制系统时,会突然发现当初校准了的电子时钟的时间竟然变快或是变慢了。

于是,尝试用各种方法来调整它的走时精度,但是最终的效果还是不尽人意,只好每过一段时间手动调整一次。那么,是否可使时钟走时更精确些呢?现探讨如下:

一、误差原因分析

1.单片机电子时钟的计时脉冲基准,是由外部晶振的频率经过12分频后提供的,采用内部的定时,计数器来实现计时功能。所以,外接晶振频率的精确度直接影响电子钟计时的准确性。

2.单片机电子时钟利用内部定时,计数器溢出产生中断(12MHz晶振一般为50ms)再乘以相应的倍率,来实现秒、分、时的转换。大家都知道,从定时,计数器产生中断请求到响应中断,需要3_8个机器周期。定时中断子程序中的数据人栈和重装定时,计数器的初值还需要占用数个机器周期。此外。从中断人口转到中断子程序也要占用一定的机器周期。例如:


从上述程序可以看出,从中断人口到定时/计数器初值的低8位装入需要占用2+2+2=6个机器周期。所以,在编程时一般会把这6个机器周期加入定时/计数器的初值中。但是,从定时,计数器溢出中断请求到执行中断需要几个机器周期(3~8个机器周期)。就很难确定准确值,正是这一原因导致了电子时钟计时的不准。

二、解决方法

1、采用高精度晶振方案

虽然采用高精度的晶振可以稍微提高电子钟计时的精确度,但是晶振并不是导致电子钟计时不准的主要因素,而且高精度的晶振价格较高,所以不必采用此方案。

2、动态同步修正方案
从程序人手,采用动态同步修正方法给定时,计数器赋初值。动态同步修正方法如下:由于定时,计数器溢出后,又会从O开始自动加数,故在给定时/计数器再次赋值前,先将定时,计数器低位(TLO)中的值和初始值相加,然后送人定时,计数器中,此时定时,计数器中的值即为动态同步修正后的准确值。具体程序如下:


采用此种方法后,相信制作的电子时钟的精度已有提高了。

3、自动调整方案

采用同步修正方案后,电子时钟的精度虽然提高了很多,但是由于晶振频率的偏差和一些其他未知因素的影响(同一块电路板、同样的程序换了一片单片机后,走时误差不一样,不知是何原因),时间长了仍然会有积累误差。为此,可采用自动调整方案。实际上是一种容错技术。其自动调整原理为:实测出误差Is所需的时间,然后每隔这样一段时间后就对秒进行加“1”或减“1”调整。例如:电子钟每过50小时就慢1秒,其自动调整程序如下:


以下是一个完整实例:



结语

使用此方法调整较费时间,但效果非常好。经实验,一次调整可/以将月误差控制在Is左右,如按此方法再次测出误差Is所需的天数并进行二次调整,其精度会更高。

来源:网络

围观 41

时钟系统就是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的区别:


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函数默认设置的系统时钟的大小:


来源:CSDN,作者:Yngz_Miao
原文:https://blog.csdn.net/qq_38410730/article/details/79826397
版权声明:本文为博主原创文章,转载请附上博文链接!

围观 464

第1种

在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部时钟方式和外部时钟方式,如下图所示。

时钟电路:(a)内部方式时钟电路,(b)外接时钟电路

在内部方式时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路,通常C1和C2一般取30pF,晶振的频率取值在1.2MHz~12MHz之间。对于外接时钟电路,要求XTAL1接地,XTAL2脚接外部时钟,对于外部时钟信号并无特殊要求,只要保证一定的脉冲宽度,时钟频率低于12MHz即可。

晶体振荡器的振荡信号从XTAL2端送入内部时钟电路,它将该振荡信号二分频,产生一个两相时钟信号P1和P2供单片机使用。时钟信号的周期称为状态时间S,它是振荡周期的2倍,P1信号在每个状态的前半周期有效,在每个状态的后半周期P2信号有效。CPU就是以两相时钟P1和P2为基本节拍协调单片机各部分有效工作的。

第2种


MCS-51片内有一个高增益反相放大器,其输入端(XTAL1)和输出端(XTAL2)用于外接石英晶体和微调电容,构成振荡器,如图所示。电容C2和C3对频率有微调作用,电容容量的选择范围一般为30pF士10pF。振荡频率的选择范围为1.2~12MHz。

在使用外部时钟时,8051的XTAL2用来输入外时钟信号,而XTAL1则接地。

第3种


上图为时钟电路的原理图。分为最小单片机系统、单片机复位电路、按键电路、数码管位选电路、数码管段选电路、数码管显示电路、蜂鸣器电路、温度采集电路。

使用单片机的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电路:


第5种

按键处理设置为:当有没键按下时,时钟正常运行;当按一次K1,时钟停止走动,按K2对秒进行调整;当K1按2次时,按K2对分进行调整;当K1按下3次时,按K2对小时进行调整,当按下4次K1时,校时完毕,时钟按设定的时间进行正常走时。

当按1次K3进入闹钟设置界面,时钟继续进行走时,按K2对秒进行设置;当按2次K3,按K2对分进行设置;当按3次K3,按K2对秒进行设置;当按下4次K3时,闹钟设置完毕进入时钟显示界面。电路图如下:

独立按键电路

第6种

单片机利用外部12MHZ晶振构成振荡电路作为时钟源,时钟电路的原理如下图。


第7种


P10控制调时分秒的哪一位,P11调时分秒的加,P12按下显示时间,P13按下显示闹铃,P14按下显示秒表,并且P14还是秒表的暂停和复位开关。

来源:网络,玩转单片机 ,转载此文目的在于传递更多信息,版权归原作者所有。

围观 373

业界首家性能和功耗领先的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

围观 311

时序在数字电路中的作用,就像通信中用到的载波,载波并不起眼,但是很重要。时钟也一样,现象上只是某种频率波峰波谷跳动,一成不变。但是有了它,就像人类的历史有了时间轴一样,什么时候该干什么事才有了可能。程序中发生的事件,能够按照自己的意愿发生。下面就以STM32开发板中最常见的STM32F103系列芯片的时钟为例,介绍一下STM32中的时钟。

时钟作用

说到时钟,你一定会问,这是用来计时的吗?没错,是用来计时的,但这只是它在STM32中的一项功能而已,下面就为你列出了时钟的具体功能。

计时作用(供给某些计数器统计时间);

控制时序(串口数据的传输,只能一位一位的传输);

控制信号(将时钟的上升下降沿作为独特的控制标志)。

STM32时钟模型

STM32内部时钟树

时钟源

时钟源就是产生时钟的电路啦,我们来一起看一下,什么样的电路可以产生时钟。

STM32中的时钟源分为以下五种:

低速内部时钟LSI:频率为40kHz ;
高速内部时钟HSI :频率为8MHz ;
低速外部时钟OSC_32:频率为32.7678kHz ;
高速外部时钟OSC:频率范围4-16MHz ;
时钟输出MCO:为其他设备提供时钟源。

在对时钟频率要求不高的情况下,我们可以选择内部RC振荡器时钟作为单片机工作的时钟源。如果对时钟精度要求较高,我们要选择外部石英晶体振荡器(晶振),作为单片机的时钟源,因为内部时钟用的是模拟电路组成的振荡器,误差较大,在实时性要求比较高的场合(串口通信、IIC通信等)容易造成不可预知的错误。

时钟相对复杂的意义主要是为不同外设提供合适的时钟频率,主要目的是为了节能、低功耗。

高速时钟:用于高速外设I/O、串口通信、SPI等等;

低速时钟:用于低速外设RTC看门狗 ;

倍频器:时钟与外设进行时钟适配。

相关寄存器讲解

PLLSRC
锁相环倍频器时钟源选择
内部高速时钟2分频
外部高速时钟

PLLMUL
锁相环时钟倍频器
将PLLSRC选择的时钟进行倍频,最大不能超过72MHz

PLLXTPRE
锁相环时钟选择
选择外部时钟作为锁相环倍频器时钟源
选择外部时钟2分频后作为锁相环倍频器时钟源

SW
系统时钟选择
选择内部高速时钟作为系统时钟
选择锁相环倍频时钟作为系统时钟
选择外部高速时钟作为系统时钟

AHB
系统时钟分频器

CSS
时钟安全监测单元
当外部时钟意外故障,CSS在短时间内切换到内部高速时钟使单片机工作不中断

RTCCLK
实时时钟时钟源选择
选择锁相环倍频器时钟源128分频作为实时时钟时钟源
选择外部低速时钟作为实时时钟时钟源
选择内部低俗时钟作为实时时钟时钟源

MCO
时钟输出控制
锁相环时钟2分频输出
内部低俗时钟输出
内部高速时钟输出
系统时钟输出

关于APB1、APB2时钟

STM32单片机外设挂接在APB1、APB2两个桥上,但两个桥允许的始终最大频率不相同,APB2最大允许72MHz,APB1最大只允许36MHz,在使用外设时应格外注意时钟,例如串口一挂接在APB2上,其余串口挂接在APB1上,在串口配置时应注意失踪频率的不同造成的波特率配置问题(库函数开发忽略此项内容)。

外部时钟晶体振荡器最好选择8MHz晶振,无论是库函数,还是Keil默认配置启动文件时钟配置均是按照外部晶体振荡器8MHz来进行的配置,系统时钟72MHz,如果采用其他型号的晶体震荡器振还需要自己配置时钟树,对于新手来说可能存在一定的困难。

来源: 无线电杂志

围观 532

在非常温的工作环境下,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时钟偶发性延时或超时该怎么办?
图1 PCF8563参考电路图

解决方案

极限温度下长时间的高精度保证,有以下的解决方案:

1、选择带有温度补偿的RTC芯片如EPSON的RX-8025T。这款芯片是内置32.768kHz的晶体,具有高精度的温度补偿功能,输出的波形都是经过温度补偿校准过的,这样可以提高RTC的稳定性和精度。因为内嵌的晶体已经经过高温老化处理,比独立的晶体有更好的稳定性,精度误差在-40℃~85℃范围内小于±5ppm。

2、选择工业级电池(例如:FANSO ER14505)。理论上在工作温度-40~85°范围内能正常工作。参考电路图如图2所示:

RTC时钟偶发性延时或超时该怎么办?
图2 RX-8025T参考电路图

由图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时钟偶发性延时或超时该怎么办?
图3 电源切换电路

2、电压滞后处理

ER14505电池是一种供电电压为3.6V ,容量为2700mAh的锂亚硫酰氯电池;它的自身容量损耗极小,可以忽略不计。以待机电流为20uA计算,电池的供电可以达15年左右。

但是在实际应用中,发现在系统电源长期供电后,突然切换到电池供电时发生电压不足,导致RTC时钟出现异常,其根本原因是电池发生了钝化现象。

当RTC芯片由系统电源供电时,锂电池相当于闲置开路,如果电池闲置的时间过长,那么电池的内部会产生钝化膜,而切换到锂电池供电时,如果滞后的电压低于时钟芯片的工作电压,那么时钟芯片就会完全“失压”,系统时钟就会恢复到初始时间,导致时钟工作异常。为了消除这种现象的影响,我们可以通过在时钟芯片的电源上增加储能电容,以消除这种影响。

RTC时钟偶发性延时或超时该怎么办?
图4 电压滞后处理电路图

3、控制钝化膜生成

电池的钝化膜是由于电池长时间处于闲置开路状态而形成的,那么我们可以使电池一直维持在一个较小的电流放电工作状态,这样可以减缓电池的钝化膜生成的速度。通过选择合适的电阻值,使电池处于放电状态,比如放电电流控制在待机电流20uA左右,这样电池容量足够支撑15年左右,同时不会使钝化膜过厚而出现电压滞后导致RX-8025T完全掉电现象,从而影响RTC时钟的正常工作。

  •   当系统电源供电时,Q1导通,由电池BT1、R1、Q1形成回路,实现电池的放电状态;

  •   当系统电源停止供电时,Q1截至,电池经过D2给RTC芯片U1供电。

经实测时钟芯片及电池内阻自放电的电流为8uA左右,那么我们需要控制的电阻R1的阻值为3.6V/(20-8)uA=300k。

RTC时钟偶发性延时或超时该怎么办?
图5 控制钝化膜电路图

4、PCB设计

在PCB layout的时候需要注意RX-8052T与MCU的I2C走线应该越短越好,并且远离高频、高电流的信号线。同时旁路电容也应该靠近RX-8025T的电源端,并增加地线敷铜的面积,以防止干扰的产生。

来源: ZLG致远电子

围观 812

对于高速的串行总线来说,一般情况下都是通过数据编码把时钟信息嵌入到传输的数据流里,然后在接收端通过时钟恢复把时钟信息提取出来,并用这个恢复出来的时钟对数据进行采样,因此时钟恢复电路对于高速串行信号的传输和接收至关重要。

CDR电路原理

时钟恢复的目的是跟踪上发送端的时钟漂移和一部分抖动,以确保正确的数据采样。时钟恢复电路(CDR:Clock Data Recovery)一般都是通过PLL(Phase lock loop)的方式实现,如下图所示。

输入的数字信号和PLL的VCO(Voltage-controlled oscillator,压控振荡器 )进行鉴相比较,如果数据速率和VCO的输出频率间有频率差就会产生相位差的变化,鉴相器对这个相位误差进行比较并转换成相应的电压控制信号,电压控制信号经过滤波器滤波后产生对VCO的控制信号从而调整VCO的输出时钟频率。

使用滤波器的目的是把快速的相位变化信息积分后转换成相对缓慢的电压变化以调整VCO的输出频率,这个滤波器有时又称为环路滤波器,通常是一个低通的滤波器。通过反复的鉴相和调整,最终VCO的输出信号频率和输入的数字信号的变化频率一致,这时PLL电路就进入锁定状态。

一文看懂时钟是怎么恢复的?

环路带宽对眼图、抖动测量的影响

值得注意的是,在真实的情况下,输入的数字信号并不是一个纯净的信号,而是包含了不同频率成分的抖动。对于低频的抖动来说,其造成的是数据速率的缓慢变化,如果这个缓慢变化的频率低于环路滤波器的带宽,输入信号抖动造成的相位变化信息就可以通过环路滤波器从而产生对VCO输出频率的调整,这时VCO的输出时钟中就会跟踪上输入信号的抖动。

而如果输入信号中抖动的频率比较高,其造成的相位变化信号不能通过环路滤波器,则VCO输出的时钟中就不会有随输入信号一起变化的抖动成分,也就是说输入信号中的高频抖动成分被PLL电路过滤掉了。

如下图所示,我们通常会用PLL电路的JTF(Jitter Transfer Function,抖动传递函数)曲线描述PLL电路对于不同频率抖动的传递能力。JTF曲线通常是个低通的特性,反映了PLL电路对于低频抖动能很好跟踪而对高频抖动跟踪能力有限的特性。

一文看懂时钟是怎么恢复的?

对于低频的抖动,PLL电路能够很好地跟踪,恢复出来的时钟和被测信号一起抖动。如果接收端的芯片用这个恢复时钟为基准对输入信号进行采样,由于此时时钟和被测信号一起抖动,所以这种低频的抖动不会被观察到,对于数据采样的建立保持时间也没有太大影响。

相反地,高频的抖动会被PLL电路过滤掉,因此输出的时钟里不包含这些高频的抖动成分。如果用这个时钟对数据信号进行采样,就会观察到输入信号里明显的抖动。接收端用恢复时钟进行采样时能够看到的抖动与抖动频率间的关系有时我们会用OJTF(Observed Jitter Transfer Function,观察到的抖动传递函数)曲线来描述,其随频率的变化曲线正好JTF曲线相反。

正因为时钟恢复电路对于低频抖动的跟踪特性,因此很多高速串行总线的接收芯片对于低频抖动的容忍能力会远远超过对高频抖动的容忍能力。下图是USB3.0总线对于接收端芯片对于不同频率抖动容忍能力的要求的一条曲线,可以看到其对低频的容忍能力非常大,甚至可以远超过1个UI(数据比特宽度)。

一文看懂时钟是怎么恢复的?

时钟恢复电路的PLL的环路带宽设置不同,对于不同频率抖动跟踪能力也不一样。一般情况下,PLL的带宽设置越窄,恢复出来的时钟越纯净,但是对于抖动的跟踪能力越弱,用这个时钟为基准对数据做采样时看到的信号上的抖动会越多,看到的信号的眼图会越恶劣。

相反,如果PLL的带宽设置越宽,对于抖动的跟踪能力越强,恢复出来的时钟和信号的抖动越接近,用这个时钟为基准对数据做采样时看到的信号上的抖动会越少,看到的信号的眼图会越好。下图反映出的就是不同的PLL带宽设置对于恢复时钟抖动和以这个恢复时钟为基准对信号进行采样时看到的眼图的情况。

一文看懂时钟是怎么恢复的?

转自:至秦单片机

围观 9915

Graham Mostyn Microchip 时序和通信部 应用工程经理

几乎每个电子器件都需要一个时钟源。例如,单片机(MCU)使用振荡器来前进到下一条指令,无线电需要通过精确的振荡器来将射频信号混合到基带中加以处理。

智能联网设备的出现对时钟性能提出了更高的要求。本文解释了设计师如何在应对这些挑战的同时降低技术风险、缩短设计时间以及削减物料清单。我们着眼于采用石英和基于MEMS的技术的石英晶体、石英晶振(XO)和高度集成的时钟解决方案。

智能联网设备需要复杂的时钟树

MCU通常包括用于非精密计算应用的内部RC移相振荡器。这些振荡器使用集成的电阻-电容对来创建控制振荡器频率的时间常数。此类振荡器具有大约1%的精度并且表现出高抖动(在时钟转换的时序中会出现意外的随机波动)。 它们适用于不注重转换时序的应用,例如为计算用MCU提供时钟以及驱动一个简单的七段数字液晶显示屏(LCD)。显示屏需要多个时钟波形,但转换时序容差为几毫秒。此外,也可实现高达几Mbps的UART通信,这种情况下的时序容差为几百纳秒,但这同时也代表着简单RC振荡器的限值。

智能联网产品通过Bluetooth®、有线以太网、Wi-Fi®或其他连接协议与云端进行网络通信。由于涉及无线电和/或高速数据,因此需要精度达百万分之几(ppm)的低抖动精密时钟。

生成精密时钟所需的关键因素是稳定的参考频率,而这需要使用谐振器。谐振器是一种电子无源器件,在某些(谐振)频率下自然振荡的幅度高于其他频率——小提琴琴弦就是一个简单的例子。电子器件通常选用石英晶体和MEMS谐振器。

谐振器的要求如下:

1. 谐振频率随时间和温度变化呈稳定态势。这样可以避免时钟频率漂移。
2. 高品质因数(Q),确保谐振器只响应很窄的频带。
3. 能够在高信号电平下工作,从而在输出端达到良好的信噪比

第二项和第三项对于确保低抖动时钟信号至关重要,可实现稳定的时序转换。

由于谐振器是无源器件,因此需要受控的能量来维持振荡并产生参考频率。将谐振器以反馈配置耦合到维持放大器可实现这种稳定的振荡。如果石英晶体或MEMS谐振器配有合适放大器,会非常适合作为10 Mbps及以上域中数据传输的频率参考。

石英谐振器具有高Q值和高输出能力,适用于抖动必须极低的应用。 可以实现100飞秒的相位噪声(在传统的12 kHz至20 MHz带宽中测量)。MEMS谐振器能够以非常稳定的频率在扩展级温度下工作,而且兼具极高的可靠性以及抗冲击和振动性能,并能够实现超小型时钟解决方案(接近1平方毫米)。 MEMS谐振器具有较高的Q值和较低的输出;可实现500飞秒的相位噪声,而近期的谐振器设计也在不断降低该值。例如,许多现代网络应用(例如PCIe)都支持较小的集成带宽,因此这两种技术都非常合适。

在嵌入式系统中实现时钟

在嵌入式系统中,可通过三种常见的谐振器实现来产生时钟信号。

  •   将石英晶体直接连接到“目标SoC”(将由时钟驱动)

是时候改进您的时钟了!
图1:两个晶体直接连接到MCU,显示负载电容和串联电阻


  •   通过石英晶振(XO)为整个系统创建一个时钟输出
是时候改进您的时钟了!
图2:晶振由石英晶片组成,传统上采用陶瓷封装并带有金属盖


  •   基于石英或MEMS的时钟发生器(以低频和高频[>50 MHz]创建一个或多个时钟输出)
是时候改进您的时钟了!
图3:集成时钟发生器将MEMS(或晶体)谐振器与振荡器相结合,并通过可编程PLL和缓冲输出级扩展功能

点击下载pdf格式

围观 429

一、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

围观 296

页面

订阅 RSS - 时钟