mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-10-07 00:59:00 +08:00
修复RTC驱动以及libc time.c库若干问题
This commit is contained in:
@@ -6,10 +6,12 @@
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-12-04 balanceTWK first version
|
||||
* 2020-10-14 Dozingfiretruck Porting for stm32wbxx
|
||||
* 2020-10-14 Dozingfiretruck Porting for stm32wbxx
|
||||
* 2021-02-05 Meco Man fix the problem of mixing local time and UTC time
|
||||
*/
|
||||
|
||||
#include "board.h"
|
||||
#include <sys/time.h>
|
||||
|
||||
#ifdef BSP_USING_ONCHIP_RTC
|
||||
|
||||
@@ -54,7 +56,7 @@ static time_t get_rtc_timestamp(void)
|
||||
tm_new.tm_year = RTC_DateStruct.Year + 100;
|
||||
|
||||
LOG_D("get rtc time.");
|
||||
return mktime(&tm_new);
|
||||
return timegm(&tm_new);
|
||||
}
|
||||
|
||||
static rt_err_t set_rtc_time_stamp(time_t time_stamp)
|
||||
@@ -63,7 +65,7 @@ static rt_err_t set_rtc_time_stamp(time_t time_stamp)
|
||||
RTC_DateTypeDef RTC_DateStruct = {0};
|
||||
struct tm *p_tm;
|
||||
|
||||
p_tm = localtime(&time_stamp);
|
||||
p_tm = gmtime(&time_stamp);
|
||||
if (p_tm->tm_year < 100)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
* 2018-02-16 armink add auto sync time by NTP
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <string.h>
|
||||
#include <rtthread.h>
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
#endif /* RTC_SYNC_USING_NTP */
|
||||
|
||||
/**
|
||||
* Set system date(time not modify).
|
||||
* Set system date(time not modify, local timezone).
|
||||
*
|
||||
* @param rt_uint32_t year e.g: 2012.
|
||||
* @param rt_uint32_t month e.g: 12 (1~12).
|
||||
@@ -52,10 +52,10 @@ rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)
|
||||
|
||||
/* lock scheduler. */
|
||||
rt_enter_critical();
|
||||
/* converts calendar time time into local time. */
|
||||
/* converts calendar time into local time. */
|
||||
p_tm = localtime(&now);
|
||||
/* copy the statically located variable */
|
||||
memcpy(&tm_new, p_tm, sizeof(struct tm));
|
||||
rt_memcpy(&tm_new, p_tm, sizeof(struct tm));
|
||||
/* unlock scheduler. */
|
||||
rt_exit_critical();
|
||||
|
||||
@@ -64,7 +64,7 @@ rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)
|
||||
tm_new.tm_mon = month - 1; /* tm_mon: 0~11 */
|
||||
tm_new.tm_mday = day;
|
||||
|
||||
/* converts the local time in time to calendar time. */
|
||||
/* converts the UTC time into the calendar time. */
|
||||
now = mktime(&tm_new);
|
||||
|
||||
device = rt_device_find("rtc");
|
||||
@@ -80,7 +80,7 @@ rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)
|
||||
}
|
||||
|
||||
/**
|
||||
* Set system time(date not modify).
|
||||
* Set system time(date not modify, local timezone).
|
||||
*
|
||||
* @param rt_uint32_t hour e.g: 0~23.
|
||||
* @param rt_uint32_t minute e.g: 0~59.
|
||||
@@ -102,10 +102,10 @@ rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)
|
||||
|
||||
/* lock scheduler. */
|
||||
rt_enter_critical();
|
||||
/* converts calendar time time into local time. */
|
||||
/* converts calendar time into local time. */
|
||||
p_tm = localtime(&now);
|
||||
/* copy the statically located variable */
|
||||
memcpy(&tm_new, p_tm, sizeof(struct tm));
|
||||
rt_memcpy(&tm_new, p_tm, sizeof(struct tm));
|
||||
/* unlock scheduler. */
|
||||
rt_exit_critical();
|
||||
|
||||
@@ -114,7 +114,7 @@ rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)
|
||||
tm_new.tm_min = minute;
|
||||
tm_new.tm_sec = second;
|
||||
|
||||
/* converts the local time in time to calendar time. */
|
||||
/* converts the local time into the calendar time. */
|
||||
now = mktime(&tm_new);
|
||||
|
||||
device = rt_device_find("rtc");
|
||||
@@ -174,6 +174,9 @@ INIT_COMPONENT_EXPORT(rt_rtc_ntp_sync_init);
|
||||
#include <finsh.h>
|
||||
#include <rtdevice.h>
|
||||
|
||||
/**
|
||||
* show date and time (local timezone)
|
||||
*/
|
||||
void list_date(void)
|
||||
{
|
||||
time_t now;
|
||||
@@ -181,12 +184,15 @@ void list_date(void)
|
||||
now = time(RT_NULL);
|
||||
rt_kprintf("%.*s\n", 25, ctime(&now));
|
||||
}
|
||||
FINSH_FUNCTION_EXPORT(list_date, show date and time.)
|
||||
FINSH_FUNCTION_EXPORT(list_date, show date and time (local timezone))
|
||||
FINSH_FUNCTION_EXPORT(set_date, set date(local timezone) e.g: set_date(2010,2,28))
|
||||
FINSH_FUNCTION_EXPORT(set_time, set time(local timezone) e.g: set_time(23,59,59))
|
||||
|
||||
FINSH_FUNCTION_EXPORT(set_date, set date. e.g: set_date(2010,2,28))
|
||||
FINSH_FUNCTION_EXPORT(set_time, set time. e.g: set_time(23,59,59))
|
||||
|
||||
#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH)
|
||||
/**
|
||||
* get date and time or set (local timezone) [year month day hour min sec]
|
||||
*/
|
||||
static void date(uint8_t argc, char **argv)
|
||||
{
|
||||
if (argc == 1)
|
||||
@@ -246,9 +252,9 @@ static void date(uint8_t argc, char **argv)
|
||||
rt_kprintf("e.g: date 2018 01 01 23 59 59 or date\n");
|
||||
}
|
||||
}
|
||||
MSH_CMD_EXPORT(date, get date and time or set [year month day hour min sec]);
|
||||
MSH_CMD_EXPORT(list_date, show date and time (local timezone))
|
||||
MSH_CMD_EXPORT(date, get date and time or set (local timezone) [year month day hour min sec])
|
||||
|
||||
#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */
|
||||
|
||||
#endif /* RT_USING_FINSH */
|
||||
|
||||
#endif /* RT_USING_RTC */
|
||||
|
||||
@@ -48,8 +48,8 @@ struct timezone {
|
||||
int tz_dsttime; /* type of dst correction */
|
||||
};
|
||||
|
||||
int gettimeofday(struct timeval *tp, void *ignore);
|
||||
struct tm *gmtime_r(const time_t *timep, struct tm *r);
|
||||
int gettimeofday(struct timeval *tp, struct timezone *tz);
|
||||
time_t timegm(struct tm * const t);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user