In the past, you need modify rtc_api.c in mbed-dev source code. From this revision, you can just use RTC function all of conditions (Normal, Reset, Stand-by, Power OFF).

Note

From now on, you do NOT need any modification for mbed-dev library because STM team updates rtc_api.c source code and support RTC function under reset & standby condition includes power off condition (You need additional VBAT back-up hardware).

Please refer following NOTE information.
/users/kenjiArai/notebook/nucleo-series-rtc-control-under-power-onoff-and-re/

Committer:
kenjiArai
Date:
Sat Mar 06 08:29:51 2021 +0000
Revision:
14:4b03106ece1f
Parent:
13:c1f984932e98
run on mbed-os6.8.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:0751c92c0f71 1 /*
kenjiArai 0:0751c92c0f71 2 * mbed Application program
kenjiArai 0:0751c92c0f71 3 * RTC (inside STM32x CPU) test program
kenjiArai 0:0751c92c0f71 4 *
kenjiArai 12:8cb1f89541d1 5 * Copyright (c) 2015,'16,'17,'20, '21 Kenji Arai / JH1PJL
kenjiArai 10:806cfec92eb6 6 * http://www7b.biglobe.ne.jp/~kenjia/
kenjiArai 10:806cfec92eb6 7 * https://os.mbed.com/users/kenjiArai/
kenjiArai 0:0751c92c0f71 8 * Created: January 17th, 2015
kenjiArai 14:4b03106ece1f 9 * Revised: March 6th, 2021
kenjiArai 9:6a64b0207f72 10 */
kenjiArai 9:6a64b0207f72 11
kenjiArai 9:6a64b0207f72 12 /* mbed library now suports RTC continuous operation at Reset & Power ON/OFF
kenjiArai 9:6a64b0207f72 13 --------------------------------------------------------------------------
kenjiArai 9:6a64b0207f72 14 In the past, rtc_api.c (inside mbed) alway made a reset RTC registers
kenjiArai 9:6a64b0207f72 15 when user push a reset buttom or terninate a power.
kenjiArai 9:6a64b0207f72 16 Even if user configures a back-up circuit for RTC, mbed board could not
kenjiArai 9:6a64b0207f72 17 keep proper time.
kenjiArai 10:806cfec92eb6 18 --> Right now, you don't worry thoese issue.
kenjiArai 0:0751c92c0f71 19 */
kenjiArai 0:0751c92c0f71 20
kenjiArai 9:6a64b0207f72 21 /*
kenjiArai 9:6a64b0207f72 22 ----- Tested board -----
kenjiArai 9:6a64b0207f72 23 / Reset: / Stanby: / power off and restart:
kenjiArai 9:6a64b0207f72 24 Nucleo-F401RE / ok / ok / ok (need following Back-up Circuit)
kenjiArai 9:6a64b0207f72 25 Nucleo-F411RE / ok / ok / ok (need following Back-up Circuit)
kenjiArai 9:6a64b0207f72 26 Nucleo-F446RE / ok / ok / ok (need following Back-up Circuit)
kenjiArai 12:8cb1f89541d1 27 not support on Mbed-os6.6.0 Nucleo-F334R8
kenjiArai 9:6a64b0207f72 28 Nucleo-L476RG / ok / ok / ok (need following Back-up Circuit)
kenjiArai 10:806cfec92eb6 29 DISCO-L45VG-IOT/ ok / ok / ok (Need additional hardware)
kenjiArai 9:6a64b0207f72 30 Nucleo-L152RE / ok / ok / no check (Need additional hardware)
kenjiArai 9:6a64b0207f72 31 Nucleo-L073RZ / ok / ok / no check (Need additional hardware)
kenjiArai 12:8cb1f89541d1 32 not support on Mbed-os6.6.0 Nucleo-L053R8
kenjiArai 13:c1f984932e98 33
kenjiArai 13:c1f984932e98 34 ----- add tested board -----
kenjiArai 13:c1f984932e98 35 Nucleo-F446ZE
kenjiArai 13:c1f984932e98 36 DISCO-F746NG
kenjiArai 13:c1f984932e98 37 Nucleo-F746ZG
kenjiArai 13:c1f984932e98 38 DISCO-F769NI
kenjiArai 13:c1f984932e98 39 Nucleo-H743ZI2
kenjiArai 13:c1f984932e98 40 Nucleo-F303K8
kenjiArai 13:c1f984932e98 41 Nucleo-L432KC
kenjiArai 0:0751c92c0f71 42
kenjiArai 9:6a64b0207f72 43 < Back-up circuit >
kenjiArai 9:6a64b0207f72 44 CN7 VIN <- SBD <- 330 Ohm <- CR2032 + - -> CN7 GND
kenjiArai 9:6a64b0207f72 45 Remove SB45 Zero Ohm resistor
kenjiArai 11:2e514d955a2b 46
kenjiArai 10:806cfec92eb6 47 ----- PLEASE REFER FOLLOWS ----
kenjiArai 10:806cfec92eb6 48 https://os.mbed.com/users/kenjiArai/notebook/
kenjiArai 10:806cfec92eb6 49 nucleo-series-rtc-control-under-power-onoff-and-re/
kenjiArai 9:6a64b0207f72 50 */
kenjiArai 8:bf593344668e 51
kenjiArai 9:6a64b0207f72 52 // Include --------------------------------------------------------------------
kenjiArai 9:6a64b0207f72 53 #include "mbed.h"
kenjiArai 14:4b03106ece1f 54 #include "uart_as_stdio.h"
kenjiArai 9:6a64b0207f72 55
kenjiArai 9:6a64b0207f72 56 // Definition -----------------------------------------------------------------
kenjiArai 13:c1f984932e98 57 #if defined(TARGET_DISCO_F746NG) \
kenjiArai 13:c1f984932e98 58 || defined(TARGET_NUCLEO_F746ZG) \
kenjiArai 13:c1f984932e98 59 || defined(TARGET_DISCO_F769NI) \
kenjiArai 14:4b03106ece1f 60 || defined(TARGET_DISCO_F469NI) \
kenjiArai 13:c1f984932e98 61 || defined(TARGET_NUCLEO_F446ZE) \
kenjiArai 13:c1f984932e98 62 || defined(TARGET_NUCLEO_H743ZI2)
kenjiArai 8:bf593344668e 63 #define PUSHED_SW 1 // Active high
kenjiArai 13:c1f984932e98 64 #elif defined(TARGET_NUCLEO_F303K8) \
kenjiArai 13:c1f984932e98 65 || defined(TARGET_NUCLEO_L432KC)
kenjiArai 13:c1f984932e98 66 #define USER_BUTTON A0 // temporary setting
kenjiArai 13:c1f984932e98 67 #define PUSHED_SW 0 // Active low
kenjiArai 8:bf593344668e 68 #else
kenjiArai 8:bf593344668e 69 #define PUSHED_SW 0 // Active low
kenjiArai 1:7a48c475bbd2 70 #endif
kenjiArai 1:7a48c475bbd2 71
kenjiArai 14:4b03106ece1f 72 #define LONGLONGTIME 2147483647s
kenjiArai 10:806cfec92eb6 73
kenjiArai 9:6a64b0207f72 74 // Object ---------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 75 DigitalIn userSW(USER_BUTTON);
kenjiArai 10:806cfec92eb6 76 DigitalOut myled(LED1); // Indicate the sampling period
kenjiArai 0:0751c92c0f71 77
kenjiArai 9:6a64b0207f72 78 // RAM ------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 79
kenjiArai 9:6a64b0207f72 80 // ROM / Constant data --------------------------------------------------------
kenjiArai 10:806cfec92eb6 81 const char *const msg0 = "Is a time correct? If no, please hit any key. ";
kenjiArai 10:806cfec92eb6 82 const char *const msg1 = "<Push USER SW then enter the Standby mode> ";
kenjiArai 0:0751c92c0f71 83
kenjiArai 9:6a64b0207f72 84 // Function prototypes --------------------------------------------------------
kenjiArai 11:2e514d955a2b 85 FileHandle *mbed::mbed_override_console(int fd);
kenjiArai 9:6a64b0207f72 86 static void time_enter_mode(void);
kenjiArai 9:6a64b0207f72 87 static void chk_and_set_time(char *ptr);
kenjiArai 10:806cfec92eb6 88 static int32_t xatoi (char **str, int32_t *res);
kenjiArai 10:806cfec92eb6 89 static void get_line (char *buff, int32_t len);
kenjiArai 10:806cfec92eb6 90 static void usr_sw_irq(void);
kenjiArai 10:806cfec92eb6 91 extern void print_revision(void);
kenjiArai 9:6a64b0207f72 92
kenjiArai 9:6a64b0207f72 93 //------------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 94 // Control Program
kenjiArai 9:6a64b0207f72 95 //------------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 96 int main()
kenjiArai 0:0751c92c0f71 97 {
kenjiArai 11:2e514d955a2b 98 char buf[64];
kenjiArai 0:0751c92c0f71 99 time_t seconds;
kenjiArai 4:a9cebfe4715f 100 uint8_t wait_counter = 0;
kenjiArai 0:0751c92c0f71 101
kenjiArai 11:2e514d955a2b 102 puts("\r\n\r\nTest Nucleo RTC Function.");
kenjiArai 10:806cfec92eb6 103 print_revision();
kenjiArai 2:77ec44bf1fa5 104 myled = !myled;
kenjiArai 14:4b03106ece1f 105 ThisThread::sleep_for(500ms);
kenjiArai 0:0751c92c0f71 106 myled = !myled;
kenjiArai 14:4b03106ece1f 107 ThisThread::sleep_for(500ms);
kenjiArai 10:806cfec92eb6 108 while(true) {
kenjiArai 0:0751c92c0f71 109 seconds = time(NULL);
kenjiArai 8:bf593344668e 110 strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
kenjiArai 11:2e514d955a2b 111 printf("[Time] %s", buf);
kenjiArai 11:2e514d955a2b 112 printf("%s", msg0);
kenjiArai 11:2e514d955a2b 113 printf("%s", msg1);
kenjiArai 11:2e514d955a2b 114 puts("\r");
kenjiArai 4:a9cebfe4715f 115 wait_counter = 0;
kenjiArai 11:2e514d955a2b 116 while (seconds == time(NULL)) {
kenjiArai 14:4b03106ece1f 117 if (readable() == 1) {
kenjiArai 14:4b03106ece1f 118 buf[0] = getc(); // dummy read
kenjiArai 0:0751c92c0f71 119 time_enter_mode();
kenjiArai 0:0751c92c0f71 120 }
kenjiArai 11:2e514d955a2b 121 if (userSW == PUSHED_SW) { // goto sleep
kenjiArai 11:2e514d955a2b 122 while (userSW == PUSHED_SW) {
kenjiArai 14:4b03106ece1f 123 ThisThread::sleep_for(10ms);
kenjiArai 10:806cfec92eb6 124 }
kenjiArai 14:4b03106ece1f 125 ThisThread::sleep_for(10ms);
kenjiArai 11:2e514d955a2b 126 puts("Entered the standby mode. ");
kenjiArai 13:c1f984932e98 127 #if defined(TARGET_NUCLEO_F303K8) || defined(TARGET_NUCLEO_L432KC)
kenjiArai 13:c1f984932e98 128 puts("Please change A0 level for wake-up(Reset).");
kenjiArai 13:c1f984932e98 129 #else
kenjiArai 11:2e514d955a2b 130 puts("Please push USER BUTTON to wake-up(Reset).");
kenjiArai 13:c1f984932e98 131 #endif
kenjiArai 2:77ec44bf1fa5 132 myled = 0;
kenjiArai 13:c1f984932e98 133
kenjiArai 10:806cfec92eb6 134 InterruptIn usr_sw(USER_BUTTON);
kenjiArai 14:4b03106ece1f 135 ThisThread::sleep_for(1s);
kenjiArai 10:806cfec92eb6 136 DigitalIn dmy0(LED1);
kenjiArai 10:806cfec92eb6 137 DigitalIn dmy1(USBTX);
kenjiArai 10:806cfec92eb6 138 DigitalIn dmy2(USBRX);
kenjiArai 13:c1f984932e98 139 usr_sw.fall(&usr_sw_irq); // actual push or chattering
kenjiArai 14:4b03106ece1f 140 sleep_preparation();
kenjiArai 14:4b03106ece1f 141 ThisThread::sleep_for(LONGLONGTIME);
kenjiArai 2:77ec44bf1fa5 142 }
kenjiArai 14:4b03106ece1f 143 ThisThread::sleep_for(50ms);
kenjiArai 11:2e514d955a2b 144 if (++wait_counter > (2000 / 50)) {
kenjiArai 4:a9cebfe4715f 145 break;
kenjiArai 4:a9cebfe4715f 146 }
kenjiArai 0:0751c92c0f71 147 }
kenjiArai 11:2e514d955a2b 148 // delete previous strings
kenjiArai 14:4b03106ece1f 149 // https://en.wikipedia.org/wiki/ANSI_escape_code#CSIsection
kenjiArai 14:4b03106ece1f 150 // \33[ = CSI sequences, 1A=Cursor Up (one line), 2K=Erase in Line(all)
kenjiArai 14:4b03106ece1f 151 // G=Cursor Horizontal Absolute
kenjiArai 14:4b03106ece1f 152 printf("\33[1A\033[2K\033[G");
kenjiArai 2:77ec44bf1fa5 153 myled = !myled;
kenjiArai 0:0751c92c0f71 154 }
kenjiArai 0:0751c92c0f71 155 }
kenjiArai 9:6a64b0207f72 156
kenjiArai 10:806cfec92eb6 157 // Interrupt for wake up
kenjiArai 10:806cfec92eb6 158 static void usr_sw_irq(void)
kenjiArai 10:806cfec92eb6 159 {
kenjiArai 10:806cfec92eb6 160 system_reset(); // restart from RESET condition
kenjiArai 10:806cfec92eb6 161 }
kenjiArai 10:806cfec92eb6 162
kenjiArai 10:806cfec92eb6 163 // Time adjustment
kenjiArai 10:806cfec92eb6 164 static void time_enter_mode(void)
kenjiArai 9:6a64b0207f72 165 {
kenjiArai 9:6a64b0207f72 166 char *ptr;
kenjiArai 9:6a64b0207f72 167 char linebuf[64];
kenjiArai 9:6a64b0207f72 168
kenjiArai 11:2e514d955a2b 169 puts("Set time into RTC.");
kenjiArai 14:4b03106ece1f 170 puts(" e.g. >21 3 3 3 33 33 -> March 03,'21, 03:33:33");
kenjiArai 11:2e514d955a2b 171 puts(" If time is fine, just hit enter key.");
kenjiArai 14:4b03106ece1f 172 putc('>');
kenjiArai 9:6a64b0207f72 173 ptr = linebuf;
kenjiArai 9:6a64b0207f72 174 get_line(ptr, sizeof(linebuf));
kenjiArai 14:4b03106ece1f 175 putc('\r');
kenjiArai 9:6a64b0207f72 176 chk_and_set_time(ptr);
kenjiArai 9:6a64b0207f72 177 }
kenjiArai 9:6a64b0207f72 178
kenjiArai 10:806cfec92eb6 179 // Change string -> integer
kenjiArai 10:806cfec92eb6 180 static int32_t xatoi(char **str, int32_t *res)
kenjiArai 9:6a64b0207f72 181 {
kenjiArai 10:806cfec92eb6 182 uint32_t val;
kenjiArai 10:806cfec92eb6 183 uint8_t c, radix, s = 0;
kenjiArai 9:6a64b0207f72 184
kenjiArai 9:6a64b0207f72 185 while ((c = **str) == ' ') (*str)++;
kenjiArai 9:6a64b0207f72 186 if (c == '-') {
kenjiArai 9:6a64b0207f72 187 s = 1;
kenjiArai 9:6a64b0207f72 188 c = *(++(*str));
kenjiArai 9:6a64b0207f72 189 }
kenjiArai 9:6a64b0207f72 190 if (c == '0') {
kenjiArai 9:6a64b0207f72 191 c = *(++(*str));
kenjiArai 9:6a64b0207f72 192 if (c <= ' ') {
kenjiArai 9:6a64b0207f72 193 *res = 0;
kenjiArai 9:6a64b0207f72 194 return 1;
kenjiArai 9:6a64b0207f72 195 }
kenjiArai 9:6a64b0207f72 196 if (c == 'x') {
kenjiArai 9:6a64b0207f72 197 radix = 16;
kenjiArai 9:6a64b0207f72 198 c = *(++(*str));
kenjiArai 9:6a64b0207f72 199 } else {
kenjiArai 9:6a64b0207f72 200 if (c == 'b') {
kenjiArai 9:6a64b0207f72 201 radix = 2;
kenjiArai 9:6a64b0207f72 202 c = *(++(*str));
kenjiArai 9:6a64b0207f72 203 } else {
kenjiArai 9:6a64b0207f72 204 if ((c >= '0')&&(c <= '9')) {
kenjiArai 9:6a64b0207f72 205 radix = 8;
kenjiArai 9:6a64b0207f72 206 } else {
kenjiArai 9:6a64b0207f72 207 return 0;
kenjiArai 9:6a64b0207f72 208 }
kenjiArai 9:6a64b0207f72 209 }
kenjiArai 9:6a64b0207f72 210 }
kenjiArai 9:6a64b0207f72 211 } else {
kenjiArai 9:6a64b0207f72 212 if ((c < '1')||(c > '9')) {
kenjiArai 9:6a64b0207f72 213 return 0;
kenjiArai 9:6a64b0207f72 214 }
kenjiArai 9:6a64b0207f72 215 radix = 10;
kenjiArai 9:6a64b0207f72 216 }
kenjiArai 9:6a64b0207f72 217 val = 0;
kenjiArai 9:6a64b0207f72 218 while (c > ' ') {
kenjiArai 9:6a64b0207f72 219 if (c >= 'a') c -= 0x20;
kenjiArai 9:6a64b0207f72 220 c -= '0';
kenjiArai 9:6a64b0207f72 221 if (c >= 17) {
kenjiArai 9:6a64b0207f72 222 c -= 7;
kenjiArai 9:6a64b0207f72 223 if (c <= 9) return 0;
kenjiArai 9:6a64b0207f72 224 }
kenjiArai 9:6a64b0207f72 225 if (c >= radix) return 0;
kenjiArai 9:6a64b0207f72 226 val = val * radix + c;
kenjiArai 9:6a64b0207f72 227 c = *(++(*str));
kenjiArai 9:6a64b0207f72 228 }
kenjiArai 9:6a64b0207f72 229 if (s) val = -val;
kenjiArai 9:6a64b0207f72 230 *res = val;
kenjiArai 9:6a64b0207f72 231 return 1;
kenjiArai 9:6a64b0207f72 232 }
kenjiArai 9:6a64b0207f72 233
kenjiArai 9:6a64b0207f72 234 // Get key input data
kenjiArai 10:806cfec92eb6 235 static void get_line(char *buff, int32_t len)
kenjiArai 9:6a64b0207f72 236 {
kenjiArai 9:6a64b0207f72 237 char c;
kenjiArai 10:806cfec92eb6 238 int32_t idx = 0;
kenjiArai 9:6a64b0207f72 239
kenjiArai 9:6a64b0207f72 240 for (;;) {
kenjiArai 14:4b03106ece1f 241 c = getc();
kenjiArai 11:2e514d955a2b 242 //printf("0x%x \r\n", c);
kenjiArai 9:6a64b0207f72 243 if (c == '\r') {
kenjiArai 9:6a64b0207f72 244 buff[idx++] = c;
kenjiArai 9:6a64b0207f72 245 break;
kenjiArai 9:6a64b0207f72 246 }
kenjiArai 9:6a64b0207f72 247 if ((c == '\b') && idx) {
kenjiArai 9:6a64b0207f72 248 idx--;
kenjiArai 11:2e514d955a2b 249 const char bf_bs[] =
kenjiArai 11:2e514d955a2b 250 {0x1b, '[', '1', 'D', ' ', 0x1b, '[', '1', 'D'};
kenjiArai 14:4b03106ece1f 251 printf(bf_bs, 9);
kenjiArai 9:6a64b0207f72 252 }
kenjiArai 9:6a64b0207f72 253 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 9:6a64b0207f72 254 buff[idx++] = c;
kenjiArai 14:4b03106ece1f 255 putc(c);
kenjiArai 9:6a64b0207f72 256 }
kenjiArai 9:6a64b0207f72 257 }
kenjiArai 9:6a64b0207f72 258 buff[idx] = 0;
kenjiArai 14:4b03106ece1f 259 putc('\n');
kenjiArai 9:6a64b0207f72 260 }
kenjiArai 9:6a64b0207f72 261
kenjiArai 10:806cfec92eb6 262 // Check key input strings and set time
kenjiArai 10:806cfec92eb6 263 static void chk_and_set_time(char *ptr)
kenjiArai 9:6a64b0207f72 264 {
kenjiArai 10:806cfec92eb6 265 int32_t p1;
kenjiArai 9:6a64b0207f72 266 struct tm t;
kenjiArai 9:6a64b0207f72 267 time_t seconds;
kenjiArai 9:6a64b0207f72 268
kenjiArai 9:6a64b0207f72 269 if (xatoi(&ptr, &p1)) {
kenjiArai 9:6a64b0207f72 270 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 11:2e514d955a2b 271 printf("Year:%d ",p1);
kenjiArai 9:6a64b0207f72 272 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 273 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 11:2e514d955a2b 274 printf("Month:%d ",p1);
kenjiArai 9:6a64b0207f72 275 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 276 t.tm_mday = (uint8_t)p1;
kenjiArai 11:2e514d955a2b 277 printf("Day:%d ",p1);
kenjiArai 9:6a64b0207f72 278 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 279 t.tm_hour = (uint8_t)p1;
kenjiArai 11:2e514d955a2b 280 printf("Hour:%d ",p1);
kenjiArai 9:6a64b0207f72 281 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 282 t.tm_min = (uint8_t)p1;
kenjiArai 11:2e514d955a2b 283 printf("Min:%d ",p1);
kenjiArai 9:6a64b0207f72 284 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 285 t.tm_sec = (uint8_t)p1;
kenjiArai 11:2e514d955a2b 286 printf("Sec: %d \r\n",p1);
kenjiArai 9:6a64b0207f72 287 } else {
kenjiArai 9:6a64b0207f72 288 return;
kenjiArai 9:6a64b0207f72 289 }
kenjiArai 9:6a64b0207f72 290 seconds = mktime(&t);
kenjiArai 9:6a64b0207f72 291 set_time(seconds);
kenjiArai 11:2e514d955a2b 292 // Show Time with several example
kenjiArai 9:6a64b0207f72 293 // ex.1
kenjiArai 11:2e514d955a2b 294 printf(
kenjiArai 9:6a64b0207f72 295 "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
kenjiArai 9:6a64b0207f72 296 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec
kenjiArai 9:6a64b0207f72 297 );
kenjiArai 11:2e514d955a2b 298 char buf[64];
kenjiArai 9:6a64b0207f72 299 // ex.2
kenjiArai 9:6a64b0207f72 300 strftime(buf, 40, "%x %X", localtime(&seconds));
kenjiArai 11:2e514d955a2b 301 printf("Date: %s\r\n", buf);
kenjiArai 9:6a64b0207f72 302 // ex.3
kenjiArai 9:6a64b0207f72 303 strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 11:2e514d955a2b 304 printf("Date: %s\r\n", buf);
kenjiArai 9:6a64b0207f72 305 // ex.4
kenjiArai 9:6a64b0207f72 306 strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
kenjiArai 11:2e514d955a2b 307 printf("Date: %s\r\n", buf);
kenjiArai 9:6a64b0207f72 308 }