尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

S-35390A RTC芯片:高精度低功耗实时时钟的硬件设计与软件驱动实战

S-35390A RTC芯片:高精度低功耗实时时钟的硬件设计与软件驱动实战 1. 从“计时”到“守时”S-35390A芯片的定位与价值在嵌入式系统和物联网设备里给设备一个“靠谱”的时间这事儿听起来简单做起来却处处是坑。你可能遇到过这样的场景一个数据采集终端断电重启后时间归零导致采集的数据时间戳全乱一个智能门锁因为内置的RTC实时时钟精度太差累计误差几个月后定时开锁功能完全错乱或者一个需要严格时间同步的工业控制器因为计时芯片在低温下罢工整个产线跟着停摆。这些问题的核心往往都出在那个负责“守时”的芯片上——它不够准、不够稳、或者不够省电。今天要聊的S-35390A就是瑞萨电子Renesas旗下的一款高性能、低功耗的I2C接口实时时钟芯片。它不是那种只能简单计时的“玩具”而是一个在-40°C到85°C的工业级温度范围内都能保持高精度、极低功耗运行的“时间守门员”。对于需要长时间离线运行、电池供电且对时间准确性有苛刻要求的设备来说比如智能水表、气表、资产追踪器、医疗设备、安防系统等选对一颗RTC芯片往往意味着产品可靠性的本质提升。S-35390A的核心价值在于它用极简的外围电路和极低的功耗成本解决了嵌入式系统里“精准守时”这个基础却关键的难题。它内置了高精度的32.768kHz晶体振荡器出厂时已经过频率调整典型精度可以达到±5ppm百万分之五的水平。换算一下这意味着它一个月的误差最多只有大约13秒。更重要的是它内置了时钟数字调谐功能允许我们通过软件对时钟频率进行微调进一步校准因晶体个体差异、温度、老化等因素带来的偏差这是很多低成本RTC不具备的能力。2. 芯片功能深度拆解不止于“走时”很多开发者对RTC的理解还停留在“提供一个年月日时分秒”的层面但S-35390A的功能远不止于此。理解它的每一个功能模块才能在设计时物尽其用避免后期因为功能不足而更换芯片的尴尬。2.1 核心计时与日历功能这是RTC的基本盘。S-35390A提供从秒到年、包括星期的完整计时和日历功能支持2000年至2099年的闰年自动修正。这里有一个容易被忽略的细节它的时间寄存器是BCD码格式。BCD码Binary-Coded Decimal用4位二进制数表示一个十进制数字0-9。例如分钟寄存器存储“59”时实际数据是0x59二进制0101 1001高4位0101代表十位的5低4位1001代表个位的9。编程时我们需要进行BCD码和十进制数之间的转换。虽然MCU通常有硬件或库函数支持但在初始化和读取时间时必须留意这个格式直接赋值十进制数会导致时间错误。注意芯片的时钟运行依赖于一个独立的32.768kHz晶体。即使主控MCU进入深度睡眠或完全断电仅保持对RTC的供电S-35390A也能依靠其内置的振荡电路和这个晶体继续精准计时。这是它作为独立“守时”单元的关键。2.2 闹钟与定时中断功能S-35390A提供两组独立的闹钟寄存器Alarm1和Alarm2。闹钟可以设置为按“星期时分秒”匹配也可以设置为每天固定的“时分秒”匹配非常灵活。当当前时间与闹钟设置时间匹配时芯片的/INT引脚会输出一个低电平中断信号可配置为脉冲或电平模式唤醒处于睡眠状态的主控MCU。这个功能是低功耗系统的核心。例如一个环境传感器可以设定每小时唤醒一次进行采样和上传数据其余时间MCU完全断电仅靠S-35390A和它的晶体维持计时。当闹钟时间到/INT引脚的电平变化可以连接到MCU的外部中断引脚从而触发MCU上电、初始化、执行任务任务完成后再次进入深度睡眠。通过合理利用闹钟中断可以将系统的平均功耗降低到微安级别。2.3 时间更新中断与频率输出除了闹钟它还有一个“时间更新中断”功能。可以配置为每秒、每分、每小时产生一次中断。这个功能常用于需要周期性执行的任务或者作为系统的一个低频时基。例如可以用它来驱动一个LED每秒闪烁一次作为系统运行指示而无需MCU软件定时。此外芯片可以从/INT引脚或一个专用的/FOUT引脚输出可编程的方波信号频率可以从1Hz到32.768kHz之间选择。这个功能可以作为其他外围芯片的时钟源或者用于测试和校准。2.4 至关重要的时钟校准功能这是S-35390A区别于廉价RTC的杀手锏。芯片内部有一个“时钟调谐寄存器”允许用户以大约0.953ppm的步进对时钟频率进行数字调整调整范围约为-189.2ppm到 204.6ppm。校准的原理是通过在固定周期内增加或跳过少量的时钟脉冲来补偿晶体的频率偏差。为什么需要这个因为即使精度标称为±5ppm的晶体在实际焊接、不同温度、不同批次下其实际频率也会在一个范围内波动。通过在生产线上或产品安装后用一个更精确的时钟源如GPS秒脉冲、网络NTP时间作为参考测量S-35390A一段时间的累积误差然后反向计算出一个校准值写入调谐寄存器可以将其长期精度提升到±2ppm甚至更高。这对于生命周期长达数年、需要维持时间同步的物联网设备至关重要。3. 硬件设计要点与避坑指南把S-35390A用起来第一步是画对原理图。别看它只有8个引脚每个引脚的处理都关系到系统能否稳定可靠地运行。3.1 电源与备份电源设计S-35390A有VDD和VBAT两个电源引脚。VDD接主电源如3.3VVBAT接备份电池如3V的纽扣电池CR2032。当VDD电压低于VBAT约0.2V时芯片会自动切换到VBAT供电保证计时不间断。这是RTC的“生命线”。关键设计点1电源去耦。必须在VDD引脚附近1cm以内放置一个0.1μF的陶瓷电容到地用于滤除高频噪声。如果主电源纹波较大建议再并联一个10μF的钽电容或电解电容。VBAT引脚同样需要一颗0.1μF的去耦电容。许多计时不准或数据丢失的问题根源就是电源噪声。关键设计点2电池选择与二极管。通常VBAT通过一个二极管如1N4148连接到备份电池正极电池负极接地。这个二极管的作用是防止主电源VDD向电池充电对于不可充电的锂锰电池CR2032充电是危险的。二极管会产生约0.6V的压降所以需要确保电池电压减去压降后仍在芯片的工作电压范围内通常为1.6V至5.5V。使用可充电电池或超级电容时电路设计会有所不同。关键设计点3上电复位与初始值。芯片内部有上电复位电路但首次上电或VDD从0V上升时其内部寄存器状态是不确定的。因此在MCU程序初始化时必须先读取一个状态寄存器如控制状态寄存器2判断芯片是否经历了电源失效如果是则需要重新初始化时间日期。不能假设芯片里存着正确的时间。3.2 晶体电路设计精度与稳定的基石S-35390A需要外接一个32.768kHz的晶体。其振荡电路设计是影响精度和起振可靠性的核心。晶体选型必须选择负载电容为12.5pF的晶体这是芯片内部电路的匹配值。常见的规格是“32.768kHz12.5pF±20ppm”。虽然芯片可校准但为了获得最佳起点应尽量选择精度高、质量好的品牌晶体。负载电容计算与布局芯片的X1和X2引脚连接晶体。通常需要在两个引脚到地之间各接一个负载电容C_L1和C_L2。其总值应匹配晶体要求的负载电容CL。公式为CL (C_L1 * C_L2) / (C_L1 C_L2) C_stray。其中C_stray是PCB走线带来的寄生电容通常估计为2-5pF。假设晶体CL12.5pFC_stray估算为3pF则所需的外接电容总和应为 (12.5 - 3) 9.5pF。因此通常选择两个相同的电容C_L1 C_L2 2 * 9.5 19pF。实际常用18pF或22pF的NPO陶瓷电容。布局上晶体和这两个电容必须尽可能靠近芯片的X1/X2引脚走线短而粗并用地线包围进行屏蔽远离数字信号线、电源线等噪声源。踩坑实录不起振或停振。这是最常见的问题。现象是芯片无法读写或时间不走。排查步骤1. 用示波器探头请使用10X档位以减小探头电容影响测量X1或X2引脚看是否有32.768kHz的正弦波幅度很小约200-500mV。2. 如果没波形检查晶体是否焊好、电容值是否正确、布局是否太远。3. 尝试更换一个晶体。有时晶体本身损坏或参数不匹配会导致不起振。4. 确保电源电压稳定噪声小。3.3 I2C总线与中断引脚处理S-35390A通过I2C总线与MCU通信。SCL和SDA需要上拉电阻阻值根据总线速度和布线长度选择通常在4.7kΩ到10kΩ之间。对于长线或高速模式可能需要更小的上拉电阻。/INT中断输出引脚是开漏输出必须外接一个上拉电阻如10kΩ到MCU的IO口电源。当闹钟或定时器触发时该引脚被芯片内部拉低从而向MCU申请中断。MCU端需要将该引脚配置为外部中断输入模式并设置好边沿触发通常为下降沿。处理完中断后需要通过I2C读取芯片的状态寄存器来清除中断标志否则/INT引脚会一直保持低电平。4. 软件驱动开发与实战代码解析硬件搭好了接下来就是让MCU和它对话。我们将基于通用的I2C驱动构建一个稳健的S-35390A软件层。4.1 寄存器映射与关键定义首先我们需要定义芯片的I2C从地址和核心寄存器地址。S-35390A的7位I2C从地址是固定的0x32二进制0110010。读写位由I2C协议控制。以下是主要寄存器地址的宏定义基于数据手册#define S35390A_I2C_ADDR 0x32 // 时间日期寄存器 (BCD格式) #define S35390A_REG_SEC 0x00 #define S35390A_REG_MIN 0x01 #define S35390A_REG_HOUR 0x02 #define S35390A_REG_WDAY 0x03 #define S35390A_REG_DAY 0x04 #define S35390A_REG_MONTH 0x05 #define S35390A_REG_YEAR 0x06 // 闹钟1寄存器 #define S35390A_REG_AL1_MIN 0x07 #define S35390A_REG_AL1_HOUR 0x08 #define S35390A_REG_AL1_WDAY 0x09 // 闹钟2寄存器 #define S35390A_REG_AL2_MIN 0x0A #define S35390A_REG_AL2_HOUR 0x0B #define S35390A_REG_AL2_WDAY 0x0C // 控制/状态寄存器 #define S35390A_REG_CTRL1 0x0F #define S35390A_REG_CTRL2 0x10 #define S35390A_REG_CTRL3 0x11 // 时钟调谐寄存器 #define S35390A_REG_OFFSET 0x12 // 状态标志位定义 (CTRL2寄存器) #define S35390A_FLAG_POC (1 0) // 电源掉电检测标志 #define S35390A_FLAG_BLD (1 1) // 电池低电压检测标志 #define S35390A_FLAG_INT1 (1 2) // 闹钟1中断标志 #define S35390A_FLAG_INT2 (1 3) // 闹钟2中断标志 #define S35390A_FLAG_24H (1 5) // 24小时制设置位4.2 BCD码与十进制转换工具函数由于所有时间数据都是BCD码编写两个工具函数是必须的。/** * brief 十进制数转BCD码 * param dec 十进制数 (0-99) * return BCD码 */ static uint8_t dec_to_bcd(uint8_t dec) { return ((dec / 10) 4) | (dec % 10); } /** * brief BCD码转十进制数 * param bcd BCD码 * return 十进制数 */ static uint8_t bcd_to_dec(uint8_t bcd) { return ((bcd 4) * 10) (bcd 0x0F); }4.3 初始化与状态检测流程上电后不能直接读写时间。必须先进行初始化检测。/** * brief 初始化S-35390A检测并处理电源失效情况 * param hdev: I2C设备句柄 * return 0:成功 -1:通信失败 -2:需要重新设置时间发生了电源失效 */ int s35390a_init(void *hdev) { uint8_t ctrl2_reg 0; int ret; // 1. 读取控制状态寄存器2 ret i2c_read_reg(hdev, S35390A_I2C_ADDR, S35390A_REG_CTRL2, ctrl2_reg, 1); if (ret ! 0) { printf(S35390A I2C通信失败\r\n); return -1; } // 2. 检查电源掉电标志(POC) if (ctrl2_reg S35390A_FLAG_POC) { printf(S35390A检测到电源失效时间可能已丢失。\r\n); // 清除POC标志通过写入0 uint8_t clear_poc ctrl2_reg (~S35390A_FLAG_POC); i2c_write_reg(hdev, S35390A_I2C_ADDR, S35390A_REG_CTRL2, clear_poc, 1); // 返回需要重新设置时间的代码 return -2; } // 3. 可选配置为24小时制 uint8_t ctrl1_reg; i2c_read_reg(hdev, S35390A_I2C_ADDR, S35390A_REG_CTRL1, ctrl1_reg, 1); ctrl1_reg | S35390A_FLAG_24H; // 设置24小时模式 i2c_write_reg(hdev, S35390A_I2C_ADDR, S35390A_REG_CTRL1, ctrl1_reg, 1); printf(S35390A初始化成功。\r\n); return 0; }这个初始化函数是关键。它首先尝试与芯片通信确保硬件连接正常。然后读取状态寄存器检查POC标志。如果这个标志被置位说明芯片经历了从VDD到VBAT的切换即主电源完全断电后又上电此时芯片内部的时间可能是随机的垃圾值。程序必须捕获这个状态并提示上层应用或自动从备份存储如Flash中恢复时间或者要求用户重新校时。忽略这个检查是产品中时间错乱的常见原因。4.4 时间设置与读取函数设置和读取时间需要处理BCD码转换和多个寄存器的连续读写。typedef struct { uint8_t year; // 0-99 (对应2000-2099) uint8_t month; // 1-12 uint8_t day; // 1-31 uint8_t week; // 0-6 (通常0周日,1周一...) uint8_t hour; // 0-23 uint8_t minute; // 0-59 uint8_t second; // 0-59 } rtc_time_t; /** * brief 设置RTC时间 */ int s35390a_set_time(void *hdev, rtc_time_t *time) { uint8_t data[7]; // 注意写入时间寄存器时需要确保芯片不在“时钟更新”期间。 // 简单做法先读一下秒寄存器如果最高位时钟暂停标志为0则可写入。 // 更稳健的做法是等待两次读取的秒数相同。 uint8_t sec_reg; do { i2c_read_reg(hdev, S35390A_I2C_ADDR, S35390A_REG_SEC, sec_reg, 1); } while (sec_reg 0x80); // 等待非更新周期 data[0] dec_to_bcd(time-second); data[1] dec_to_bcd(time-minute); data[2] dec_to_bcd(time-hour); data[3] dec_to_bcd(time-week); data[4] dec_to_bcd(time-day); data[5] dec_to_bcd(time-month); data[6] dec_to_bcd(time-year); return i2c_write_reg(hdev, S35390A_I2C_ADDR, S35390A_REG_SEC, data, 7); } /** * brief 读取RTC时间 */ int s35390a_get_time(void *hdev, rtc_time_t *time) { uint8_t data[7]; int ret; // 连续读取7个时间寄存器 ret i2c_read_reg(hdev, S35390A_I2C_ADDR, S35390A_REG_SEC, data, 7); if (ret ! 0) return ret; // 转换BCD码并填充结构体 time-second bcd_to_dec(data[0] 0x7F); // 屏蔽最高位时钟暂停位 time-minute bcd_to_dec(data[1] 0x7F); // 屏蔽未使用位 time-hour bcd_to_dec(data[2] 0x3F); // 屏蔽24/12小时制和未使用位 time-week bcd_to_dec(data[3] 0x07); // 星期只有低3位有效 time-day bcd_to_dec(data[4] 0x3F); time-month bcd_to_dec(data[5] 0x1F); time-year bcd_to_dec(data[6]); return 0; }在set_time函数中有一个重要的细节时钟更新周期。芯片在每秒的末尾会有一个极短的时间小于1秒用于更新所有时间寄存器。在此期间读取时间可能会得到不一致的数据比如秒是59分却是下一个分钟。为了避免这个问题标准的做法是连续读取两次时间直到两次读取的秒数相同确保读取发生在非更新周期。上面的设置函数里我们通过检查秒寄存器的最高位第7位来判断该位为0表示时钟正常运行且不在更新周期。这是一种简化的方法。4.5 闹钟设置与中断处理实战闹钟功能是实现定时唤醒的关键。我们以设置一个每天08:30:00的闹钟为例。/** * brief 设置闹钟1每天固定时间触发 * param hour: 小时 (0-23) * param min: 分钟 (0-59) * param sec: 秒 (0-59), 如果不需要秒匹配可设为0xFF */ int s35390a_set_alarm1_daily(void *hdev, uint8_t hour, uint8_t min, uint8_t sec) { uint8_t data[3]; // 设置寄存器值注意最高位是“忽略”位设为1则忽略该字段的匹配 data[0] (sec 0xFF) ? 0x80 : dec_to_bcd(sec); // AL1_SEC data[1] (min 0xFF) ? 0x80 : dec_to_bcd(min); // AL1_MIN data[2] (hour 0xFF) ? 0x80 : dec_to_bcd(hour); // AL1_HOUR // 星期寄存器设置为0x80表示忽略星期匹配即每天触发 uint8_t week_ignore 0x80; int ret i2c_write_reg(hdev, S35390A_I2C_ADDR, S35390A_REG_AL1_MIN, data, 3); if (ret 0) { ret i2c_write_reg(hdev, S35390A_I2C_ADDR, S35390A_REG_AL1_WDAY, week_ignore, 1); } if (ret 0) { // 使能闹钟1中断 uint8_t ctrl2_reg; i2c_read_reg(hdev, S35390A_I2C_ADDR, S35390A_REG_CTRL2, ctrl2_reg, 1); ctrl2_reg | (1 0); // 设置AL1_INT_EN位 (具体位需查手册此处为示例) i2c_write_reg(hdev, S35390A_I2C_ADDR, S35390A_REG_CTRL2, ctrl2_reg, 1); } return ret; }设置好闹钟后当时间匹配时/INT引脚会变低。MCU端的中断服务函数应该这样处理// 假设/INT引脚连接到MCU的GPIO_PIN_0 void EXTI0_IRQHandler(void) { if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) ! RESET) { // 1. 清除MCU端的中断标志 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); // 2. 读取S-35390A的状态寄存器判断中断源并清除标志 uint8_t status_reg; i2c_read_reg(hi2c1, S35390A_I2C_ADDR, S35390A_REG_CTRL2, status_reg, 1); if (status_reg S35390A_FLAG_INT1) { printf(闹钟1触发\r\n); // 执行唤醒后的任务例如采集传感器数据并上传 do_wakeup_task(); // 清除芯片内的闹钟1中断标志通过写0清除 status_reg ~S35390A_FLAG_INT1; i2c_write_reg(hi2c1, S35390A_I2C_ADDR, S35390A_REG_CTRL2, status_reg, 1); } // 可以继续检查其他中断源如闹钟2(INT2) } }这里有一个至关重要的步骤必须在中断服务程序里读取芯片的状态寄存器来清除中断标志。如果只清除了MCU的GPIO中断标志而没有清除S-35390A内部的标志位那么/INT引脚会一直保持低电平导致MCU无法再次进入睡眠或者产生连续的中断。5. 高级应用时钟校准与长期精度保障对于追求极致精度的应用软件校准是必不可少的一环。校准的目标是测量出芯片在当前环境下的实际日误差并通过写“时钟调谐寄存器”进行补偿。5.1 校准原理与计算S-35390A的时钟调谐寄存器Offset Register是一个8位有符号整数二进制补码形式。其值N与频率调整量Δf/f的关系由公式决定Δf/f - (N / 2^20) ≈ -N * 0.9537 ppm。N为正时减慢时钟N为负时加快时钟。校准步骤获取参考时间源需要一个极其精确的时间源作为参考。可以是GPS模块的1PPS每秒脉冲信号、通过NTP同步的计算机网络时间、或者高精度的恒温晶振。测量误差让S-35390A和参考时间源同时运行一段较长的时间T例如24小时或7天。记录起始时刻两个时间的差值Δt_start和结束时刻的差值Δt_end。计算误差率累计误差 Δerror Δt_end - Δt_start。误差率 Δerror / T。计算调谐值NN - (误差率 * 2^20)。例如如果测量24小时86400秒快了10秒则误差率 10 / 86400 ≈ 115.74 ppm。N -115.74 * 1048576 ≈ -121,300。由于N是8位有符号数范围是-128到127对应的调整范围约为±122ppm。如果计算出的N超出此范围说明晶体偏差太大可能需要更换晶体。写入寄存器将计算出的N值转换为二进制补码格式写入0x12寄存器。5.2 实战校准流程示例假设我们通过串口从已联网的电脑获取精确的UTC时间作为参考。// 简化版的校准函数需在实际项目中完善错误处理 int s35390a_calibrate(void *hdev, int measured_error_seconds, int measurement_period_seconds) { // 1. 计算误差率 (ppm) // ppm (误差秒数 / 测量总秒数) * 1,000,000 float error_ppm ((float)measured_error_seconds / (float)measurement_period_seconds) * 1e6; // 2. 计算调谐寄存器值 N // N -error_ppm * (2^20 / 1e6) -error_ppm * 1.048576 float n_float -error_ppm * 1.048576f; int8_t n (int8_t)(n_float 0.5f); // 四舍五入到最近的整数 // 3. 检查N是否在有效范围内(-128 ~ 127) if (n -128 || n 127) { printf(误差过大(%.2f ppm)超出芯片校准范围(±122 ppm)。请检查晶体或测量。\r\n, error_ppm); return -1; } // 4. 将N转换为二进制补码形式的uint8_t uint8_t offset_reg_value (uint8_t)n; // 5. 写入时钟调谐寄存器 (地址0x12) int ret i2c_write_reg(hdev, S35390A_I2C_ADDR, S35390A_REG_OFFSET, offset_reg_value, 1); if (ret 0) { printf(校准完成。写入Offset寄存器值: 0x%02X (十进制 %d)\r\n, offset_reg_value, n); printf(预期调整量: %.2f ppm\r\n, -n / 1.048576f); } return ret; }在实际操作中这个校准过程可以集成到产品的生产测试工装中实现自动化校准。也可以在产品部署后通过远程指令如果设备有联网能力触发自校准流程以补偿晶体老化带来的长期漂移。6. 低功耗系统设计整合与实测心得将S-35390A融入一个超低功耗的电池供电系统是它的典型应用场景。这里分享一个整合方案和实测中的关键点。系统架构MCU选用支持深度睡眠模式且唤醒源丰富的型号如STM32L系列、ESP32仅运行RTC协处理器时。电源主电源为3.3V LDO备份电源为CR2032纽扣电池。S-35390AVDD接3.3VVBAT通过1N4148二极管接CR2032。I2C上拉电阻接3.3V。/INT引脚接MCU的外部中断引脚配置为下降沿触发。传感器采用同样支持低功耗模式的数字传感器通过MCU的GPIO控制其电源开关。工作流程系统上电或复位后MCU初始化读取S-35390A时间检查是否需要从Flash恢复时间。MCU通过S-35390A设置一个唤醒闹钟例如1小时后。MCU关闭传感器电源将自身所有外设关闭进入“停机”或“待机”模式Stop/Standby Mode。此时MCU核心时钟停止仅保留少量寄存器和SRAM内容功耗可低至1μA以下。S-35390A依靠备份电池或主电源以约0.5μA的电流典型值持续运行计时。1小时后闹钟时间到S-35390A的/INT引脚输出下降沿。这个下降沿触发MCU的外部中断MCU从深度睡眠中唤醒。MCU重新初始化系统时钟和必要外设读取当前时间打开传感器电源采集数据处理数据并通过LoRa/NB-IoT等模块上传。任务完成后MCU再次设置下一个闹钟并进入深度睡眠。循环往复。实测心得与避坑点中断引脚配置务必确保MCU端将连接/INT的GPIO配置为外部中断模式并设置为下降沿触发。同时该引脚内部需要使能上拉或者外部接一个上拉电阻强烈建议外部上拉如10kΩ。在MCU进入深度睡眠前必须确认该中断配置是有效的并且不会被其他设置意外关闭。I2C总线状态在MCU进入深度睡眠前最好将I2C外设置于复位或禁用状态并将SDA和SCL引脚设置为高阻输入或模拟输入模式以避免从这些引脚漏电。唤醒后需要重新初始化I2C。功耗测量使用高精度的电流表如Keysight的精密源表或专门的功耗分析仪测量整个系统的睡眠电流。要区分“MCU单独睡眠”、“S-35390A单独供电”和“系统整体睡眠”的电流。实测中我曾因为一个未使用的GPIO引脚配置为推挽输出低电平而外部电路该引脚通过电阻上拉到了VCC导致产生了数百微安的漏电流使电池续航远低于预期。电池寿命估算假设CR2032电池容量为220mAhS-35390A在备份模式下的典型电流为0.5μA则理论续航时间为 220mAh / 0.0005mA 440,000 小时约50年。这看起来很长但必须考虑电池的自放电每年约1%、MCU深度睡眠的漏电流可能1-2μA、以及电路板上其他元件的漏电流。实际设计中整个系统的静态功耗应控制在5μA以内才能实现数年的电池寿命。时间保持验证进行长时间老化测试。将设备断电仅靠电池放置一周或一个月然后上电读取时间与标准时间对比。这是验证电源切换电路、电池连接、芯片是否正常工作的最终手段。
返回列表