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 Aug 01 07:26:13 2020 +0000
Revision:
11:2e514d955a2b
Parent:
10:806cfec92eb6
Child:
12:8cb1f89541d1
changed RawSerial to BufferedSerial on mbed-os-6.2.0(mbed_version.h=set correct version)

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 10:806cfec92eb6 5 * Copyright (c) 2015,'16,'17,'20 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 11:2e514d955a2b 9 * Revised: August 1st, 2020
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 11:2e514d955a2b 27 not support on Mbed-os6.2.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 11:2e514d955a2b 32 not support on Mbed-os6.2.0 Nucleo-L053R8
kenjiArai 0:0751c92c0f71 33
kenjiArai 9:6a64b0207f72 34 < Back-up circuit >
kenjiArai 9:6a64b0207f72 35 CN7 VIN <- SBD <- 330 Ohm <- CR2032 + - -> CN7 GND
kenjiArai 9:6a64b0207f72 36 Remove SB45 Zero Ohm resistor
kenjiArai 11:2e514d955a2b 37
kenjiArai 10:806cfec92eb6 38 ----- PLEASE REFER FOLLOWS ----
kenjiArai 10:806cfec92eb6 39 https://os.mbed.com/users/kenjiArai/notebook/
kenjiArai 10:806cfec92eb6 40 nucleo-series-rtc-control-under-power-onoff-and-re/
kenjiArai 9:6a64b0207f72 41 */
kenjiArai 8:bf593344668e 42
kenjiArai 9:6a64b0207f72 43 // Include --------------------------------------------------------------------
kenjiArai 9:6a64b0207f72 44 #include "mbed.h"
kenjiArai 9:6a64b0207f72 45
kenjiArai 9:6a64b0207f72 46 // Definition -----------------------------------------------------------------
kenjiArai 8:bf593344668e 47 #if (defined(TARGET_STM32F746NG) || defined(TARGET_STM32F746ZG))
kenjiArai 8:bf593344668e 48 #define PUSHED_SW 1 // Active high
kenjiArai 8:bf593344668e 49 #else
kenjiArai 8:bf593344668e 50 #define PUSHED_SW 0 // Active low
kenjiArai 1:7a48c475bbd2 51 #endif
kenjiArai 1:7a48c475bbd2 52
kenjiArai 10:806cfec92eb6 53 #define LONGLONGTIME 2147483647
kenjiArai 10:806cfec92eb6 54
kenjiArai 9:6a64b0207f72 55 // Object ---------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 56 DigitalIn userSW(USER_BUTTON);
kenjiArai 10:806cfec92eb6 57 DigitalOut myled(LED1); // Indicate the sampling period
kenjiArai 11:2e514d955a2b 58 // Create a BufferedSerial object to be used by the system I/O retarget code
kenjiArai 11:2e514d955a2b 59 static BufferedSerial pc(USBTX, USBRX, 9600);
kenjiArai 0:0751c92c0f71 60
kenjiArai 9:6a64b0207f72 61 // RAM ------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 62
kenjiArai 9:6a64b0207f72 63 // ROM / Constant data --------------------------------------------------------
kenjiArai 10:806cfec92eb6 64 const char *const msg0 = "Is a time correct? If no, please hit any key. ";
kenjiArai 10:806cfec92eb6 65 const char *const msg1 = "<Push USER SW then enter the Standby mode> ";
kenjiArai 0:0751c92c0f71 66
kenjiArai 9:6a64b0207f72 67 // Function prototypes --------------------------------------------------------
kenjiArai 11:2e514d955a2b 68 FileHandle *mbed::mbed_override_console(int fd);
kenjiArai 9:6a64b0207f72 69 static void time_enter_mode(void);
kenjiArai 9:6a64b0207f72 70 static void chk_and_set_time(char *ptr);
kenjiArai 10:806cfec92eb6 71 static int32_t xatoi (char **str, int32_t *res);
kenjiArai 10:806cfec92eb6 72 static void get_line (char *buff, int32_t len);
kenjiArai 10:806cfec92eb6 73 static void usr_sw_irq(void);
kenjiArai 10:806cfec92eb6 74 extern void print_revision(void);
kenjiArai 9:6a64b0207f72 75
kenjiArai 9:6a64b0207f72 76 //------------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 77 // Control Program
kenjiArai 9:6a64b0207f72 78 //------------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 79 int main()
kenjiArai 0:0751c92c0f71 80 {
kenjiArai 11:2e514d955a2b 81 char buf[64];
kenjiArai 0:0751c92c0f71 82 time_t seconds;
kenjiArai 4:a9cebfe4715f 83 uint8_t wait_counter = 0;
kenjiArai 0:0751c92c0f71 84
kenjiArai 11:2e514d955a2b 85 puts("\r\n\r\nTest Nucleo RTC Function.");
kenjiArai 10:806cfec92eb6 86 print_revision();
kenjiArai 2:77ec44bf1fa5 87 myled = !myled;
kenjiArai 10:806cfec92eb6 88 thread_sleep_for(500);
kenjiArai 0:0751c92c0f71 89 myled = !myled;
kenjiArai 10:806cfec92eb6 90 thread_sleep_for(500);
kenjiArai 10:806cfec92eb6 91 while(true) {
kenjiArai 0:0751c92c0f71 92 seconds = time(NULL);
kenjiArai 8:bf593344668e 93 strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
kenjiArai 11:2e514d955a2b 94 printf("[Time] %s", buf);
kenjiArai 11:2e514d955a2b 95 printf("%s", msg0);
kenjiArai 11:2e514d955a2b 96 printf("%s", msg1);
kenjiArai 11:2e514d955a2b 97 puts("\r");
kenjiArai 4:a9cebfe4715f 98 wait_counter = 0;
kenjiArai 11:2e514d955a2b 99 while (seconds == time(NULL)) {
kenjiArai 11:2e514d955a2b 100 if (pc.readable() == 1) {
kenjiArai 11:2e514d955a2b 101 pc.read(buf,1); // dummy read
kenjiArai 0:0751c92c0f71 102 time_enter_mode();
kenjiArai 0:0751c92c0f71 103 }
kenjiArai 11:2e514d955a2b 104 if (userSW == PUSHED_SW) { // goto sleep
kenjiArai 11:2e514d955a2b 105 while (userSW == PUSHED_SW) {
kenjiArai 10:806cfec92eb6 106 thread_sleep_for(10);
kenjiArai 10:806cfec92eb6 107 }
kenjiArai 10:806cfec92eb6 108 thread_sleep_for(10);
kenjiArai 11:2e514d955a2b 109 puts("Entered the standby mode. ");
kenjiArai 11:2e514d955a2b 110 puts("Please push USER BUTTON to wake-up(Reset).");
kenjiArai 2:77ec44bf1fa5 111 myled = 0;
kenjiArai 10:806cfec92eb6 112 InterruptIn usr_sw(USER_BUTTON);
kenjiArai 10:806cfec92eb6 113 thread_sleep_for(1000);
kenjiArai 10:806cfec92eb6 114 DigitalIn dmy0(LED1);
kenjiArai 10:806cfec92eb6 115 DigitalIn dmy1(USBTX);
kenjiArai 10:806cfec92eb6 116 DigitalIn dmy2(USBRX);
kenjiArai 10:806cfec92eb6 117 usr_sw.fall(&usr_sw_irq);
kenjiArai 10:806cfec92eb6 118 thread_sleep_for(LONGLONGTIME);
kenjiArai 2:77ec44bf1fa5 119 }
kenjiArai 10:806cfec92eb6 120 thread_sleep_for(50);
kenjiArai 11:2e514d955a2b 121 if (++wait_counter > (2000 / 50)) {
kenjiArai 4:a9cebfe4715f 122 break;
kenjiArai 4:a9cebfe4715f 123 }
kenjiArai 0:0751c92c0f71 124 }
kenjiArai 11:2e514d955a2b 125 // delete previous strings
kenjiArai 11:2e514d955a2b 126 printf("\033[2A");
kenjiArai 11:2e514d955a2b 127 puts(""); // null
kenjiArai 8:bf593344668e 128 uint8_t n = strlen(msg0) + strlen(msg1);
kenjiArai 11:2e514d955a2b 129 memset(buf, ' ', 64);
kenjiArai 11:2e514d955a2b 130 if (n > 64) {
kenjiArai 11:2e514d955a2b 131 n -= 64;
kenjiArai 11:2e514d955a2b 132 pc.write(buf, 64);
kenjiArai 2:77ec44bf1fa5 133 }
kenjiArai 11:2e514d955a2b 134 if (n > 64) {
kenjiArai 11:2e514d955a2b 135 pc.write(buf, 64);
kenjiArai 11:2e514d955a2b 136 } else {
kenjiArai 11:2e514d955a2b 137 pc.write(buf, n);
kenjiArai 11:2e514d955a2b 138 }
kenjiArai 11:2e514d955a2b 139 printf("\033[G");
kenjiArai 2:77ec44bf1fa5 140 myled = !myled;
kenjiArai 0:0751c92c0f71 141 }
kenjiArai 0:0751c92c0f71 142 }
kenjiArai 9:6a64b0207f72 143
kenjiArai 11:2e514d955a2b 144 // the system I/O retarget
kenjiArai 11:2e514d955a2b 145 FileHandle *mbed::mbed_override_console(int fd)
kenjiArai 11:2e514d955a2b 146 {
kenjiArai 11:2e514d955a2b 147 return &pc;
kenjiArai 11:2e514d955a2b 148 }
kenjiArai 11:2e514d955a2b 149
kenjiArai 10:806cfec92eb6 150 // Interrupt for wake up
kenjiArai 10:806cfec92eb6 151 static void usr_sw_irq(void)
kenjiArai 10:806cfec92eb6 152 {
kenjiArai 10:806cfec92eb6 153 system_reset(); // restart from RESET condition
kenjiArai 10:806cfec92eb6 154 }
kenjiArai 10:806cfec92eb6 155
kenjiArai 10:806cfec92eb6 156 // Time adjustment
kenjiArai 10:806cfec92eb6 157 static void time_enter_mode(void)
kenjiArai 9:6a64b0207f72 158 {
kenjiArai 9:6a64b0207f72 159 char *ptr;
kenjiArai 9:6a64b0207f72 160 char linebuf[64];
kenjiArai 9:6a64b0207f72 161
kenjiArai 11:2e514d955a2b 162 puts("Set time into RTC.");
kenjiArai 11:2e514d955a2b 163 puts(" e.g. >20 8 1 12 34 56 -> August 01,'20, 12:34:56");
kenjiArai 11:2e514d955a2b 164 puts(" If time is fine, just hit enter key.");
kenjiArai 11:2e514d955a2b 165 linebuf[0] = '>';
kenjiArai 11:2e514d955a2b 166 pc.write(linebuf, 1);
kenjiArai 9:6a64b0207f72 167 ptr = linebuf;
kenjiArai 9:6a64b0207f72 168 get_line(ptr, sizeof(linebuf));
kenjiArai 11:2e514d955a2b 169 puts("\r");
kenjiArai 9:6a64b0207f72 170 chk_and_set_time(ptr);
kenjiArai 9:6a64b0207f72 171 }
kenjiArai 9:6a64b0207f72 172
kenjiArai 10:806cfec92eb6 173 // Change string -> integer
kenjiArai 10:806cfec92eb6 174 static int32_t xatoi(char **str, int32_t *res)
kenjiArai 9:6a64b0207f72 175 {
kenjiArai 10:806cfec92eb6 176 uint32_t val;
kenjiArai 10:806cfec92eb6 177 uint8_t c, radix, s = 0;
kenjiArai 9:6a64b0207f72 178
kenjiArai 9:6a64b0207f72 179 while ((c = **str) == ' ') (*str)++;
kenjiArai 9:6a64b0207f72 180 if (c == '-') {
kenjiArai 9:6a64b0207f72 181 s = 1;
kenjiArai 9:6a64b0207f72 182 c = *(++(*str));
kenjiArai 9:6a64b0207f72 183 }
kenjiArai 9:6a64b0207f72 184 if (c == '0') {
kenjiArai 9:6a64b0207f72 185 c = *(++(*str));
kenjiArai 9:6a64b0207f72 186 if (c <= ' ') {
kenjiArai 9:6a64b0207f72 187 *res = 0;
kenjiArai 9:6a64b0207f72 188 return 1;
kenjiArai 9:6a64b0207f72 189 }
kenjiArai 9:6a64b0207f72 190 if (c == 'x') {
kenjiArai 9:6a64b0207f72 191 radix = 16;
kenjiArai 9:6a64b0207f72 192 c = *(++(*str));
kenjiArai 9:6a64b0207f72 193 } else {
kenjiArai 9:6a64b0207f72 194 if (c == 'b') {
kenjiArai 9:6a64b0207f72 195 radix = 2;
kenjiArai 9:6a64b0207f72 196 c = *(++(*str));
kenjiArai 9:6a64b0207f72 197 } else {
kenjiArai 9:6a64b0207f72 198 if ((c >= '0')&&(c <= '9')) {
kenjiArai 9:6a64b0207f72 199 radix = 8;
kenjiArai 9:6a64b0207f72 200 } else {
kenjiArai 9:6a64b0207f72 201 return 0;
kenjiArai 9:6a64b0207f72 202 }
kenjiArai 9:6a64b0207f72 203 }
kenjiArai 9:6a64b0207f72 204 }
kenjiArai 9:6a64b0207f72 205 } else {
kenjiArai 9:6a64b0207f72 206 if ((c < '1')||(c > '9')) {
kenjiArai 9:6a64b0207f72 207 return 0;
kenjiArai 9:6a64b0207f72 208 }
kenjiArai 9:6a64b0207f72 209 radix = 10;
kenjiArai 9:6a64b0207f72 210 }
kenjiArai 9:6a64b0207f72 211 val = 0;
kenjiArai 9:6a64b0207f72 212 while (c > ' ') {
kenjiArai 9:6a64b0207f72 213 if (c >= 'a') c -= 0x20;
kenjiArai 9:6a64b0207f72 214 c -= '0';
kenjiArai 9:6a64b0207f72 215 if (c >= 17) {
kenjiArai 9:6a64b0207f72 216 c -= 7;
kenjiArai 9:6a64b0207f72 217 if (c <= 9) return 0;
kenjiArai 9:6a64b0207f72 218 }
kenjiArai 9:6a64b0207f72 219 if (c >= radix) return 0;
kenjiArai 9:6a64b0207f72 220 val = val * radix + c;
kenjiArai 9:6a64b0207f72 221 c = *(++(*str));
kenjiArai 9:6a64b0207f72 222 }
kenjiArai 9:6a64b0207f72 223 if (s) val = -val;
kenjiArai 9:6a64b0207f72 224 *res = val;
kenjiArai 9:6a64b0207f72 225 return 1;
kenjiArai 9:6a64b0207f72 226 }
kenjiArai 9:6a64b0207f72 227
kenjiArai 9:6a64b0207f72 228 // Get key input data
kenjiArai 10:806cfec92eb6 229 static void get_line(char *buff, int32_t len)
kenjiArai 9:6a64b0207f72 230 {
kenjiArai 9:6a64b0207f72 231 char c;
kenjiArai 11:2e514d955a2b 232 char bf[8];
kenjiArai 10:806cfec92eb6 233 int32_t idx = 0;
kenjiArai 9:6a64b0207f72 234
kenjiArai 9:6a64b0207f72 235 for (;;) {
kenjiArai 11:2e514d955a2b 236 pc.read(bf, 1);
kenjiArai 11:2e514d955a2b 237 c = bf[0];
kenjiArai 11:2e514d955a2b 238 //printf("0x%x \r\n", c);
kenjiArai 9:6a64b0207f72 239 if (c == '\r') {
kenjiArai 9:6a64b0207f72 240 buff[idx++] = c;
kenjiArai 9:6a64b0207f72 241 break;
kenjiArai 9:6a64b0207f72 242 }
kenjiArai 9:6a64b0207f72 243 if ((c == '\b') && idx) {
kenjiArai 9:6a64b0207f72 244 idx--;
kenjiArai 11:2e514d955a2b 245 const char bf_bs[] =
kenjiArai 11:2e514d955a2b 246 {0x1b, '[', '1', 'D', ' ', 0x1b, '[', '1', 'D'};
kenjiArai 11:2e514d955a2b 247 pc.write(bf_bs, 9);
kenjiArai 9:6a64b0207f72 248 }
kenjiArai 9:6a64b0207f72 249 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 9:6a64b0207f72 250 buff[idx++] = c;
kenjiArai 11:2e514d955a2b 251 pc.write(bf, 1);
kenjiArai 9:6a64b0207f72 252 }
kenjiArai 9:6a64b0207f72 253 }
kenjiArai 9:6a64b0207f72 254 buff[idx] = 0;
kenjiArai 11:2e514d955a2b 255 bf[0] = '\n';
kenjiArai 11:2e514d955a2b 256 pc.write(bf, 1);
kenjiArai 9:6a64b0207f72 257 }
kenjiArai 9:6a64b0207f72 258
kenjiArai 10:806cfec92eb6 259 // Check key input strings and set time
kenjiArai 10:806cfec92eb6 260 static void chk_and_set_time(char *ptr)
kenjiArai 9:6a64b0207f72 261 {
kenjiArai 10:806cfec92eb6 262 int32_t p1;
kenjiArai 9:6a64b0207f72 263 struct tm t;
kenjiArai 9:6a64b0207f72 264 time_t seconds;
kenjiArai 9:6a64b0207f72 265
kenjiArai 9:6a64b0207f72 266 if (xatoi(&ptr, &p1)) {
kenjiArai 9:6a64b0207f72 267 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 11:2e514d955a2b 268 printf("Year:%d ",p1);
kenjiArai 9:6a64b0207f72 269 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 270 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 11:2e514d955a2b 271 printf("Month:%d ",p1);
kenjiArai 9:6a64b0207f72 272 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 273 t.tm_mday = (uint8_t)p1;
kenjiArai 11:2e514d955a2b 274 printf("Day:%d ",p1);
kenjiArai 9:6a64b0207f72 275 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 276 t.tm_hour = (uint8_t)p1;
kenjiArai 11:2e514d955a2b 277 printf("Hour:%d ",p1);
kenjiArai 9:6a64b0207f72 278 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 279 t.tm_min = (uint8_t)p1;
kenjiArai 11:2e514d955a2b 280 printf("Min:%d ",p1);
kenjiArai 9:6a64b0207f72 281 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 282 t.tm_sec = (uint8_t)p1;
kenjiArai 11:2e514d955a2b 283 printf("Sec: %d \r\n",p1);
kenjiArai 9:6a64b0207f72 284 } else {
kenjiArai 9:6a64b0207f72 285 return;
kenjiArai 9:6a64b0207f72 286 }
kenjiArai 9:6a64b0207f72 287 seconds = mktime(&t);
kenjiArai 9:6a64b0207f72 288 set_time(seconds);
kenjiArai 11:2e514d955a2b 289 // Show Time with several example
kenjiArai 9:6a64b0207f72 290 // ex.1
kenjiArai 11:2e514d955a2b 291 printf(
kenjiArai 9:6a64b0207f72 292 "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
kenjiArai 9:6a64b0207f72 293 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec
kenjiArai 9:6a64b0207f72 294 );
kenjiArai 11:2e514d955a2b 295 char buf[64];
kenjiArai 9:6a64b0207f72 296 // ex.2
kenjiArai 9:6a64b0207f72 297 strftime(buf, 40, "%x %X", localtime(&seconds));
kenjiArai 11:2e514d955a2b 298 printf("Date: %s\r\n", buf);
kenjiArai 9:6a64b0207f72 299 // ex.3
kenjiArai 9:6a64b0207f72 300 strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 11:2e514d955a2b 301 printf("Date: %s\r\n", buf);
kenjiArai 9:6a64b0207f72 302 // ex.4
kenjiArai 9:6a64b0207f72 303 strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
kenjiArai 11:2e514d955a2b 304 printf("Date: %s\r\n", buf);
kenjiArai 9:6a64b0207f72 305 }