登录/注册

STM32 锂电池 RTC

STM32 锂电池 RTC

更多

好的,我们来详细聊聊 STM32 微控制器中 RTC(实时时钟) 使用 锂电池(通常是 CR2032 纽扣电池) 作为后备电源的关键知识。

核心目的: 在主电源(VDD)断开时,由锂电池通过 VBAT 引脚为 RTC 模块以及备份寄存器供电,确保 RTC 持续计时,并且备份寄存器中的数据不会丢失。

关键组成部分与工作原理

  1. VBAT 引脚:

    • 这是 STM32 芯片上专门用于连接后备电池的引脚。
    • 当主电源 VDD 存在时,芯片内部逻辑会自动将 RTC 和备份域的电源切换到 VDD。
    • 当 VDD 掉电或低于某个阈值时,芯片会自动无缝切换到 VBAT 引脚提供的电源,维持 RTC 和备份寄存器的运行和数据。
  2. 锂电池(CR2032):

    • 电压: 标称电压 3.0V,满电时约 3.3V,放电截止电压通常为 2.0V。
    • 容量: 典型容量 200-240mAh,能提供长时间(数月甚至数年)的低功耗后备供电。
    • 选择依据: STM32 的 VBAT 引脚工作电压范围通常是 1.65V 到 3.6V。CR2032 的电压范围完全符合要求,且其自放电率低,非常适合做后备电源。
  3. RTC 模块:

    • 一个独立的计时器,使用 32.768kHz 的低速外部晶振作为时钟源(精度高,功耗低)。
    • 即使在低功耗模式下(如 Stop, Standby),只要 VBAT 有电,RTC 就能持续运行。
    • 提供日历(年、月、日、星期、时、分、秒)和闹钟功能。
  4. 备份寄存器:

    • 一小块特殊的 SRAM 区域(通常 20 个 16 位寄存器)。
    • 与 RTC 共享 VBAT 电源域。当 VBAT 供电时,这些寄存器内容不会丢失。
    • 常用于存储需要在系统复位或掉电重启后保留的关键数据(如配置参数、状态标志、校准值等)。

硬件设计要点

  1. 连接方式 (最常见和推荐):

    +3V (主电源) -----|>|-----.-----> VDD (STM32)
                肖特基二极管  |
                            |
    VBAT (STM32) <----------+-----> 锂电池+ (CR2032+)
                            |
    GND (STM32) <-----------+-----> 锂电池- (CR2032-) & GND
    • 二极管: 使用肖特基二极管(如 1N5817, BAT54S),因其正向压降非常低(约 0.3V)。这能确保锂电池电压尽可能多地供给 VBAT,延长电池寿命。普通硅二极管压降(0.6-0.7V)过大,可能导致锂电池电压低于 VBAT 最低要求时过早失效。
    • 作用:
      • 当主电源存在时,二极管导通,主电源通过二极管给 VBAT 域供电,同时阻止主电源电流流向锂电池,避免不必要的电池消耗。
      • 当主电源掉电时,二极管截止,锂电池无缝接管 VBAT 域的供电。
    • 注意: 如果主电源是 3.3V,经过肖特基二极管后约为 3.0V,仍在 VBAT 工作范围内。绝对不要将高于 3.6V 的电源(如 5V)直接或通过普通二极管连接到 VBAT,会损坏芯片! 如果主电源是 5V,必须使用电阻分压或 LDO 降压到 3.3V 后再接二极管。
  2. **可选:超级电容

    • 对于需要频繁充放电或对成本敏感的应用,可以用小容量超级电容(如 0.1F-1F)代替锂电池。
    • 优点:可充电,寿命长(充放电次数多)。
    • 缺点:自放电率比锂电池高,需要额外的充电管理电路(限流电阻),断电保持时间相对较短(几小时到几天)。
    • 连接方式类似,但通常需要在 VBAT 和 GND 之间并联一个电阻(如 100K-1MΩ)为超级电容提供放电路径,防止其电压过高。
  3. 旁路电容:

    • VBAT 引脚靠近芯片处放置一个 100nF 的陶瓷电容到 GND,用于电源滤波,提高稳定性。
  4. 外部低速晶振:

    • RTC 需要精确计时,强烈推荐使用外部 32.768kHz 晶振(Xtal)和两个负载电容(通常 6-12pF,具体值参考晶振规格书和 STM32 数据手册)。内部低速 RC 振荡器精度差,不适合做实时时钟。

软件配置要点 (以 HAL 库为例)

  1. 启用时钟和访问备份域:

    // 1. 使能 PWR 时钟
    __HAL_RCC_PWR_CLK_ENABLE();
    // 2. 使能对备份域的访问 (解除备份域写保护)
    HAL_PWR_EnableBkUpAccess();
    • 这是操作 RTC 和备份寄存器的前提!必须在任何 RTC 初始化或备份寄存器读写之前执行。
  2. 初始化 RTC:

    RTC_HandleTypeDef hrtc;
    hrtc.Instance = RTC; // RTC 实例
    hrtc.Init.HourFormat = RTC_HOURFORMAT_24; // 24小时制
    hrtc.Init.AsynchPrediv = 0x7F;   // 异步分频值 (127)
    hrtc.Init.SynchPrediv = 0xFF;    // 同步分频值 (255)
    hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; // 输出禁用
    hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    // 初始化 RTC
    if (HAL_RTC_Init(&hrtc) != HAL_OK) {
        // 初始化错误处理
    }
    • AsynchPredivSynchPrediv 用于将 32.768kHz 时钟分频得到 1Hz 的秒信号。计算:(AsynchPrediv + 1) * (SynchPrediv + 1) = 32768。示例 (127+1)*(255+1)=128*256=32768
  3. 配置 RTC 时钟源:

    • 通常在 HAL_RTC_MspInit 函数中实现:
      void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) {
      if(hrtc->Instance == RTC) {
          // 1. 使能 LSE 时钟 (32.768kHz 晶振)
          __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); // 选择 LSE 作为 RTC 时钟源
          __HAL_RCC_LSE_CONFIG(RCC_LSE_ON); // 开启 LSE
          // 等待 LSE 稳定
          while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) {}
          // 2. 使能 RTC 时钟
          __HAL_RCC_RTC_ENABLE();
      }
      }
    • 务必选择 RCC_RTCCLKSOURCE_LSE 以获得最佳精度。LSI(内部低速 RC)精度差,HSE 分频功耗高。
  4. 设置时间和日期:

    RTC_TimeTypeDef sTime = {0};
    RTC_DateTypeDef sDate = {0};
    // 设置时间 (例如 14:30:00)
    sTime.Hours = 14;
    sTime.Minutes = 30;
    sTime.Seconds = 0;
    sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
    // 设置日期 (例如 2023年10月27日, 星期五)
    sDate.WeekDay = RTC_WEEKDAY_FRIDAY;
    sDate.Month = RTC_MONTH_OCTOBER;
    sDate.Date = 27;
    sDate.Year = 23; // 2023 年的后两位
    HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
  5. 读取时间和日期:

    RTC_TimeTypeDef gTime;
    RTC_DateTypeDef gDate;
    HAL_RTC_GetTime(&hrtc, &gTime, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&hrtc, &gDate, RTC_FORMAT_BIN);
    // 使用 gTime.Hours, gTime.Minutes, gTime.Seconds, gDate.WeekDay, gDate.Month, gDate.Date, gDate.Year
  6. 使用备份寄存器:

    // 写入备份寄存器 (例如 DR1)
    HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x1234);
    // 读取备份寄存器
    uint16_t backup_value = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1);
    • 记得在操作备份寄存器前,必须已经执行了 HAL_PWR_EnableBkUpAccess()

常见问题与调试

  1. RTC 不工作/时间不准:

    • 检查硬件:
      • VBAT 锂电池电压是否正常(>2.0V)?连接是否可靠?
      • 32.768kHz 晶振是否起振?用示波器测量(注意高阻抗探头可能影响起振)。检查负载电容值是否正确焊接。
      • 二极管方向是否正确?压降是否过大?
    • 检查软件:
      • 是否在初始化 RTC 前正确执行了 __HAL_RCC_PWR_CLK_ENABLE()HAL_PWR_EnableBkUpAccess()
      • 是否成功配置并选择了 LSE` 作为时钟源?是否等待 LSE 就绪?
      • 分频系数 AsynchPredivSynchPrediv 计算是否正确?
      • 是否在主循环中定期同步/读取时间?RTC 是独立运行的,但读取操作需要软件发起。
  2. 断电后时间丢失:

    • VBAT 引脚未连接电池或电池耗尽。
    • VBAT 电路设计错误(如二极管方向反了,主电源掉电时无法切换到电池)。
    • 电池电压低于 VBAT 最低工作电压(检查电池电量,检查二极管压降是否导致有效电压过低)。
    • 硬件连接不可靠(虚焊、断线)。
  3. 备份寄存器数据丢失:

    • 原因同上(VBAT 供电问题)。
    • 在写入备份寄存器后,没有正确退出备份域访问(虽然 HAL_PWR_EnableBkUpAccess() 使能后默认一直可访问,但某些安全操作可能需要临时禁用)。
  4. 功耗过高导致电池消耗过快:

    • 检查是否有其他电路意外连接到 VBAT 域。
    • 确保在低功耗模式下(Stop/Standby),所有不必要的外设时钟都已关闭。
    • 检查 PCB 是否有漏电。

总结

在 STM32 上使用锂电池为 RTC 供电,核心在于:

  1. 正确设计 VBAT 电路: 使用肖特基二极管隔离主电源和锂电池。
  2. 选择合适电池: CR2032 是最常用且合适的选择。
  3. 使用外部 32.768kHz 晶振: 保证计时精度。
  4. 软件关键步骤: 使能 PWR 时钟 -> 使能备份域访问 -> 配置 RTC 时钟源(LSE)-> 初始化 RTC -> 设置/读取时间日期/备份寄存器。
  5. 注意调试: 重点检查 VBAT 电压、晶振起振、备份域访问使能。

遵循这些原则,就能可靠地在 STM32 应用中实现掉电保持的实时时钟功能。

锂电池单体、锂电池组和锂电池包的区别

锂电池单体、锂电池组和锂电池包的区别  锂电池是一种常见的可充电

2024-01-11 14:09:21

电容电池锂电池能互换使用吗?

电容电池与锂电池能互换使用吗?13400的一个锂电容坏了,可以用18650的锂电池

2023-03-31 11:33:59

基于STM32的多节锂电池管理系统的设计

基于STM32的多节锂电池管理系统的设计

资料下载 jinyi7016 2022-03-22 12:13:49

基于STM32单片机的锂电池充放电系统

基于STM32单片机的锂电池充放电系统

资料下载 佚名 2021-07-01 14:36:44

大佬带你探讨锂电池锂电池保护板故障解析

锂电池是生活中常用电池类型之一,对于锂电池,我们自然也是十分熟悉。为增进大家对锂电池

资料下载 贾小龙 2021-03-18 00:50:17

锂电池保护板使用方法和选购要点

锂电池在现实中具有众多应用,诸多电子设备中均存在锂电池的身影。为增进大家对锂电池的了解,本文将对

资料下载 佚名 2021-03-17 22:18:18

锂电池充电电路图如何设计三节锂电池充电管理芯片电路图解析

关于三节锂电池供电的产品,在三节锂电池上,需要三个电路系统:1,三节锂电池保护电路,2,三节

资料下载 生龙活虎3 2021-03-17 21:28:20

锂电池回收 锂电池模组回收 软包锂电池回收 圆柱锂电池回收 动力锂电池回收,回收电池

:***彭'SQQ QQ752127311回收电芯,回收库存电芯,回收聚合物电芯,回收锂电芯,回收动力电芯,三元电芯回收电池,回收动力电池,回收

2021-12-09 11:32:20

锂电池的基本知识

随着物联网的发展,单片机+锂电池,这种组合越来越普遍,单片机厂商也不断推出适合物联网的单片机。先补充一下锂电池的基本知识…锂电池在充满电的时候,

2021-11-10 06:28:09

回收锂电池 回收锂电池模组 回收软包锂电池回收 回收圆柱锂电池 回收动力锂电池回收

锂电池,回收三元动力电池,回收锂电池锂电池回收

2021-10-30 18:51:47

锂电池回收,钴动力电池模组回收,钴回收三元动力电池,回收锂电池,库存锂电池回收 库存退役锂电池回收

:***彭'SQQ QQ752127311回收电芯,回收库存电芯,回收聚合物电芯,回收锂电芯,回收动力电芯,三元电芯回收电池,回收动力电池,回收

2021-09-02 12:34:40

回收电池,回收动力电池,回收动力锂电池,回收三元动力电池,回收锂电池 锂电池回收 锂电池模组回收

我们将为贵司提供热情周到的,咨询、报价! 电话:***彭'SQQ QQ752127311回收电芯,回收库存电芯,回收聚合物电芯,回收锂电芯,回收动力电芯,三元电芯回收电池,回收动力

2021-08-31 21:43:39

回收电芯,回收库存电芯,回收电池,回收动力电池锂电池回收 锂电池模组回,收库存锂电池回收

:***彭'SQQ QQ752127311回收电芯,回收库存电芯,回收聚合物电芯,回收锂电芯,回收动力电芯,三元电芯回收电池,回收动力电池,回收

2021-08-20 11:22:09

磷酸铁锂电池是什么,锂电池和磷酸铁锂电池有何区别

锂电池是诸多电池类型之一,大家对于生活中的锂电池或多或少也均有所了解。但是,你了解磷酸铁

2020-12-25 19:34:54

7天热门专题 换一换
相关标签