使能RTC:
拷贝drv_rtc.c
和drv_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的标准,稍微修改了一下而已。