修复RTC驱动以及libc time.c库若干问题

This commit is contained in:
Meco Man
2021-02-05 13:13:22 +08:00
parent 97cc8a8f72
commit c2fca3dffe
4 changed files with 167 additions and 144 deletions
+5 -3
View File
@@ -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;
+21 -15
View File
@@ -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 */
+2 -2
View File
@@ -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