use RTC to get date and time
This commit is contained in:
parent
b5001670e4
commit
af48bf09d6
|
@ -22,6 +22,7 @@
|
|||
#include <stdint.h> // standard integer types
|
||||
#include <stdlib.h> // standard utilities
|
||||
#include <string.h> // string utilities
|
||||
#include <time.h> // date/time utilities
|
||||
|
||||
/* STM32 (including CM3) libraries */
|
||||
#include <libopencmsis/core_cm3.h> // Cortex M3 utilities
|
||||
|
@ -49,6 +50,8 @@
|
|||
volatile bool rtc_internal_tick_flag = false; /**< flag set when internal RTC ticked */
|
||||
/** @} */
|
||||
|
||||
time_t time_rtc = 0; /**< time (seconds since Unix Epoch) */
|
||||
struct tm* time_tm; /**< time in tm format (time zones are not handled for non-POSIX environments) */
|
||||
|
||||
size_t putc(char c)
|
||||
{
|
||||
|
@ -117,6 +120,42 @@ static void process_command(char* str)
|
|||
} else {
|
||||
goto error;
|
||||
}
|
||||
} else if (0==strcmp(word,"time")) {
|
||||
word = strtok(NULL,delimiter);
|
||||
if (!word) {
|
||||
time_rtc = rtc_get_counter_val(); // get time from internal RTC
|
||||
time_tm = localtime(&time_rtc); // convert time
|
||||
printf("time: %02d:%02d:%02d\n", time_tm->tm_hour, time_tm->tm_min, time_tm->tm_sec);
|
||||
} else if (strlen(word)!=8 || word[0]<'0' || word[0]>'2' || word[1]<'0' || word[1]>'9' || word[3]<'0' || word[3]>'5' || word[4]<'0' || word[4]>'9' || word[6]<'0' || word[6]>'5' || word[7]<'0' || word[7]>'9') { // time format is incorrect
|
||||
goto error;
|
||||
} else {
|
||||
time_rtc = rtc_get_counter_val(); // get time from internal RTC
|
||||
time_tm = localtime(&time_rtc); // convert time
|
||||
time_tm->tm_hour = (word[0]-'0')*10+(word[1]-'0')*1; // set hours
|
||||
time_tm->tm_min = (word[3]-'0')*10+(word[4]-'0')*1; // set minutes
|
||||
time_tm->tm_sec = (word[6]-'0')*10+(word[7]-'0')*1; // set seconds
|
||||
time_rtc = mktime(time_tm); // get back seconds
|
||||
rtc_set_counter_val(time_rtc); // save time to internal RTC
|
||||
printf("time set\n");
|
||||
}
|
||||
} else if (0==strcmp(word,"date")) {
|
||||
word = strtok(NULL,delimiter);
|
||||
if (!word) {
|
||||
time_rtc = rtc_get_counter_val(); // get time from internal RTC
|
||||
time_tm = localtime(&time_rtc); // convert time
|
||||
printf("date: %d-%02d-%02d\n", 1900+time_tm->tm_year, time_tm->tm_mon, time_tm->tm_mday);
|
||||
} else if (strlen(word)!=10 || word[0]!='2' || word[1]!='0' || word[2]<'0' || word[2]>'9' || word[3]<'0' || word[3]>'9' || word[5]<'0' || word[5]>'1' || word[6]<'0' || word[6]>'9' || word[8]<'0' || word[8]>'3' || word[9]<'0' || word[9]>'9') {
|
||||
goto error;
|
||||
} else {
|
||||
time_rtc = rtc_get_counter_val(); // get time from internal RTC
|
||||
time_tm = localtime(&time_rtc); // convert time
|
||||
time_tm->tm_year = ((word[0]-'0')*1000+(word[1]-'0')*100+(word[2]-'0')*10+(word[3]-'0')*1)-1900; // set year
|
||||
time_tm->tm_mon = (word[5]-'0')*10+(word[6]-'0')*1; // set month
|
||||
time_tm->tm_mday = (word[8]-'0')*10+(word[9]-'0')*1; // set day
|
||||
time_rtc = mktime(time_tm); // get back seconds
|
||||
rtc_set_counter_val(time_rtc); // save time to internal RTC
|
||||
printf("date set\n");
|
||||
}
|
||||
} else {
|
||||
goto error;
|
||||
}
|
||||
|
@ -173,8 +212,9 @@ void main(void)
|
|||
nvic_enable_irq(NVIC_RTC_IRQ); // allow the RTC to interrupt
|
||||
printf("OK\n");
|
||||
|
||||
uint32_t ticks_time = rtc_get_counter_val(); // get time from internal RTC (since first start/power up)
|
||||
printf("uptime: %lu.%02lu:%02lu:%02lu\n", ticks_time/(60*60*24), (ticks_time/(60*60))%24, (ticks_time%(60*60))/60, (ticks_time%60)); // display uptime
|
||||
time_rtc= rtc_get_counter_val(); // get time from internal RTC
|
||||
time_tm = localtime(&time_rtc); // convert time
|
||||
printf("date: %d-%02d-%02d %02d:%02d:%02d\n", 1900+time_tm->tm_year, time_tm->tm_mon, time_tm->tm_mday, time_tm->tm_hour, time_tm->tm_min, time_tm->tm_sec);
|
||||
|
||||
// main loop
|
||||
printf("command input: ready\n");
|
||||
|
@ -224,13 +264,14 @@ void main(void)
|
|||
}
|
||||
while (rtc_internal_tick_flag) { // the internal RTC ticked
|
||||
rtc_internal_tick_flag = false; // reset flag
|
||||
action = true; // action has been performed
|
||||
#if !defined(BLUE_PILL) // on the blue pill the LED is close to the 32.768 kHz oscillator and heavily influences it
|
||||
led_toggle(); // toggle LED (good to indicate if main function is stuck)
|
||||
#endif
|
||||
ticks_time = rtc_get_counter_val(); // copy time from internal RTC for processing
|
||||
action = true; // action has been performed
|
||||
if ((ticks_time%(60))==0) { // one minute passed
|
||||
printf("uptime: %lu.%02lu:%02lu:%02lu\n", ticks_time/(60*60*24), (ticks_time/(60*60))%24, (ticks_time%(60*60))/60, (ticks_time%60)); // display uptime
|
||||
time_rtc = rtc_get_counter_val(); // get time from internal RTC (seconds since Unix Epoch)
|
||||
time_tm = localtime(&time_rtc); // get time in tm format from Epoch (time zones are not handled for non-POSIX environments)
|
||||
if (0==time_tm->tm_sec) { // new minute
|
||||
printf("time: %02d:%02d:%02d\n", time_tm->tm_hour, time_tm->tm_min, time_tm->tm_sec);
|
||||
}
|
||||
}
|
||||
if (action) { // go to sleep if nothing had to be done, else recheck for activity
|
||||
|
|
Loading…
Reference in New Issue