Solution how to fix broken RTC on Nucleo_F103RB / STM32F103 BluePill etc..

Dependencies:   mbed-dev

Fork of Nucleo_RTC_battery_bkup_pwr_off_okay by Kenji Arai

Experimental fork https://os.mbed.com/users/kenjiArai/code/Nucleo_RTC_battery_bkup_pwr_off_okay/ to fix broken RTC on Nucleo_F103RB / STM32F103 BluePill etc..

At this moment (7/11/17) use forked mbed-dev https://os.mbed.com/users/maxxir/code/mbed-dev/.

Or require patch for ./mbed-dev/targets/TARGET_STM/rtc_api.c.

You can manual add to your project fresh mbed-dev and change file mbed-dev\targets\TARGET_STM\rtc_api.c from root project patched rtc_api.c.stm32f10x.txt.

Exploring origin errors, I saw that something wrong with HAL API on STM32F1xx with this functions:

 HAL_RTC_GetTime(&RtcHandle, &timeStruct, RTC_FORMAT_BIN);

 HAL_RTC_GetDate(&RtcHandle, &dateStruct, RTC_FORMAT_BIN);


 HAL_RTC_SetDate(&RtcHandle, &dateStruct, RTC_FORMAT_BIN);

 HAL_RTC_SetTime(&RtcHandle, &timeStruct, RTC_FORMAT_BIN);

Look here (as I understand it possible broken on STM32CUBE HAL level now):

https://community.st.com/thread/43218-stm32f103-loss-rtc-date-when-reset

So I use direct RTC register manipulation for STM32F1xx:

rtc_read(), rtc_write() (native rtc_init() - works good).

Also added stub for non-working on STM32F1xx rtc_read_subseconds().

Now the stm32F103 can survive power off, and allows you to get and set the time.

Tested OK on boards:

NUCLEO STM32F103RB, DIY STM32F100CB (forked from DISCO_F100RB)

Happy coding!

maxxir

10/11/17

Committer:
maxxir
Date:
Fri Nov 10 05:42:31 2017 +0000
Revision:
12:dfd6bc5c6f2f
Parent:
10:0c6dfc996c1a
Addded patched and renamed rtc_api.c to root of prj

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maxxir 10:0c6dfc996c1a 1 /*
maxxir 10:0c6dfc996c1a 2 Experimental fork https://os.mbed.com/users/kenjiArai/code/Nucleo_RTC_battery_bkup_pwr_off_okay/
maxxir 10:0c6dfc996c1a 3 to fix broken RTC on Nucleo_F103RB / STM32F103 BluePill etc..
maxxir 10:0c6dfc996c1a 4 at this moment (7/11/17) require patch for ./mbed-dev/targets/TARGET_STM/rtc_api.c.
maxxir 10:0c6dfc996c1a 5
maxxir 10:0c6dfc996c1a 6 Something wrong with STM32CUBE API on STM32F1xx with this functions:
maxxir 10:0c6dfc996c1a 7 HAL_RTC_GetTime(&RtcHandle, &timeStruct, RTC_FORMAT_BIN);
maxxir 10:0c6dfc996c1a 8 HAL_RTC_GetDate(&RtcHandle, &dateStruct, RTC_FORMAT_BIN);
maxxir 10:0c6dfc996c1a 9 HAL_RTC_SetDate(&RtcHandle, &dateStruct, RTC_FORMAT_BIN);
maxxir 10:0c6dfc996c1a 10 HAL_RTC_SetTime(&RtcHandle, &timeStruct, RTC_FORMAT_BIN);
maxxir 10:0c6dfc996c1a 11
maxxir 10:0c6dfc996c1a 12 Look here (as I understand it broken on STM32CUBE level now):
maxxir 10:0c6dfc996c1a 13 https://community.st.com/thread/43218-stm32f103-loss-rtc-date-when-reset
maxxir 10:0c6dfc996c1a 14
maxxir 10:0c6dfc996c1a 15 So I use direct RTC register manipulation for STM32F1xx
maxxir 10:0c6dfc996c1a 16 rtc_read() && rtc_write() (native rtc_init() - works good)
maxxir 10:0c6dfc996c1a 17 also added stub for non-working on STM32F1xx rtc_read_subseconds().
maxxir 10:0c6dfc996c1a 18 Now RTC on stm32F103 survive poweroff.
maxxir 10:0c6dfc996c1a 19
maxxir 10:0c6dfc996c1a 20 Happy coding!
maxxir 10:0c6dfc996c1a 21 Ibragimov Maxim aka maxxir
maxxir 10:0c6dfc996c1a 22 Russia Togliatty 07/10/17
maxxir 10:0c6dfc996c1a 23 */
kenjiArai 0:0751c92c0f71 24 /*
kenjiArai 0:0751c92c0f71 25 * mbed Application program
kenjiArai 0:0751c92c0f71 26 * RTC (inside STM32x CPU) test program
kenjiArai 0:0751c92c0f71 27 *
kenjiArai 9:6a64b0207f72 28 * Copyright (c) 2015,'16,'17 Kenji Arai / JH1PJL
kenjiArai 0:0751c92c0f71 29 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:0751c92c0f71 30 * http://mbed.org/users/kenjiArai/
kenjiArai 0:0751c92c0f71 31 * Created: January 17th, 2015
kenjiArai 9:6a64b0207f72 32 * Revised: January 16th, 2017
kenjiArai 0:0751c92c0f71 33 *
kenjiArai 9:6a64b0207f72 34 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
kenjiArai 9:6a64b0207f72 35 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kenjiArai 9:6a64b0207f72 36 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
kenjiArai 9:6a64b0207f72 37 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 9:6a64b0207f72 38 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
kenjiArai 9:6a64b0207f72 39 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
kenjiArai 9:6a64b0207f72 40 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 9:6a64b0207f72 41 */
kenjiArai 9:6a64b0207f72 42
kenjiArai 9:6a64b0207f72 43 /* mbed library now suports RTC continuous operation at Reset & Power ON/OFF
kenjiArai 9:6a64b0207f72 44 --------------------------------------------------------------------------
kenjiArai 9:6a64b0207f72 45 In the past, rtc_api.c (inside mbed) alway made a reset RTC registers
kenjiArai 9:6a64b0207f72 46 when user push a reset buttom or terninate a power.
kenjiArai 9:6a64b0207f72 47 Even if user configures a back-up circuit for RTC, mbed board could not
kenjiArai 9:6a64b0207f72 48 keep proper time.
kenjiArai 9:6a64b0207f72 49 I have checked mbed rev.133 and mbed-dev rev.155.
kenjiArai 0:0751c92c0f71 50 */
kenjiArai 0:0751c92c0f71 51
kenjiArai 9:6a64b0207f72 52 /*
kenjiArai 9:6a64b0207f72 53 ----- Tested board -----
kenjiArai 9:6a64b0207f72 54 / Reset: / Stanby: / power off and restart:
kenjiArai 9:6a64b0207f72 55 Nucleo-F401RE / ok / ok / ok (need following Back-up Circuit)
kenjiArai 9:6a64b0207f72 56 Nucleo-F411RE / ok / ok / ok (need following Back-up Circuit)
kenjiArai 9:6a64b0207f72 57 Nucleo-F446RE / ok / ok / ok (need following Back-up Circuit)
kenjiArai 9:6a64b0207f72 58 Nucleo-F334R8 / ok / ok / ok (need following Back-up Circuit)
kenjiArai 9:6a64b0207f72 59 Nucleo-L476RG / ok / ok / ok (need following Back-up Circuit)
kenjiArai 9:6a64b0207f72 60 Nucleo-L152RE / ok / ok / no check (Need additional hardware)
kenjiArai 9:6a64b0207f72 61 Nucleo-L073RZ / ok / ok / no check (Need additional hardware)
kenjiArai 9:6a64b0207f72 62 Nucleo-L053R8 / ok / ok / no check (Need additional hardware)
kenjiArai 0:0751c92c0f71 63
kenjiArai 9:6a64b0207f72 64 < Back-up circuit >
kenjiArai 9:6a64b0207f72 65 CN7 VIN <- SBD <- 330 Ohm <- CR2032 + - -> CN7 GND
kenjiArai 9:6a64b0207f72 66 Remove SB45 Zero Ohm resistor
kenjiArai 9:6a64b0207f72 67 */
kenjiArai 8:bf593344668e 68
kenjiArai 9:6a64b0207f72 69 // Include --------------------------------------------------------------------
kenjiArai 9:6a64b0207f72 70 #include "mbed.h"
kenjiArai 9:6a64b0207f72 71
kenjiArai 9:6a64b0207f72 72 // Definition -----------------------------------------------------------------
kenjiArai 8:bf593344668e 73 #if (defined(TARGET_STM32F746NG) || defined(TARGET_STM32F746ZG))
kenjiArai 8:bf593344668e 74 #define PUSHED_SW 1 // Active high
kenjiArai 8:bf593344668e 75 #else
kenjiArai 8:bf593344668e 76 #define PUSHED_SW 0 // Active low
kenjiArai 1:7a48c475bbd2 77 #endif
kenjiArai 1:7a48c475bbd2 78
kenjiArai 9:6a64b0207f72 79 // Object ---------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 80 DigitalIn userSW(USER_BUTTON);
kenjiArai 0:0751c92c0f71 81 DigitalOut myled(LED1); // Indicate the sampling period
kenjiArai 0:0751c92c0f71 82 Serial pc(USBTX, USBRX);
kenjiArai 0:0751c92c0f71 83
kenjiArai 9:6a64b0207f72 84 // RAM ------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 85
kenjiArai 9:6a64b0207f72 86 // ROM / Constant data --------------------------------------------------------
kenjiArai 8:bf593344668e 87 char *const msg0 = "Is a time correct? If no, please hit any key. ";
kenjiArai 8:bf593344668e 88 char *const msg1 = "<Push USER SW then enter sleep mode> ";
kenjiArai 8:bf593344668e 89 char *const msg2 = "\r\nEnter Standby Mode, please push RESET to wake-up\r\n";
kenjiArai 0:0751c92c0f71 90
kenjiArai 9:6a64b0207f72 91 // Function prototypes --------------------------------------------------------
kenjiArai 9:6a64b0207f72 92 static void time_enter_mode(void);
kenjiArai 9:6a64b0207f72 93 static void chk_and_set_time(char *ptr);
kenjiArai 9:6a64b0207f72 94 static void goto_standby(void);
kenjiArai 9:6a64b0207f72 95 static int xatoi (char **str, unsigned long *res);
kenjiArai 9:6a64b0207f72 96 static void get_line (char *buff, int len);
kenjiArai 9:6a64b0207f72 97
kenjiArai 9:6a64b0207f72 98 //------------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 99 // Control Program
kenjiArai 9:6a64b0207f72 100 //------------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 101 int main()
kenjiArai 0:0751c92c0f71 102 {
kenjiArai 8:bf593344668e 103 char buf[64]; // data buffer for text
kenjiArai 0:0751c92c0f71 104 time_t seconds;
kenjiArai 4:a9cebfe4715f 105 uint8_t wait_counter = 0;
kenjiArai 0:0751c92c0f71 106
kenjiArai 6:5ada291037aa 107 wait(2.0);
kenjiArai 0:0751c92c0f71 108 pc.printf("\r\n\r\nTest Nucleo RTC Function\r\n");
kenjiArai 2:77ec44bf1fa5 109 myled = !myled;
kenjiArai 0:0751c92c0f71 110 // waiting for Initial screen
kenjiArai 0:0751c92c0f71 111 myled = 1;
kenjiArai 0:0751c92c0f71 112 wait(1.0);
kenjiArai 0:0751c92c0f71 113 myled = !myled;
kenjiArai 0:0751c92c0f71 114 wait(1.0);
kenjiArai 0:0751c92c0f71 115 while(1) {
kenjiArai 0:0751c92c0f71 116 seconds = time(NULL);
kenjiArai 8:bf593344668e 117 strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
kenjiArai 9:6a64b0207f72 118 pc.printf("[Time] %s", buf);
kenjiArai 8:bf593344668e 119 pc.printf(msg0);
kenjiArai 8:bf593344668e 120 pc.printf("%s\r", msg1);
kenjiArai 4:a9cebfe4715f 121 wait_counter = 0;
kenjiArai 2:77ec44bf1fa5 122 while (seconds == time(NULL)){
kenjiArai 0:0751c92c0f71 123 if (pc.readable() == 1){
kenjiArai 0:0751c92c0f71 124 buf[0] = pc.getc(); // dummy read
kenjiArai 0:0751c92c0f71 125 time_enter_mode();
kenjiArai 0:0751c92c0f71 126 }
kenjiArai 8:bf593344668e 127 if (userSW == PUSHED_SW){
kenjiArai 8:bf593344668e 128 pc.printf(msg2);
kenjiArai 2:77ec44bf1fa5 129 wait(1.0);
kenjiArai 2:77ec44bf1fa5 130 myled = 0;
kenjiArai 3:7b3edf54c706 131 goto_standby();
kenjiArai 2:77ec44bf1fa5 132 }
kenjiArai 4:a9cebfe4715f 133 wait(0.05);
kenjiArai 4:a9cebfe4715f 134 if (++wait_counter > (2000 / 50)){
kenjiArai 4:a9cebfe4715f 135 break;
kenjiArai 4:a9cebfe4715f 136 }
kenjiArai 0:0751c92c0f71 137 }
kenjiArai 8:bf593344668e 138 uint8_t n = strlen(msg0) + strlen(msg1);
kenjiArai 8:bf593344668e 139 for (uint8_t i = 0; i < n; i++){
kenjiArai 8:bf593344668e 140 pc.putc(' ');
kenjiArai 2:77ec44bf1fa5 141 }
kenjiArai 8:bf593344668e 142 pc.printf(" \r"); // Not use '\n'
kenjiArai 2:77ec44bf1fa5 143 myled = !myled;
kenjiArai 0:0751c92c0f71 144 }
kenjiArai 0:0751c92c0f71 145 }
kenjiArai 9:6a64b0207f72 146
kenjiArai 9:6a64b0207f72 147 void time_enter_mode(void)
kenjiArai 9:6a64b0207f72 148 {
kenjiArai 9:6a64b0207f72 149 char *ptr;
kenjiArai 9:6a64b0207f72 150 char linebuf[64];
kenjiArai 9:6a64b0207f72 151
kenjiArai 9:6a64b0207f72 152 pc.printf("\r\nSet time into RTC\r\n");
kenjiArai 9:6a64b0207f72 153 pc.printf(" e.g. >17 1 16 20 55 23 -> January 16th,'17, 20:55:23\r\n");
kenjiArai 9:6a64b0207f72 154 pc.printf(" If time is fine, just hit enter\r\n");
kenjiArai 9:6a64b0207f72 155 pc.putc('>');
kenjiArai 9:6a64b0207f72 156 ptr = linebuf;
kenjiArai 9:6a64b0207f72 157 get_line(ptr, sizeof(linebuf));
kenjiArai 9:6a64b0207f72 158 pc.printf("\r");
kenjiArai 9:6a64b0207f72 159 chk_and_set_time(ptr);
kenjiArai 9:6a64b0207f72 160 }
kenjiArai 9:6a64b0207f72 161
kenjiArai 9:6a64b0207f72 162 void goto_standby(void)
kenjiArai 9:6a64b0207f72 163 {
kenjiArai 9:6a64b0207f72 164 deepsleep(); // Not Standby Mode but Deep Sleep Mode
kenjiArai 9:6a64b0207f72 165 }
kenjiArai 9:6a64b0207f72 166
kenjiArai 9:6a64b0207f72 167 // Change string -> integer
kenjiArai 9:6a64b0207f72 168 int xatoi (char **str, unsigned long *res)
kenjiArai 9:6a64b0207f72 169 {
kenjiArai 9:6a64b0207f72 170 unsigned long val;
kenjiArai 9:6a64b0207f72 171 unsigned char c, radix, s = 0;
kenjiArai 9:6a64b0207f72 172
kenjiArai 9:6a64b0207f72 173 while ((c = **str) == ' ') (*str)++;
kenjiArai 9:6a64b0207f72 174 if (c == '-') {
kenjiArai 9:6a64b0207f72 175 s = 1;
kenjiArai 9:6a64b0207f72 176 c = *(++(*str));
kenjiArai 9:6a64b0207f72 177 }
kenjiArai 9:6a64b0207f72 178 if (c == '0') {
kenjiArai 9:6a64b0207f72 179 c = *(++(*str));
kenjiArai 9:6a64b0207f72 180 if (c <= ' ') {
kenjiArai 9:6a64b0207f72 181 *res = 0;
kenjiArai 9:6a64b0207f72 182 return 1;
kenjiArai 9:6a64b0207f72 183 }
kenjiArai 9:6a64b0207f72 184 if (c == 'x') {
kenjiArai 9:6a64b0207f72 185 radix = 16;
kenjiArai 9:6a64b0207f72 186 c = *(++(*str));
kenjiArai 9:6a64b0207f72 187 } else {
kenjiArai 9:6a64b0207f72 188 if (c == 'b') {
kenjiArai 9:6a64b0207f72 189 radix = 2;
kenjiArai 9:6a64b0207f72 190 c = *(++(*str));
kenjiArai 9:6a64b0207f72 191 } else {
kenjiArai 9:6a64b0207f72 192 if ((c >= '0')&&(c <= '9')) {
kenjiArai 9:6a64b0207f72 193 radix = 8;
kenjiArai 9:6a64b0207f72 194 } else {
kenjiArai 9:6a64b0207f72 195 return 0;
kenjiArai 9:6a64b0207f72 196 }
kenjiArai 9:6a64b0207f72 197 }
kenjiArai 9:6a64b0207f72 198 }
kenjiArai 9:6a64b0207f72 199 } else {
kenjiArai 9:6a64b0207f72 200 if ((c < '1')||(c > '9')) {
kenjiArai 9:6a64b0207f72 201 return 0;
kenjiArai 9:6a64b0207f72 202 }
kenjiArai 9:6a64b0207f72 203 radix = 10;
kenjiArai 9:6a64b0207f72 204 }
kenjiArai 9:6a64b0207f72 205 val = 0;
kenjiArai 9:6a64b0207f72 206 while (c > ' ') {
kenjiArai 9:6a64b0207f72 207 if (c >= 'a') c -= 0x20;
kenjiArai 9:6a64b0207f72 208 c -= '0';
kenjiArai 9:6a64b0207f72 209 if (c >= 17) {
kenjiArai 9:6a64b0207f72 210 c -= 7;
kenjiArai 9:6a64b0207f72 211 if (c <= 9) return 0;
kenjiArai 9:6a64b0207f72 212 }
kenjiArai 9:6a64b0207f72 213 if (c >= radix) return 0;
kenjiArai 9:6a64b0207f72 214 val = val * radix + c;
kenjiArai 9:6a64b0207f72 215 c = *(++(*str));
kenjiArai 9:6a64b0207f72 216 }
kenjiArai 9:6a64b0207f72 217 if (s) val = -val;
kenjiArai 9:6a64b0207f72 218 *res = val;
kenjiArai 9:6a64b0207f72 219 return 1;
kenjiArai 9:6a64b0207f72 220 }
kenjiArai 9:6a64b0207f72 221
kenjiArai 9:6a64b0207f72 222 // Get key input data
kenjiArai 9:6a64b0207f72 223 void get_line (char *buff, int len)
kenjiArai 9:6a64b0207f72 224 {
kenjiArai 9:6a64b0207f72 225 char c;
kenjiArai 9:6a64b0207f72 226 int idx = 0;
kenjiArai 9:6a64b0207f72 227
kenjiArai 9:6a64b0207f72 228 for (;;) {
kenjiArai 9:6a64b0207f72 229 c = pc.getc();
kenjiArai 9:6a64b0207f72 230 if (c == '\r') {
kenjiArai 9:6a64b0207f72 231 buff[idx++] = c;
kenjiArai 9:6a64b0207f72 232 break;
kenjiArai 9:6a64b0207f72 233 }
kenjiArai 9:6a64b0207f72 234 if ((c == '\b') && idx) {
kenjiArai 9:6a64b0207f72 235 idx--;
kenjiArai 9:6a64b0207f72 236 pc.putc(c);
kenjiArai 9:6a64b0207f72 237 pc.putc(' ');
kenjiArai 9:6a64b0207f72 238 pc.putc(c);
kenjiArai 9:6a64b0207f72 239 }
kenjiArai 9:6a64b0207f72 240 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 9:6a64b0207f72 241 buff[idx++] = c;
kenjiArai 9:6a64b0207f72 242 pc.putc(c);
kenjiArai 9:6a64b0207f72 243 }
kenjiArai 9:6a64b0207f72 244 }
kenjiArai 9:6a64b0207f72 245 buff[idx] = 0;
kenjiArai 9:6a64b0207f72 246 pc.putc('\n');
kenjiArai 9:6a64b0207f72 247 }
kenjiArai 9:6a64b0207f72 248
kenjiArai 9:6a64b0207f72 249 void chk_and_set_time(char *ptr)
kenjiArai 9:6a64b0207f72 250 {
kenjiArai 9:6a64b0207f72 251 unsigned long p1;
kenjiArai 9:6a64b0207f72 252 struct tm t;
kenjiArai 9:6a64b0207f72 253 time_t seconds;
kenjiArai 9:6a64b0207f72 254
kenjiArai 9:6a64b0207f72 255 if (xatoi(&ptr, &p1)) {
kenjiArai 9:6a64b0207f72 256 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 9:6a64b0207f72 257 pc.printf("Year:%d ",p1);
kenjiArai 9:6a64b0207f72 258 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 259 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 9:6a64b0207f72 260 pc.printf("Month:%d ",p1);
kenjiArai 9:6a64b0207f72 261 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 262 t.tm_mday = (uint8_t)p1;
kenjiArai 9:6a64b0207f72 263 pc.printf("Day:%d ",p1);
kenjiArai 9:6a64b0207f72 264 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 265 t.tm_hour = (uint8_t)p1;
kenjiArai 9:6a64b0207f72 266 pc.printf("Hour:%d ",p1);
kenjiArai 9:6a64b0207f72 267 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 268 t.tm_min = (uint8_t)p1;
kenjiArai 9:6a64b0207f72 269 pc.printf("Min:%d ",p1);
kenjiArai 9:6a64b0207f72 270 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 271 t.tm_sec = (uint8_t)p1;
kenjiArai 9:6a64b0207f72 272 pc.printf("Sec: %d \r\n",p1);
kenjiArai 9:6a64b0207f72 273 } else {
kenjiArai 9:6a64b0207f72 274 return;
kenjiArai 9:6a64b0207f72 275 }
kenjiArai 9:6a64b0207f72 276 seconds = mktime(&t);
kenjiArai 9:6a64b0207f72 277 set_time(seconds);
kenjiArai 9:6a64b0207f72 278 // Show Time with several example
kenjiArai 9:6a64b0207f72 279 // ex.1
kenjiArai 9:6a64b0207f72 280 pc.printf(
kenjiArai 9:6a64b0207f72 281 "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
kenjiArai 9:6a64b0207f72 282 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec
kenjiArai 9:6a64b0207f72 283 );
kenjiArai 9:6a64b0207f72 284 #if 0
kenjiArai 9:6a64b0207f72 285 time_t seconds;
kenjiArai 9:6a64b0207f72 286 char buf[40];
kenjiArai 9:6a64b0207f72 287
kenjiArai 9:6a64b0207f72 288 seconds = mktime(&t);
kenjiArai 9:6a64b0207f72 289 // ex.2
kenjiArai 9:6a64b0207f72 290 strftime(buf, 40, "%x %X", localtime(&seconds));
kenjiArai 9:6a64b0207f72 291 pc.printf("Date: %s\r\n", buf);
kenjiArai 9:6a64b0207f72 292 // ex.3
kenjiArai 9:6a64b0207f72 293 strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 9:6a64b0207f72 294 pc.printf("Date: %s\r\n", buf);
kenjiArai 9:6a64b0207f72 295 // ex.4
kenjiArai 9:6a64b0207f72 296 strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
kenjiArai 9:6a64b0207f72 297 pc.printf("Date: %s\r\n", buf);
kenjiArai 9:6a64b0207f72 298 #endif
kenjiArai 9:6a64b0207f72 299 }