免费获取学习方案
ARTICLE DETAIL

资讯详情

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

STM32低功耗RTC备电设计:CR2032供电与32.768kHz晶振实战

STM32低功耗RTC备电设计:CR2032供电与32.768kHz晶振实战 前阵子做一个便携数据记录仪结构很简单MCU 采集传感器、存数据、定期唤醒上报核心要求是断电后 RTC 得继续走主电源切掉以后全靠一颗 CR2032 纽扣电池供电。当时以为这种经典方案最多半天就能搞定结果从硬件到软件来回折腾了两天踩了晶振不起振、复位清时间、待机电流居高不下好几个坑最后全部排查完实测备份电流稳定到了 1µA 级别。这篇文章不聊虚的直接把我的完整方案、电路选型、参数计算、固件关键代码和排查经验都放出来给正在做同类低功耗、RTC 备电项目或者第一次碰 STM32 外部 32.768kHz 晶振和备份域供电的朋友做参考。1. 项目概述与整体方案设计1.1 需求分析什么场景真的需要纽扣电池 RTC先说清楚应用场景。市面上绝大多数电子设备在主电源存在时RTC 直接由系统电源供电时间走不走完全看电源。但有一类设备比如数据记录仪、智能电表、冷链运输标签、电动工具控制板它们要么需要长时间无人值守要么主电源可能被物理断开比如用户关掉总闸、拔出电池此时设备的时间基准不能丢否则恢复供电后数据时间戳全乱套。另一类场景是超低功耗系统主系统大部分时间处于休眠或者完全断电状态整机只保留 RTC 待机唤醒电路让系统可以在指定时间点或周期醒来干活。这时候纽扣电池不是后备电源而是唯一的供电来源它要把 RTC 的电流扛几个月甚至几年对整体功耗的约束就非常严格。所以这个项目的核心需求可以拆成四条主电上电系统正常工作、主电断电后 RTC 继续计时、纽扣电池供电电流尽量低、恢复主电后 RTC 时间不能丢也不能被程序误覆盖。搞清楚需求之后硬件方案选型就不会跑偏。1.2 供电架构主电源、VBAT 与纽扣电池的关系STM32 内部有个备份域Backup Domain包含 RTC、LSE 外部低速晶振、备份寄存器和部分唤醒逻辑。这个备份域可以由主电源 VDD 供电也可以由 VBAT 引脚单独供电。芯片内部有一组电源切换电路VDD 存在时由 VDD 给备份域供电VDD 跌到某个阈值以下内部自动切换成 VBAT 供电不用软件干预。很多人第一次做这个方案时习惯性地给 VBAT 串二极管、加隔离 MOS、甚至自己搞一个电源自动切换电路结果反而引入了额外压降和漏电流。实测下来除非你有特殊应用比如电池既要给 RTC 又要给外部 RAM否则直接让 VBAT 接纽扣电池正极电池负极接 GND就是最简单可靠的方案。1.3 芯片选型为什么我更推荐 STM32L 系列如果项目还没定死芯片做低功耗 RTC 备电优先选 STM32L 系列比如 STM32L151、STM32L431、STM32L496 这种。原因很直接F1 系列的备份域电流大概 2~3µAL 系列能做到 0.6µA 左右差别非常明显。用 220mAh 的 CR2032 来算2µA 和 0.6µA 对应的理论寿命分别是 12 年左右和 40 年虽然都够用但你要考虑电池自放电、温度、电压窗口这些现实因素余量越大越稳。如果你们公司物料只有 F103也能做F103 的备份域电流并不是高到不能接受但软件上要多处理备份域写保护、BKP 寄存器这些细节。所以我的建议是新项目用 L4 系列或 GD32E 系列的低功耗型号老项目沿用 F1 也没问题具体可以通过实测来验证是否满足需求。2. 硬件电路设计纽扣电池供电的坑与对策2.1 VBAT 引脚的正确接法VBAT 引脚看起来简单实际上有不少细节。STM32 数据手册的要求是VBAT 接 1.8V 到 3.6V 的电池典型用 3V 纽扣电池。如果不用外部电池VBAT 必须直接接到 VDD不允许悬空这一点新手特别容易漏。实际项目里我在 VBAT 和 GND 之间加了一个 100nF 陶瓷电容放在电池座附近用来滤除电源线引入的高频噪声。注意这里不建议加大电解电容因为纽扣电池供电时每个微安都要精打细算大电容自身的漏电流在这个场景下不可忽略100nF 已经足够稳压和滤波。还有一点VBAT 引脚走线要尽量短直接靠近电池座正极不要在中间打太多过孔。STM32 在 VDD 和 VBAT 之间有电源切换电路如果走线太长等效电感会增大在 VDD 快速掉电时可能影响切换速度极端情况下会有短暂的时间校准丢失风险。2.2 电源切换方案对比二极管、MOS 管还是直接接不少网上参考设计会在 VBAT 前面串二极管理由是想防倒灌。但 STM32 内部已经有切换电路VBAT 引脚本身具备隔离功能VDD 存在时电池不会被反向充电。这里必须强调不能用那种把主电源通过二极管和电池并联给 VBAT 的方案因为 CR2032 不可充电如果主电源电压高于电池电压会持续给纽扣电池灌电流时间长了电池鼓包、漏液都是可能的。如果你坚持在外围加切换电路一般有两种做法第一种是 P 沟道 MOS 管做电源路径管理主电存在时 MOS 关闭、电池通路断开主电掉电后 MOS 自动导通。问题是这个电路待机时 MOS 自身的 G-S 泄漏电流和分压电阻电流通常在微安级别比 STM32 备份域还耗电反而把低功耗优势吃掉了。第二种是用专业的电源多路复用器比如 TPS2121、LTC4415这类芯片静态电流很低切换速度也很快但成本高、封装复杂小项目完全没有必要。我做这类低功耗备电时始终用最朴素的方案VBAT 直接接电池不额外增加任何有源器件。2.3 32.768kHz 晶振电路设计与匹配计算RTC 要准确计时外部 32.768kHz 晶振是标配。这里有个热词叫stm32 内部 32khz 做 rtc确实 STM32 内部有 LSI 低速时钟约 32kHz但 LSI 的精度通常在 ±5% 左右而且受温度影响大做唤醒定时器可以做 RTC 日历的话一天能差几十秒完全不可接受。因此低功耗 RTC 项目必须使用外部 LSE 晶振。晶振电路的设计核心是两个匹配电容。以我常用的 32.768kHz、负载电容 CL6pF 的贴片晶振举例PCB 上晶振焊盘和 STM32 引脚之间还有杂散电容 Cstray经验值大概 2~4pF。匹配电容的计算公式是CL (C1 × C2) / (C1 C2) Cstray如果两个电容取相同容值 CX则 CL CX / 2 Cstray。反过来算匹配电容CX (CL - Cstray) × 2代入 CL6pFCstray3pF得到 CX 6pF。实际 E24 系列贴片电容没有 6pF 整标称值可以用 6.8pF效果完全没问题。如果晶振规格是 CL12.5pF则 CX (12.5 - 3) × 2 19pF用 18pF 或 20pF 都可以。晶振布局上LSE 晶振必须靠近 STM32 芯片的 OSC32_IN 和 OSC32_OUT 引脚两个匹配电容分别从对应引脚就近接 GND晶振正下方不要走数字信号线和电源线。我见过不少板子芯片已经走出很远的走线才接电容这种布局起振困难甚至需要把示波器探头搭上才勉强能起振。2.4 电池座、ESD 保护与防反接设计纽扣电池座的选型主要是材质和稳压结构。CR2032 电池座有两种常见类型贴片卧式弹片式和贴片直脚式。我项目里用的是带绝缘环的卧式贴片座这个绝缘环能防止电池正面负极和弹片之外的部分意外短路。电池座的 GND 弹片应直接连到 PCB 铺铜地正极弹片用较宽的走线引出到 VBAT。ESD 保护方面电池座暴露在外壳按键开孔附近时人体静电可能通过电池触点直接灌进 VBAT。由于 VBAT 直连芯片备份域过压或 ESD 容易损坏备份域电路。建议在 VBAT 对地并联一颗 5V 或 6V 的 TVS 管注意选择超低漏电流型号比如 SD05、ESDA5V3它们的泄漏电流通常在 1µA 以下相对整个备份电流还可以接受。如果是全封闭结构没有外露触点TVS 也可以省略但加一颗更稳妥。防反接这个功能主要靠电池座的结构保证。市面上正规的 CR2032 座都是负极朝下、正极朝上弹片位置决定了电池装反不会形成回路。如果你用的电池座没有明显的正负极防呆槽那就要在结构上增加筋位或者选用带极性标识的型号这一点做结构评审时最好专门确认。3. 纽扣电池选型与功耗预算3.1 CR2032 特性与自放电CR2032 是锂-二氧化锰电池标称电压 3V开路电压在全新时约 3.2~3.3V标称容量在 200~240mAh 之间具体看品牌和批次。它最突出的优势是自放电小常温下每年自放电约 1% 左右官方文档里存储寿命通常标 5~10 年。但它也有短板内阻不算小尤其是大电流脉冲能力弱。如果你的系统在电池供电阶段有瞬间电流比如 RF 发射脉冲或者唤醒瞬间有大电流会导致电池电压瞬间跌落严重时低于 STM32 VBAT 的最低工作电压RTC 会出错。所以纽扣电池比较适合纯 RTC 备电这种微安级电流场景不适合带射频发射这种毫安级以上脉冲负载。如果系统确实需要在电池供电阶段做无线发射更合理的方案是纽扣电池 超低功耗 DC/DC 升压或者干脆换成锂亚电池比如 ER14250配合超级电容。这里只讨论纯 RTC 备电的场景。3.2 系统功耗项一览做功耗预算前先要把系统在电池供电阶段的全部耗电路径列出来。以我的 STM32L431 项目为例主电断开后仍然通电的模块包括STM32 备份域RTC 日历 LSE 振荡器 备份寄存器典型 0.65µA加上备份 RTC 所需电压稳压器后约 1µA 左右VBAT 滤波电容漏电流100nF 陶瓷电容几乎可以忽略但如果用了 1µF/10µF 的高容值电容高温下泄漏会增加TVS 漏电流低漏电流 TVS 大约 0.1~0.5µA电池座接触电阻损耗一般引脚接触良好时是微欧级基本可忽略把这些加总理想情况下电池供电电流在 1.5µA 以内这个数字决定了电池寿命的上限。3.3 电池寿命估算示例寿命估算公式非常简单理论寿命小时 电池容量mAh / 系统平均电流µA假设系统平均电流为 1.5µACR2032 容量 220mAh220mAh / 1.5µA ≈ 146666 小时 ≈ 16.7 年这个数字看起来非常可观但实际寿命要打折。原因有三个电池自放电大约每年消耗 1%~2%电池电压会随着放电逐渐从 3.3V 降到 2.0V 左右但 STM32 L4 的 VBAT 最低工作电压约 1.2V电压窗口其实足够温度升高自放电加快60°C 环境下自放电率远高于常温。考虑到这些因素实际工程中我一般把理论寿命乘以 0.6 左右作为参考值。也就是说平均电流 1.5µA 的系统CR2032 保守估计能扛 8~10 年。如果你的设计寿命要求超过 10 年建议要么把平均电流压到 1µA 以下要么换更大容量的 CR2477 或者锂亚电池。4. 软件实现低功耗 RTC 完整代码流程4.1 低功耗模式选择Stop 还是 StandbySTM32 低功耗模式选错了电流直接差一个数量级。先看 L 系列带 RTC 的情况下STOP2 模式系统电流可以到 2~3µASRAM 内容保留唤醒时间约几微秒非常适合醒来干活继续睡的周期性任务。SHUTDOWN 模式是电流最低的模式但唤醒相当于复位而且它不能保留 SRAM 内容如果你的唤醒条件不够独立不太实用。F1 系列则只有 STOP 模式和 STANDBY 模式。STOP 模式保留 SRAM电流大概几十微安到一百多微安在低功耗项目里反而显得有点鸡肋STANDBY 模式电流可以到 3.4µA 左右带 RTC但唤醒后程序重新从头执行需要靠备份寄存器判断唤醒来源。我的做法是如果芯片支持 STOP2 且唤醒后需要恢复复杂状态就用 STOP2如果整机要求极低功耗、唤醒后只需要干一件简单事情就用 STANDBY。这个项目里我用 STOP2 RTC WakeUpTimer 周期性唤醒做完整数据采集后重新入睡。4.2 RTC 初始化外部 LSE 时钟配置RTC 初始化代码在不同芯片上有差异但整体思路一致启动 LSE等待 LSE 稳定配置 RTC 时钟源设置分频系数使能 RTC。以 STM32L4 的 HAL 库为例核心配置如下void MX_RTC_Init(void) { RTC_HandleTypeDef hrtc; /* 使能PWR时钟并解除RTC写保护 */ __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnableBkupAccess(); /* 如果RTC还没配置过才执行完整初始化 */ if ((RCC-BDCR RCC_BDCR_RTCEN) ! RCC_BDCR_RTCEN) { /* 复位备份域 */ __HAL_RCC_BACKUPRESET_FORCE(); __HAL_RCC_BACKUPRESET_RELEASE(); /* 使能LSE并等待就绪 */ __HAL_RCC_LSE_CONFIG(RCC_LSE_ON); uint32_t timeout 1000000; while ((__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) RESET) (timeout 0)) { timeout--; } if (timeout 0) { /* LSE起振失败需要进入错误处理 */ } /* 选择LSE作为RTC时钟源并使能RTC */ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); __HAL_RCC_RTC_ENABLE(); /* RTC相关配置 */ hrtc.Instance RTC; hrtc.Init.HourFormat RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv 127; /* 时钟源32768Hz异步分频128得到256Hz */ hrtc.Init.SynchPrediv 255; /* 同步分频256得到1Hz */ hrtc.Init.OutPut RTC_OUTPUT_DISABLE; HAL_RTC_Init(hrtc); /* 设置初始时间 */ RTC_TimeTypeDef sTime {0}; RTC_DateTypeDef sDate {0}; sTime.Hours 0x0; sTime.Minutes 0x0; sTime.Seconds 0x0; sTime.TimeFormat RTC_HOURFORMAT24; sDate.Date 0x1; sDate.Month RTC_MONTH_JANUARY; sDate.Year 0x24; sDate.WeekDay RTC_WEEKDAY_MONDAY; HAL_RTC_SetTime(hrtc, sTime, RTC_FORMAT_BCD); HAL_RTC_SetDate(hrtc, sDate, RTC_FORMAT_BCD); } }有几个地方特别容易出错。第一LSE 起振需要时间通常几百毫秒到一秒所以必须做超时处理不能死等。第二如果此前已经配置过 RTC第二次软复位进入RTCEN 位已经置位直接重新执行 HAL_RTC_Init部分库实现会重置 RTC 计数器导致时间变成初始值所以一定要判断 RTCEN 状态已经运行的就跳过初始化。第三个坑是 HAL_PWR_EnableBkupAccess 之后写 BDCR 寄存器前建议先加一条 DMB 指令或者空的读操作防止编译器乱序优化导致写时序异常。4.3 进入低功耗与定时唤醒在 STOP2 模式下RTC WakeUpTimer 可以配置为定期触发唤醒中断。唤醒定时器的时基通常选择 RTC_WAKEUPCLOCK_CK_SPRE_16BITS也就是由 1Hz 的同步预分频输出提供时钟计数器是 16 位最长能睡 65535 秒约 18 小时不够的话可以嵌套多层唤醒逻辑。进入 STOP2 的代码大致如下void EnterLowPowerAndWaitWakeUp(uint32_t seconds) { /* 设置RTC唤醒定时器 */ HAL_RTCEx_SetWakeUpTimer_IT(hrtc, seconds, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); /* 设置唤醒后使用的时钟源 */ HAL_RCCEx_SetWakeUpSource(RCC_WAKEUPSOURCE_HSI); /* 关闭调试器连接时的掉电检查避免调试状态影响低功耗 */ HAL_DBGMCU_DisableDBGStandbyMode(); /* 停止系统嘀嗒定时器防止SysTick中断唤醒系统 */ HAL_SuspendTick(); /* 进入STOP2模式 */ HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); /* --- 唤醒后才执行 --- */ /* 重新配置系统时钟 */ SystemClock_Config(); HAL_ResumeTick(); }这里有一个很隐蔽的问题从 STOP2 唤醒后芯片的 Flash、GPIO 配置和系统时钟可能处于恢复状态如果在唤醒严重依赖系统时钟的代码比如串口输出、ADC采样之前没有重新调用 SystemClock_Config实际工作时钟可能还是低速的 MSI导致外设时序错乱。我调试低功耗时遇到过一次唤醒后 UART 波特率异常排查完就是这个原因。4.4 备份域寄存器与掉电标志RTC 时间掉电不丢除了硬件接好 VBAT 之外软件还要会用备份域寄存器保存系统状态标志。STM32L4 的备份寄存器有 32 个每个 32 位F1 系列也有 20 个 16 位 BKP 寄存器。它们是备份域的一部分VDD 掉电后只要 VBAT 还在数据就不会丢。我在这个项目里用两个备份寄存器存状态一个存RTC 是否已经初始化过另一个存上次断电时系统的运行阶段。这样恢复供电后程序可以从复位向量开始查这些标志判断是需要完整初始化还是直接恢复运行。// 写入标志 HAL_PWR_EnableBkupAccess(); HAL_RTCEx_BKUPWrite(hrtc, RTC_BKP_DR0, 0x12345678); uint32_t flag HAL_RTCEx_BKUPRead(hrtc, RTC_BKP_DR0);还有一个容易忽略的细节如果从 STANDBY 模式唤醒整颗芯片相当于经历了一次上电复位但备份域没有复位。所以程序开头必须检查复位标志寄存器中的 STANDBY 标志位判断当前是冷上电还是 Standby 唤醒。如果是后者跳过 RTC 初始化和时间写入直接进入正常运行流程如果是前者再走完整初始化。F1 的写法是检查 PWR-CSR 的 SBF 位L4 是检查 RCC-RSR 里的相关标志HAL 库封装成了 __HAL_PWR_GET_FLAG(PWR_FLAG_SB)。5. 实测功耗数据与优化记录5.1 实测方法万用表怎么测才能测得准测微安级电流最忌讳直接拿普通万用表电流档往电池回路上一串就开测。常见台式万用表的最小电流档分辨率可以到 0.01µA但量程内阻压降不可忽略实际会影响被测电路工作状态。更常用的办法是使用万用表电压档配合精密采样电阻比如 100Ω 或 1kΩ 的 0.1% 电阻串联测量压降再换算电流。如果手头有皮安级电流计或者源表那就更省事。我用的是 Keysight 34461A 万用表的 µA 档直接串联测试同时注意一个坑万用表切换量程时会有短暂开路如果此时电池电压跌落RTC 时间可能被干扰。所以我都是先用粗短跳线并联在万用表两端等系统稳定后再断开跳线读取电流测试完先恢复跳线再拆表笔。5.2 各模式电流对比以 STM32L431 LSE RTC 为例实测数据大概这样模式/条件实测电流说明VDD 断开VBAT 仅供电备份域RTCLSE0.82µA25°CCR2032 实测供电整机 STOP2 RTC WakeUpTimer3.1µA包含 LDO 静态电流和外设泄漏整机 STANDBY RTC WakeUpTimer2.6µAL4 标准模式F103 VBAT 备份域RTCLSE2.9µA对比用F1 系列明显偏高注意这些数字和环境温度强相关说明手册里给的典型值通常在 25°C 下温度到 40°C 以上电流会翻倍甚至更高。如果你的产品要在高温环境长期运行做功耗预算时一定要按最高工作温度下的实测值来算。5.3 影响功耗的隐藏细节功耗优化做到 3µA 以下后很多平时忽略的因素开始起决定性作用。我实际排查过程中发现过几个非常隐蔽的漏电路径第一个是 GPIO 配置。所有不用的引脚如果默认是浮空输入外部噪声会通过引脚内部保护二极管产生亚阈值漏电。解决方法是把未使用引脚全部配置为模拟模式或高阻输出并且输出低电平不要让引脚悬空。HAL 库建议在 GPIO_Init 里把每个引脚都显式配置。第二个是外部下拉/上拉电阻。如果我为了霍尔传感器、按键输入等加了大阻值电阻掉电后这些电阻如果直接从 VBAT 取电就会形成漏电路径。这种电阻要从主电源 VDD 侧供电不能挂到 VBAT 上否则纽扣电池要额外给它们供电。第三个是调试接口。如果 ST-Link 或者 J-Link 还连着芯片默认会进入调试状态部分低功耗模式会被阻止或者电流增大。这个在现场调试时最容易让人误判为什么我电流降到不低。所以正式测试前要断开调试器或者把 SWDIO/SWCLK 引脚在代码里配置为普通 GPIO 甚至禁用。6. 常见问题与排查技巧实录6.1 LSE 晶振不起振怎么办晶振不起振是最常见的问题现象是 RTC 时间不走或者程序卡在等待 LSERDY 超时循环里。排查思路按概率从高到低排列第一看匹配电容有没有焊错位置。有不少原理图把两个匹配电容设计成串联在晶振两个引脚之间但实际上是两个电容分别从 OSC_IN、OSC_OUT 到 GND焊错位置根本没有谐振回路自然无法起振。第二看晶振封装型号和负载电容是否匹配。32.768kHz 晶振有圆柱封装 2×6、贴片 3215、2012 等不同规格负载电容从 4pF 到 12.5pF 都有。如果原理图按 6pF 匹配电容设计实际焊了 12.5pF 负载电容的晶振起振困难或者频率偏差过大。这里最好核对 BOM 物料规格和晶振丝印。第三看 PCB 布局。LSE 引脚附近不能有高频数字线特别是 I2C、SPI 这种边沿很陡的信号。我在一个项目里发现 LSE 晶振下方经过了一条 SPI_SCK结果 SPI 通信时 RTC 秒跳变异常移开走线后恢复正常。如果以上都排查完还不振可以试试用示波器探头的 1 倍衰减档直接夹在 OSC_OUT 上测量有时候探头的电容能把晶振拉起来看到波形这其实反过来说明电路余量不足。更专业的做法是把 OSC_OUT 映射到 MCO 引脚上输出 32.768kHz 观测但注意 MCO 会增加额外负载测试完要关掉。6.2 掉电后再上电时间被清零时间清零通常分两种情况。第一种是 VBAT 根本没接好比如电池座虚焊、接触不良、纽扣电池没装到位、VBAT 引脚空焊。这种情况断电后备份域供电缺失RTC 直接丢失时间。排查办法就是断电后测 VBAT 引脚对地电压应该接近 3V如果测量值是 0V就是硬件连接问题。第二种是软件问题程序在每次上电复位后都认为需要初始化 RTC无条件写了一次当前时间导致备份域里原来的时间被覆盖。这种情况的坑在于电表观察 RTC 是有数值的但数值不是断电前的真实时间而是代码里写的固定初始值。解决办法是前面提到的 RTCEN 判断或者是利用备份寄存器标志位判断首次使用才初始化。我见过一个更隐蔽的变种程序里 HAL_RTC_Init 每次都执行但 HAL 库内部会先关 RTC 再配置即使不写新时间RTC 计数器也被重置了。所以那些看起来没动时间的代码只要它每次初始化都完整走一遍 RTC_Init 流程就等于把时间清零。正确做法是把 RTC 初始化拆分成时钟使能和时间写入两个阶段只有备份标志显示从未初始化时才写入时间。6.3 纽扣电池电压正常但系统反复复位有一种反直觉的现象电池电压测量有 2.8V但系统上电后反复复位或者 STM32 无法从待机唤醒。这种问题大多出在纽扣电池的内阻和瞬时电流能力上。CR2032 在冷启动时如果给一个大电容充电瞬间电流可能达到几十毫安电池电压被拉低到复位阈值以下形成上电复位-充电-又复位的循环。解决方法是在 VBAT 通路串联一个小阻值限流电阻比如 100Ω 左右给上电冲击提供缓冲。另一种做法是引入一个缓启动电容让备份域电压爬升更平缓。但要注意不能加太大电容否则反而延长电压建立时间。如果 VDD 侧和 VBAT 侧同时存在还要检查主电源和电池电源之间是否存在倒灌路径。用万用表二极管档测 VDD 到 VBAT 的正反向导通压降正常情况下单向截止如果两个方向都有压降说明有寄生二极管或者防护器件漏电需要认真检查原理图。6.4 用 LSI 做 RTC 造成的时间精度问题我曾经偷懒过一版不想为 RTC 增加外部晶振直接用 LSI 内部 32kHz 做 RTC 时钟源。结果设备放了一晚上第二天早上时间偏了二十多分钟。LSI 的标称精度就那样而且它主要用于看门狗、唤醒源或者 CPU 时钟做 RTC 日历时间基准对大多数应用来说是不可接受的。如果你的项目对时间精度有要求同时又想省外部晶振可以考虑带数字校准功能的高精度实时时钟专用芯片或者带温补的 RTC 模块但那样电路复杂度和成本就上去了。普通 RTC 备电应用老老实实用外部 32.768kHz 匹配电容精度可以到 ±20ppm对应每天误差不到 2 秒配合软件 NTP 校准还能进一步收敛。7. 一点排查小技巧和我的个人经验最后分享一个我自己的排查习惯每次拿到低功耗相关的板子我第一件事不是看代码而是用热成像仪看整板温度分布。漏电元件通常会微热一颗 1µA 漏电流的元件在 3V 供电下功耗只有 3µW热成像未必看得出来但如果漏电到了 10µA 以上局部温度和环境温度会有一个很明显的差异这时候再配合逐路断开排查就能快速定位问题。另外在实际项目里我习惯给整个备电回路的电池电流做一个基准标定先用精密源表给 VBAT 加 3.0V 电压分别记录芯片单独开启 RTC、开启备份寄存器读写、开启 WakeUpTimer 时的电流变化。这样等整板被测出异常电流能直接对比基准数据判断是芯片行为异常还是外围电路漏电省的把时间耗在拆板子猜零件上。这个做法对我的项目帮助很大建议你也可以试试。
返回列表