#include "os.h" #include "libs/task.h" #include "bsp/bsp.h" //one while will use 4 ins /* below function is dumy here, will overide by xxx_rtc.c */ __weak void rtc_set_time_with_utc_second(uint32_t s){ } __weak uint32_t rtc_get_timestamp(void){ return 0; } void task_delay(int ms) { os_udelay(ms*1000); } void os_ticks_enable(void) { CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; } u32 os_ticks_abs(void) { return DWT->CYCCNT; } u32 os_ticks_rel(u32 start) { u32 ticks = DWT->CYCCNT; if (ticks >= start) { return ticks - start; } return 0xFFFFFFFF - start + ticks + 1; } void os_ticks_delay(u32 ticks) { volatile u32 start = os_ticks_abs(); while (os_ticks_rel(start) < ticks); } void os_udelay(u32 delay) { os_ticks_delay(delay * (SystemCoreClock / 1000000)); } /* set rtc time, used utc timestamp, can not include time zone*/ uint32_t calendar_to_utc(time_val *time){ struct tm utc_time; struct tm my_time; memset(&utc_time, 0, sizeof (struct tm)); memset(&my_time, 0, sizeof (struct tm)); my_time.tm_mday = time->day; my_time.tm_mon = time->month- 1; my_time.tm_year = time->year - 1900; my_time.tm_hour = time->hour; my_time.tm_min = time->minute; my_time.tm_sec = time->second; utc_time.tm_mday = 1; utc_time.tm_mon = 1 - 1; utc_time.tm_year = 1970 - 1900; utc_time.tm_hour = 0; utc_time.tm_min = 0; utc_time.tm_sec = 0; return mktime(&my_time) - mktime(&utc_time); } void set_utc_time(time_val *time){ uint32_t second = calendar_to_utc(time); rtc_set_time_with_utc_second(second); } /* get the utc readable time */ void utc_to_calendar(uint32_t second, time_val *out){ struct tm *tm; tm = localtime((time_t *)&second); out->year = tm->tm_year + 1900; out->month = tm->tm_mon + 1; out->day = tm->tm_mday; out->hour = tm->tm_hour; out->minute = tm->tm_min; out->second = tm->tm_sec; } /*tz quarter-hour ,15min ,-48~+48*/ uint32_t get_timestamp_with_time_zone(int8_t tz){ return (rtc_get_timestamp()+ tz*15*60); } uint32_t get_timestamp(void){ return rtc_get_timestamp(); } void get_local_time(time_val *out, int8_t tz){ utc_to_calendar(get_timestamp_with_time_zone(tz), out); }