免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

RTC时钟设计:内置晶振与外置晶振的取舍与实战解析

RTC时钟设计:内置晶振与外置晶振的取舍与实战解析 RTC实时时钟大概是硬件设计里最容易被低估的一环。前几天评审一块物联网主控板有人指着原理图问SoC内部不是有RTC外设吗为什么还要外接一颗32.768kHz晶振更奇怪的是另一块用同系列芯片的板子原理图上却看不到任何晶振封装上也没有空焊位说是晶振已经“内置”了。这个问题看起来简单真要把内置晶振和外置晶振的取舍讲透牵扯到的其实是一整套关于精度、功耗、BOM成本、供应链和失效维护的权衡。本文就从一颗石英晶体说起结合我这些年做过和修过的RTC电路把这两种方案的底细、选型逻辑、外围设计要点和常见坑完整拆一遍。内容主要面向硬件工程师、嵌入式开发和对时钟电路感兴趣的朋友偏实战尽量少讲空话。1. 先厘清一个概念RTC到底是外设还是芯片1.1 “RTC实时时钟”和“RTCPeerConnection连接失败”是两回事开始之前必须澄清一个概念混淆。网络上搜“RTC”会同时出现两拨内容一拨是硬件领域的实时时钟Real-Time Clock也就是本文要讨论的、靠晶振计数走时的电路另一拨是WebRTC技术里的RTCReal-Time Communication像“rtc connectionstate failed”这类问题指的是浏览器或客户端之间实时音视频连接状态异常和硬件时钟电路没有任何关系。如果你是因为排查“rtc connectionstate failed”搜到这篇文章可以先确认一下语境。如果是在WebRTC项目中遇到RTCPeerConnection的connectionState变为failed通常要从ICE协商、STUN/TURN服务器、NAT穿透和防火墙策略入手排查那是另一个技术方向。本文讲的RTC是主板上的实时时钟是那个让设备在断电后依然记得当前时间的电路。1.2 一套完整RTC时钟电路至少有四个部件很多刚入门的朋友以为RTC就是一颗芯片其实“RTC功能”和“RTC芯片/模块”是两个层面的事情。一套能正常走时、能在主系统断电后维持时间的RTC电路通常包含以下四部分时钟源晶振。绝大多数RTC用32.768kHz的石英音叉晶振因为2的15次方刚好等于32768经过15级二分频就能得到精准的1秒脉冲这是整个计时系统的心脏。振荡电路晶振需要配合芯片内部的反相放大器、反馈电阻和外部负载电容才能起振。这部分通常集成在SoC或RTC芯片内部外部只留晶振和两个电容。分频与计数逻辑RTC外设里真正的“分频器计数器闹钟寄存器”以及用来存储时间、日期的RTC寄存器组。供电回路主电源VDD掉电后RTC模块需要切换到备用电源如纽扣电池、超级电容继续工作。这个切换逻辑有时在芯片内部有时需要外部电路。搞清楚这四个部件之后再谈“内置晶振”和“外置晶振”的区别就有基础了。两者真正的分歧点只在第一项——时钟源那颗晶振放在哪里以及围绕它需要付出的设计代价。2. 内置晶振与外置晶振的核心差异从一颗32.768kHz石英晶体说起2.1 两者的物理结构差异先说外置晶振。这是一颗独立的石英晶体元件常见封装为圆柱形如DIP-2的3×8mm或贴片式如3215、2012、1610封装。它通过OSC_IN和OSC_OUT两个引脚连接到SoC/RTC芯片内部的反相放大器外部还需要搭配两颗负载电容通常几皮法到二十几皮法才能稳定振荡。这是最经典、最传统的做法。内置晶振则是在芯片封装阶段就把石英晶体直接封装进SoC或RTC芯片内部。常见有两种实现方式一是把晶振die和主芯片die一起做进同一个封装基板即CoBChip-on-Board或SiPSystem-in-Package另一种是直接在晶圆级做MEMS谐振器或薄膜体声波谐振器再和RTC电路集成。后者严格说已经不是石英晶振了但在系统层面提供的功能相同。对使用者来说最大的体感区别就是外置晶振方案需要为晶振留出PCB位置并做匹配设计内置晶振方案则是“通电就能走时”。2.2 一张表看清六大维度差异在实际选型时内置和外置晶振在各个维度上的差异非常明显我用一张表把关键项列出来对比维度内置晶振外置晶振BOM成本晶振成本包含在芯片单价里综合单价较高晶振本身便宜常用料单价约0.1~0.5元PCB面积与Layout无需外围器件和走线省面积需晶振焊盘、负载电容和接地包络区频率精度与温漂出厂即固定后期不可调可选不同精度档位可通过负载电容微调功耗集成度高寄生参数可控通常略优受PCB寄生电容、漏电流影响表现取决于设计可维护性晶振故障只能换整颗芯片晶振损坏可单独更换供应链灵活性单一来源芯片与晶振绑定晶振可多品牌、多料号替换单看这张表似乎外置晶振优势更大为什么还有那么多芯片厂坚持做内置晶振因为上面这张表忽略了两个关键因素开发周期和系统可靠性。内置晶振方案免去了负载电容计算、起振调试、EMI处理这一整个环节对模块厂和方案商来说这意味着原理图简单、layout面积小、生产直通率高。在很多消费类小体积产品里“少两个电容、少一段走线、少一个失效点”的价值远高于那几分钱的BOM差别。所以这两种方案没有绝对的胜负只是适用场景不同。3. 选型背后的真实工程考量为什么很多产品坚持外置晶振3.1 成本与供应链的灵活性如果你在一个对成本极度敏感的消费电子公司待过就会知道BOM里任何单一来源物料都是“风险点”。外置晶振的好处是32.768kHz晶振是一个非常成熟的通用料几乎每一个被动器件大厂都有货台系、日系、国产供应商加起来上百家。今天用Epson的MC-306明天换成TXC的7U26000E12只要封装和负载电容规格一致就能直接替换采购完全不用看芯片厂商脸色。内置晶振方案则等于把晶振变成芯片的一个“内置属性”。这颗SoC如果只有一家晶振代工来源那么芯片厂的交期波动就是整颗芯片的交期波动。更麻烦的是如果产品出货后晶振批次出现一致性漂移你没法通过更换晶振品牌来规避只能整批退回芯片处理成本和周期完全不可控。在医疗器械、电力计量这类要求产品生命周期长、可追溯性高的行业这种风险往往是决定性的所以很多工业级产品宁可多占一点PCB面积也要用外置晶振。3.2 精度标定与温漂控制的自由度RTC的走时精度取决于晶振的频率准确度和温度特性。普通消费级外置晶振精度常见±20ppm对应的月误差大约是52秒计算方式30天×86400秒×20×10⁻⁶≈51.8秒高级一点的±5ppm档位月误差约13秒如果对功耗不敏感还可以选带温度补偿的TCXO如±2ppm代价是成本上升到几块钱。内置晶振方案的频率属性在芯片出厂时已经固化你不能通过更换晶振来提升精度也不能通过外部负载电容来做频率微调。在电表需要满足日计时误差≤0.5秒的检定要求、基站同步、金融交易终端这类对时间精度有强制要求的场景内置晶振很难满足全温区指标。这也是为什么哪怕很多SoC内部已经做了RTC外设硬件工程师依然要在外面再接一颗外置晶振——图的就是精度档位可选、温漂可控。3.3 失效模式与维修策略从失效分析的角度看晶振是机械元件石英晶体在跌落、振动、极端温度变化下存在碎裂或电极开路的风险失效率虽然低但并非为零。外置晶振如果失效返修台上用热风枪吹下来换一颗就能恢复内置晶振失效则意味着整颗主控芯片报废。对于已经量产、出货量以万计的产品哪怕失效概率只差一个数量级备品备件和售后维修的成本差别也相当可观。当然内置晶振方案也有它独特的可靠性和抗干扰优势。晶振封装在芯片内部后振荡电路走线非常短受外部EMI干扰和PCB漏电流影响极小在恶劣电磁环境下反而可能比设计粗糙的外置晶振方案更稳定。只是这种稳定是“下限高”而外置晶振通过好的设计可以达到更高的“上限”。4. 外置32.768kHz晶振电路设计中最容易翻车的环节如果你决定用外置晶振方案下面这几个点是必须认真对待的。我评审过的原理图里RTC相关的问题几乎都集中在这里。4.1 负载电容的计算与匹配晶振规格书都会标注一个负载电容CL典型值6pF、7pF、9pF、12.5pF。这个值决定了晶振在工作电路中的频率牵引位置如果实际电路的等效负载电容偏离CL振荡频率就会偏离标称值走得快或走得慢。外部实际负载电容由两个匹配电容串联后再与PCB寄生电容并联构成计算公式为CL (C1 × C2) / (C1 C2) Cstray其中C1、C2是OSC_IN和OSC_OUT对地的两颗电容Cstray是引脚、焊盘、走线引入的杂散电容一般估算为2~5pF。如果晶振规格CL12.5pF取Cstray≈3pF那么两颗电容的串联值应为9.5pF左右即C1C2≈19pF实际可取标准值20pF。很多工程师图省事套用所谓的“20pF经验值”结果晶振频率偏出几十ppm日积月累走时误差就大了。要精确调频率还需要在量产板上实测。用频率计接在OSC_OUT引脚注意探头电容影响最好加缓冲级或用低电容探头测量实际振荡频率再把两个负载电容各增减1pF看频率移动方向和量级。一般来说负载电容增大频率降低负载电容减小频率升高。注意不同晶振厂家的CL标称基准不同ESR等效串联电阻也有差异。改晶振品牌时不能只对比封装和频率还要重新核对CL和ESR否则可能因驱动不匹配导致不起振或频率偏差。4.2 负性阻抗与驱动电平的工程验证晶振起振有两个硬指标负性阻抗Negative Resistance-R和驱动电平Drive LevelDL。负性阻抗代表振荡电路对晶振的“增益补偿能力”工程上要求-R至少大于晶振ESR的3倍推荐4~5倍。以一颗ESR为70kΩ的32.768kHz晶振为例-R至少应做到210kΩ以上低于这个值就存在低温不起振的风险。负性阻抗的实测方法我后面排查章节会详细讲。需要记住的是两颗负载电容的取值直接决定了-R的大小电容值越大反馈越深-R越大但功耗也越高电容值越小-R越小但更省电。要在起振可靠性和功耗之间找到平衡点而不是凭空拍脑袋。驱动电平则是施加在晶振上的实际功率。驱动过大石英晶体内部会产生频率漂移甚至机械损伤是RTC走时精度劣化和早期失效的常见原因。DL I² × ESRI是流过晶振的电流可以通过电流探头测量或通过串联小电阻估算。对数kHz晶振来说DL一般应控制在0.1μW到1μW量级具体看数据手册。4.3 布局布线与PCB漏电流问题32.768kHz晶振的功耗通常在微安级别这意味着振荡电路对外部阻抗异常极度敏感。三个最常见的layout错误晶振离SoC引脚太远。晶振到OSC_IN/OSC_OUT的走线长度一旦超过10mm寄生电容和噪声耦合都会显著影响起振。正确做法是晶振尽量贴近芯片引脚走线短而粗且两侧最好加地包络Guard Ring屏蔽。负载电容接地脚过孔太远。负载电容的GND端必须就近打孔到主地平面否则地回路阻抗会把振荡信号耦合到其他地方。晶振下方铺铜或走信号线。晶振正下方区域应保持净空避免高频数字信号穿过否则噪声会通过寄生电容注入振荡回路。另外PCB本身存在绝缘漏电阻尤其在高湿环境。OSC_IN和OSC_OUT之间如果平行走线过长板面受潮后漏电流可能直接破坏振荡条件。这也是工业产品里RTC在回南天或高温高湿环境下突然停走的主要原因之一。严重的情况下光靠layout优化不够还要考虑在晶振区域涂覆三防漆或在PCB设计时把两根振荡走线分到不同层。5. RTC时钟树上的时序与电源细节门控约束和后备电源切换5.1 时钟门控电路里的FALSE_PATH约束别一刀切RTC外设通常工作在慢速的32.768kHz时钟域而CPU、总线和外设工作在几十到几百MHz的快速时钟域。两个域交互时SoC内部会用时钟门控单元Clock Gating Cell来控制RTC时钟的启停。规范的ASIC设计里时钟门控是专用的ICGIntegrated Clock Gating单元内部是“latchAND”的时序结构保证时钟使能信号在时钟低电平期间变化避免输出毛刺。但在一些低成本SoC或FPGA方案里设计者图省事直接用了分立latch和AND门搭门控。问题来了综合和时序收敛阶段很多工程师对这些门控路径的时序约束认知模糊。有人觉得这些都是异步路径直接对相关时序路径设置set_false_path导致门控单元使能端的setup/hold检查全部被屏蔽。结果是仿真没问题实际流片后在电压温度环境变化时时钟使能信号在错误时刻翻转门控时钟输出出现毛刺RTC计数逻辑被误触发出现偶发的时间跳变。我在SDC约束里的处理经验是三条原则第一RTC_32K时钟与系统主时钟之间确实是异步关系用set_clock_groups -asynchronous声明而不要对整个RTC逻辑所有路径一刀切设false path第二文档上有明确说明的、确定不存在真实功能交互的跨域路径才单独用set_false_path指定第三门控单元本身的时序弧必须保留检查绝对不能用false path屏蔽门控内部的latch setup/hold时序要求。下面是一个典型的约束写法供参考# 声明异步时钟组 set_clock_groups -asynchronous \ -group [get_clocks {sys_clk}] \ -group [get_clocks {rtc_32k_clk}] # 只对明确无功能的跨域路径设置为false path set_false_path -from [get_clocks sys_clk] -to [get_pins u_rtc_domain/reg_dat_o/D]这样既能避免综合工具过度约束导致时序收敛困难又能保留门控单元的时序检查从根上降低毛刺风险。这个问题在网络上讨论得不少但能说清楚的资料不多我在这里分享的是经过多个量产品验证的做法。5.2 RTC主电源与纽扣电池的切换电路设计RTC需要常供电主系统关机后由备用电源维持走时和寄存器内容。很多SoC的RTC电源域支持VDD_RTC和VBAT双电源输入内部有切换电路。以全志H136这类国产SoC为例参考设计里一般保留VBAT引脚外部接一颗纽扣电池或法拉电容内部实现主电源优先、掉电自动切到VBAT的功能。这种“域内切换”对硬件工程师最省心只需保证VBAT引脚按手册接上电池并加合适的滤波电容即可。但如果你用的SoC里只做了单电源域就需要自己搭切换电路。早年大家都在用“两个二极管或门”——VDD_RTC通过肖特基二极管接主电源VBAT也通过肖特基二极管接同一网络。这个方案虽然简单但二极管正向压降会白白消耗电池电量一颗CR2032本来能撑三五年加0.3V压降可能只撑两年。更好的做法是用PMOS管做理想二极管切换。控制逻辑很简单主电源正常时PMOS的栅极被拉高关断系统由主电源供电主电源掉电后PMOS的栅极被下拉到VBATPMOS导通电池直接给RTC供电。注意两个细节一是PMOS的体二极管方向必须正确防止电池反向给主电源回路漏电二是切换瞬间要避免两个电源同时导通关断造成电压过冲必要时加RC延迟或使用专用的电源切换IC如负载开关、理想二极管控制器。RT9013、SGM2019等LDO本身有低静态功耗特性也常被用在RTC供电上但要注意待机电流是否满足纽扣电池的使用年限要求。6. 晶振不起振、走时不准的排查链路实录这是我实际排查过的几次故障的完整思路按从易到难的顺序写出来大家可以照着做。6.1 先排除最简单的因素焊接、引脚、寄存器配置遇到RTC不走时先别急着怀疑晶振坏了按照下面的顺序快速过一遍检查晶振是否焊反或虚焊。贴片晶振没有方向但焊盘和封装不匹配时容易出现一端翘起或桥连。用万用表量晶振两端是否有合理的阻抗读数正常应在数兆欧以上短路或开路都说明焊接或器件异常。确认OSC_IN和OSC_OUT没有接反。有些SoC的这两个引脚并不是对称的反接后振荡器起振条件会被破坏尤其是一些引脚定义比较特殊的国产芯片。检查SoC/RTC芯片的RTC相关寄存器是否使能。很多芯片默认关闭RTC振荡器或数字LDO需要用软件开启XTAL驱动。例如STM32的RTC需要先把RCC_BDCR里的LSEON置1再等待LSERDY就绪。新板子第一次调试能先点灯就别先搞RTC确认I2C/SPI能正常读写RTC寄存器再谈走时。量一下VBAT/VDD_RTC供电是否到位电压是否在手册范围内。供电偏低0.2V往往会导致RTC能写不能走时。6.2 用负性阻抗实测判断起振裕量如果上面这些都没问题晶振还是不起振就要动手测负性阻抗了。方法是在晶振反馈回路里串入一颗可变电阻逐步增大阻值直到振荡停振然后根据临界值计算起振裕量。具体操作步骤电路板断电将晶振的一只脚从焊盘上抬起串入一个精密可调电阻或用低阻值电位器替代。从0Ω开始上电观察OSC_OUT引脚波形确认振荡正常。逐步增大串入电阻每次增加10~50kΩ同时用示波器监测波形幅度。当波形幅度明显变小并最终停振时记录临界电阻值Rs。用示波器或阻抗分析仪测量该晶振的实际ESR负性阻抗-R ESR Rs。将这个值除以ESR得到起振裕量倍数。如果-R/ESR小于3说明振荡电路的增益不足需要减小负载电容、增加DC偏置电阻或检查芯片的驱动电流设置。如果-R/ESR在4~5倍以上起振可靠性基本没问题。示波器探头本身会引入电容负载一般用×10档测量探头电容约10~15pF对32.768kHz振荡回路影响已经很大。最稳妥的办法是测量OSC_OUT时串一个几十kΩ电阻隔离或者在探头前端加一级单位增益缓冲避免测量动作本身改变振荡条件。6.3 PCB漏电与回焊应力两个容易被忽视的元凶还有一种不起振/走时慢的“顽固”情况晶振单独测试正常但焊到板上就不起振。这种时候多半是板级问题。第一类是漏电。晶振两个焊盘之间如果有助焊剂残留或PCB表面清洁度差板上会形成高阻漏电通道。在潮湿环境下这个漏电阻可能跌到几百kΩ以下直接把振荡条件拉崩。处理办法是重新清洗晶振周边区域并检查OSC_IN/OSC_OUT之间的安全距离是否足够。第二类是回焊热应力。晶振经过回流焊时石英晶体受到热冲击加上PCB冷却过程中的机械应力晶体可能产生微裂纹。微裂纹初期对频率影响很小但在后续温度循环中逐渐扩大几个月后设备突然出现RTC停走或每天快慢几十秒。这种情况在双面板、板弯曲应力大的产品里更常见。排查手段是低温加热台把晶振区域加热到80℃左右看频率是否发生明显漂移或直接停振也可以把故障板上的晶振拆下来放到外部测试夹具里量频率精度如果夹具里正常而板上有问题说明问题在板上而非晶振本身。我遇到过最典型的一个案例某款室内温控器量产三个月后陆续反馈时间越走越快每天快接近30秒。拆机检查发现晶振负载电容用的是10pF但晶振规格CL是6pF等效负载电容偏大导致频率正偏。软件做不了补偿硬件修改负载电容后故障全部消失。这个案例的教训是晶振电路不是“按参考设计抄完就行”每一颗晶振的CL、ESR、驱动能力都需要和芯片手册、振荡电路实际参数互相核对。写在最后RTC电路看似只是“一颗晶振加两个电容”的小事但它横跨了晶振器件特性、振荡器原理、时序约束、电源切换和失效分析好几个领域。内置晶振和外置晶振的争论本质上不是技术先进性之争而是产品定位、供应链策略、开发效率和可靠性风险之间的权衡。就我个人而言做小体积消费类产品时会倾向内置晶振方案图省心和稳定做工业级、计量类产品时一定坚持外置晶振把精度、可维护性和供应链的主动权握在自己手里。硬件设计里的很多选择都是这样没有最优只有最合适。
返回列表