RT-Thread Studio RTC使用筆記

使能RTC:
在這裏插入圖片描述
拷貝drv_rtc.cdrv_log.h;使能#define HAL_RTC_MODULE_ENABLED:在這裏插入圖片描述
修改main函數即可使用:

#include <time.h>
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;
}

在這裏插入圖片描述
注意,這裏的時鐘因爲是使用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的標準,稍微修改了一下而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章