【ESP32 IDF】RTC时钟

举报
人才程序员 发表于 2024/03/31 16:48:54 2024/03/31
【摘要】 @TOC 前言在嵌入式系统开发中,时间的准确性往往是至关重要的。对于某些应用程序,例如实时调度、数据记录和事件触发,使用RTC(Real-Time Clock,实时时钟)成为必要。ESP32是一款功能强大的嵌入式开发板,它提供了一个内置的RTC模块,使我们能够轻松地在应用程序中使用准确的实时时钟。本文将介绍如何在ESP32 IDF(IoT Development Framework,物联网开...

@TOC


前言

在嵌入式系统开发中,时间的准确性往往是至关重要的。对于某些应用程序,例如实时调度、数据记录和事件触发,使用RTC(Real-Time Clock,实时时钟)成为必要。ESP32是一款功能强大的嵌入式开发板,它提供了一个内置的RTC模块,使我们能够轻松地在应用程序中使用准确的实时时钟。

本文将介绍如何在ESP32 IDF(IoT Development Framework,物联网开发框架)中利用RTC模块实现一个可靠的时钟功能。我们将探讨如何初始化RTC时钟以及如何获取和设置时间。此外,我们还将了解如何使用RTC时钟来实现常见的应用,例如定时器和闹钟。


一、RTC时钟的介绍

1.1 RTC时钟的作用

RTC(Real-Time Clock),即实时时钟,是一种专门用于保持和跟踪时间的设备或模块。它具有独立于计算机或处理器的能力,可以在断电或系统关闭的情况下继续保持准确的时间。RTC时钟通常由一个晶体振荡器和倒计时计数器组成,以提供准确的时间基准。

RTC时钟在嵌入式系统和其他需要时间相关操作的应用中扮演着重要的角色。它提供了一些基本的功能,包括:

时间跟踪:RTC时钟可以保持准确的时间,并且不受断电或系统关闭的影响。它可以提供年、月、日、小时、分钟和秒等时间的信息。

时间戳:RTC时钟可以为事件提供准确的时间戳。这在日志记录、传感器数据收集、数据同步等应用中非常有用。

定时操作:RTC时钟可以设置闹钟或定时器,用于触发特定事件或执行预定的任务。这在闹钟应用、定时器应用、周期性任务等场景中非常常见。

日历计算:一些RTC时钟模块提供了根据当前时间计算日期、星期、月相等更复杂的日历功能。

RTC时钟通常可以通过I2C、SPI或串口等接口与主控器或处理器连接。在某些嵌入式平台上,如ESP32或Arduino,可以通过使用预设的库或驱动程序来轻松集成RTC时钟功能。

总的来说,RTC时钟是一种专门用于保持和跟踪时间的设备或模块。它提供了时间跟踪、时间戳、定时操作和日历计算等功能,为各种嵌入式系统和时间相关应用提供准确的时间基准。

在ESP32 IDF中,他自带的RTC是软件RTC

二、RTC的使用

2.1 获取RTC时间

在IDF中,我们可以直接使用localtime函数(他的参数需要自(1970.1.1 00:00:00 UTC)经过的时间(秒))
来获取一个struct tm *的结构体指针,这个结构体定义如下:

struct tm
{ /* A structure for storing the attributes of a broken-down time; (once
   * again, it isn't defined elsewhere, so no guard is necessary).  Note
   * that we are within the scope of <time.h> itself, so we must provide
   * the complete structure declaration here.
   */
  int  tm_sec;  	/* Seconds: 0-60 (to accommodate leap seconds) */
  int  tm_min;  	/* Minutes: 0-59 */
  int  tm_hour; 	/* Hours since midnight: 0-23 */
  int  tm_mday; 	/* Day of the month: 1-31 */
  int  tm_mon;  	/* Months *since* January: 0-11 */
  int  tm_year; 	/* Years since 1900 */
  int  tm_wday; 	/* Days since Sunday (0-6) */
  int  tm_yday; 	/* Days since Jan. 1: 0-365 */
  int  tm_isdst;	/* +1=Daylight Savings Time, 0=No DST, -1=unknown */
};

我们可以使用time_t time (time_t *__v)函数获得自(1970.1.1 00:00:00 UTC)经过的时间(秒))
但是他并没有第几周,我们可以使用下面这个函数进行转换:

uint8_t rtc_get_week(uint16_t year, uint8_t month, uint8_t day)
{
    uint8_t week = 0;

    if (month < 3)
    {
        month += 12;
        --year;
    }

    week = (day + 1 + 2 * month + 3 * (month + 1) / 5 + year + (year >> 2) - year / 100 + year / 400) % 7;
    return week;
}

2.2 设置RTC时间

我们可以使用下面这个函数设置RTC时间:

int settimeofday(const struct timeval *tv, const struct timezone *tz);

他的参数1需要struct timeval类型,需要设置里面成员tv_sec为1970.1.1以来的总秒数、tv_usec设置为0,参数2填NULL即可
我们可以使用:mktime函数来通过struct tm得到1970.1.1以来的总秒数

我们可以写出这样的一个函数:

void rtc_set_time(int year,int mon,int mday,int hour,int min,int sec)
{
    struct tm datetime;
    /* 设置时间 */
    datetime.tm_year = year - 1900;
    datetime.tm_mon = mon - 1;
    datetime.tm_mday = mday;
    datetime.tm_hour = hour;
    datetime.tm_min = min;
    datetime.tm_sec = sec;
    datetime.tm_isdst = -1;
    /* 获取1970.1.1以来的总秒数 */
    time_t second = mktime(&datetime);
    struct timeval val = { .tv_sec = second, .tv_usec = 0 };
    /* 设置当前时间 */
    settimeofday(&val, NULL);
}

总结

RTC时钟在嵌入式系统中具有重要的作用,可以提供准确的实时时间。本文简要介绍了在ESP32 IDF中使用RTC时钟的方法。我们探讨了如何初始化RTC时钟,以及如何获取和设置时间。此外,我们还了解了如何利用RTC时钟实现常见的应用功能,如定时器和闹钟。

通过使用ESP32的内置RTC模块,开发者可以轻松地集成可靠的时钟功能到他们的应用程序中。这对于需要准确时间的项目,如实时调度系统或数据记录应用程序来说尤为重要。

希望本文对于想要在ESP32开发中利用RTC时钟的开发者们有所帮助。使用RTC时钟,你可以确保你的应用程序与准确的实时时钟保持同步,提供更可靠、精确的时间相关功能。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。