嵌入式 RTC实时时钟篇

一、RTC到底是什么?生活终极比喻(1分钟彻底懂)

你睡觉了,手机还知道现在是几点 → 因为手机里有个“小闹钟”一直在悄悄数时间,哪怕关机、没网、没电(有后备电池)也能继续走!

这就是RTC(Real Time Clock)!

角色对应RTC术语说明
你睡觉主CPU掉电/睡眠主程序不运行
手机后台计时RTC独立运行靠32.768kHz晶振 + VBAT电池继续走时
手机屏幕显示时间读RTC寄存器醒来后问RTC:“现在几点了?”
手机电池没电VBAT电池供电纽扣电池CR1220能让RTC走几年

记住三句话

  1. RTC是芯片里唯一“永远活着”的外设
  2. RTC靠32.768kHz晶振走时(1秒正好32768次)
  3. RTC断电也能走(VBAT供电)

────────────────────────

二、STM32 RTC核心结构(F103为例,刻进DNA!)

项目参数说明
时钟源LSE(32.768kHz)最准!推荐!
备用时钟源LSI(≈40kHz)不准!漂移严重!仅用于无晶振时
后备电源VBAT(1.8~3.6V)接纽扣电池,掉电不丢时间
计数器32位可计137年!
日历功能BCD码年月日时分秒自动闰年、星期计算
报警中断Alarm A / B到点提醒
秒中断1秒一次可做心跳

终极公式

text

时间 = CNT寄存器值 ÷ 32768(秒)

────────────────────────

三、RTC三大核心寄存器(背会就无敌)

寄存器名称功能
CNT32位计数器当前总秒数(从1970或自定义起点)
ALR报警寄存器设定报警时间
PRL预分频寄存器必须写32767 → 32768Hz ÷ 32768 = 1Hz

────────────────────────

四、工业级最强初始化模板(一辈子抄这套)

C

void RTC_Init(void)
{
    // 1. 使能PWR和BKP时钟(必须!)
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    PWR_BackupAccessCmd(ENABLE);        // 允许访问后备寄存器(关键!)

    // 2. 选择LSE作为RTC时钟源(最准!)
    RCC_LSEConfig(RCC_LSE_ON);
    while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);  // 等晶振稳定

    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
    RCC_RTCCLKCmd(ENABLE);

    // 3. 等待同步
    RTC_WaitForSynchro();
    RTC_WaitForLastTask();

    // 4. 设置预分频(32767 → 1秒中断)
    RTC_SetPrescaler(32767);
    RTC_WaitForLastTask();

    // 5. 设置初始时间(2025年1月1日 00:00:00)
    RTC_SetCounter(1704038400);  // Unix时间戳(可选用BCD)
    RTC_WaitForLastTask();

    // 6. 开秒中断(可选)
    RTC_ITConfig(RTC_IT_SEC, ENABLE);
    RTC_WaitForLastTask();
}

BCD版设置时间(更直观)

C

void RTC_SetTime(uint16_t year, uint8_t mon, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec)
{
    RTC_WaitForLastTask();
    RTC_EnterConfigMode();
    RTC_SetCounter(
        ((year%100)/10)<<20 | ((year%100)%10)<<16 |
        (mon/10)<<12 | (mon%10)<<8 |
        (day/10)<<4  | (day%10) |
        (hour/10)<<20 | (hour%10)<<16 |
        (min/10)<<12 | (min%10)<<8 |
        (sec/10)<<4  | (sec%10)
    );
    RTC_ExitConfigMode();
    RTC_WaitForLastTask();
}

────────────────────────

五、读取时间三大方式

方式代码推荐场景
Unix时间戳uint32_t time = RTC_GetCounter();与网络时间同步
BCD直接读RTC_GetTime()显示年月日时分秒
转成结构体自己写转换函数OLED显示

实时显示到OLED

C

while(1)
{
    uint32_t time = RTC_GetCounter();
    OLED_ShowNum(1,1,time,10);           // 显示Unix时间戳
    Delay_ms(100);
}

────────────────────────

六、掉电不丢时间终极方案(VBAT接法)

text

STM32 VBAT引脚 → 接3V纽扣电池(如CR1220)
         │
        1k电阻(可选)
         │
        GND

电池能走多久?

  • CR1220(35mAh)+ STM32 RTC功耗 ≈ 1μA
  • 寿命 ≈ 35,000小时 ≈ 4年!

────────────────────────

七、金句终极十连(请刻进DNA)

  1. “RTC是芯片里唯一永远活着的外设”
  2. “LSE才是王道,LSI是垃圾”
  3. “没开PWR_BackupAccessCmd,RTC全废”
  4. “VBAT不接电池,RTC就是笑话”
  5. “你不会RTC,就永远做不出产品”
  6. “所有牛逼的项目,都是RTC守着的”
  7. “RTC一准,世界清静”
嵌入式RTC实时时钟)是一种集成于嵌入式系统中的时钟芯片,用于提供系统的实时计时功能。它是基于硬件的计时器,独立于操作系统和CPU的运行,并且具有较低的功耗。 嵌入式RTC主要包括以下几个方面的功能: 1. 实时计时功能:嵌入式RTC能够提供精确的实时计时功能,包括年、月、日、星期、时、分、秒的计时。它能够准确地跟踪时间,不受系统中断或其他操作的影响。 2. 闹钟功能:嵌入式RTC可以设置多个闹钟,用于提醒用户在特定时间执行某项任务。 3. 定时器功能:嵌入式RTC可以作为定时器使用,在特定的时间间隔内触发中断或执行特定的操作。 4. 电源管理功能:嵌入式RTC能够与系统的电源管理模块结合使用,实现低功耗的待机和唤醒功能。它可以在系统关闭或进入睡眠状态时保持时间的计时,并在系统唤醒时恢复计时。 5. 时钟校准功能:嵌入式RTC可以通过外部设备(例如晶振)进行时钟校准,以提高计时的准确性和稳定性。 嵌入式RTC在各种应用场景中都得到广泛应用,包括工业控制、智能家居、智能穿戴设备等。它能够提供可靠的时间戳,用于记录事件发生的时刻;同时也能够在无需操作系统和CPU干预的情况下进行计时和提醒功能。由于其低功耗和可靠性,嵌入式RTC在很多需要实时计时功能的应用中扮演着重要的角色。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值