RT-Thread Studio RTC使用笔记

使能RTC:
RT-Thread Studio RTC使用笔记_第1张图片
拷贝drv_rtc.cdrv_log.h;使能#define HAL_RTC_MODULE_ENABLED:RT-Thread Studio RTC使用笔记_第2张图片
修改main函数即可使用:

#include 
int main(void)
{
    struct tm *t;
    t=rt_malloc(sizeof(struct tm));
    time_t now=0;
    LOG_D("Hello RT-Thread!");
    while (1)
    {
        /* set LED0 pin level to high or low */
        now=time(RT_NULL);
        t=localtime(&now);

        rt_kprintf("%d %d %d %d %d %d\n",t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

RT-Thread Studio RTC使用笔记_第3张图片
注意,这里的时钟因为是使用struct tm格式的,其定义如下:

#ifndef _TM_DEFINED
struct tm {
int tm_sec; /* 秒 – 取值区间为[0,59] /
int tm_min; /
分 - 取值区间为[0,59] /
int tm_hour; /
时 - 取值区间为[0,23] /
int tm_mday; /
一个月中的日期 - 取值区间为[1,31] /
int tm_mon; /
月份(从一月开始,0代表一月) - 取值区间为[0,11] /
int tm_year; /
年份,其值等于实际年份减去1900 /
int tm_wday; /
星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 /
int tm_yday; /
从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 /
int tm_isdst; /
夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的时候,tm_isdst为0;不了解情况时,tm_isdst()为负。
long int tm_gmtoff; /指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数/
const char *tm_zone; /当前时区的名字(与环境变量TZ有关)/
};
#define _TM_DEFINED
#endif

所以年份应该是120+1900=2020,月份是0+1=1;再drv_rtc.c中可以看到:

static time_t get_rtc_timestamp(void)
{
    RTC_TimeTypeDef RTC_TimeStruct = {0};
    RTC_DateTypeDef RTC_DateStruct = {0};
    struct tm tm_new;

    HAL_RTC_GetTime(&RTC_Handler, &RTC_TimeStruct, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&RTC_Handler, &RTC_DateStruct, RTC_FORMAT_BIN);

    tm_new.tm_sec  = RTC_TimeStruct.Seconds;
    tm_new.tm_min  = RTC_TimeStruct.Minutes;
    tm_new.tm_hour = RTC_TimeStruct.Hours;
    tm_new.tm_mday = RTC_DateStruct.Date;
    tm_new.tm_mon  = RTC_DateStruct.Month - 1;
    tm_new.tm_year = RTC_DateStruct.Year + 100;

    LOG_D("get rtc time.");
    return mktime(&tm_new);
}

实际上的底层HAL库存储的还是实际的日期,只是因为这里使用了time的标准,稍微修改了一下而已。

你可能感兴趣的:(rt-thread)