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 Jul 18 22:46:14 2020 +0000
Revision:
10:806cfec92eb6
Parent:
9:6a64b0207f72
Child:
11:2e514d955a2b
run on mbed-os6.2.0 (mbed_version.h = os5.15.4)

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 10:806cfec92eb6 9 * Revised: July 19th, 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 9:6a64b0207f72 27 Nucleo-F334R8 / ok / ok / ok (need following Back-up Circuit)
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 9:6a64b0207f72 32 Nucleo-L053R8 / ok / ok / no check (Need additional hardware)
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 10:806cfec92eb6 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 10:806cfec92eb6 58 static RawSerial pc(USBTX, USBRX);
kenjiArai 0:0751c92c0f71 59
kenjiArai 9:6a64b0207f72 60 // RAM ------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 61
kenjiArai 9:6a64b0207f72 62 // ROM / Constant data --------------------------------------------------------
kenjiArai 10:806cfec92eb6 63 const char *const msg0 = "Is a time correct? If no, please hit any key. ";
kenjiArai 10:806cfec92eb6 64 const char *const msg1 = "<Push USER SW then enter the Standby mode> ";
kenjiArai 10:806cfec92eb6 65 const char *const msg2 = "\r\nEntered the standby mode. ";
kenjiArai 10:806cfec92eb6 66 const char *const msg3 = "Please push USER BUTTON to wake-up(Reset).\r\n";
kenjiArai 0:0751c92c0f71 67
kenjiArai 9:6a64b0207f72 68 // Function prototypes --------------------------------------------------------
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 10:806cfec92eb6 81 char buf[64]; // data buffer for text
kenjiArai 0:0751c92c0f71 82 time_t seconds;
kenjiArai 4:a9cebfe4715f 83 uint8_t wait_counter = 0;
kenjiArai 0:0751c92c0f71 84
kenjiArai 0:0751c92c0f71 85 pc.printf("\r\n\r\nTest Nucleo RTC Function\r\n");
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 9:6a64b0207f72 94 pc.printf("[Time] %s", buf);
kenjiArai 10:806cfec92eb6 95 pc.printf("%s", msg0);
kenjiArai 8:bf593344668e 96 pc.printf("%s\r", msg1);
kenjiArai 4:a9cebfe4715f 97 wait_counter = 0;
kenjiArai 2:77ec44bf1fa5 98 while (seconds == time(NULL)){
kenjiArai 0:0751c92c0f71 99 if (pc.readable() == 1){
kenjiArai 0:0751c92c0f71 100 buf[0] = pc.getc(); // dummy read
kenjiArai 0:0751c92c0f71 101 time_enter_mode();
kenjiArai 0:0751c92c0f71 102 }
kenjiArai 10:806cfec92eb6 103 if (userSW == PUSHED_SW){ // goto sleep
kenjiArai 10:806cfec92eb6 104 while (userSW == PUSHED_SW){
kenjiArai 10:806cfec92eb6 105 thread_sleep_for(10);
kenjiArai 10:806cfec92eb6 106 }
kenjiArai 10:806cfec92eb6 107 thread_sleep_for(10);
kenjiArai 10:806cfec92eb6 108 pc.printf("%s%s", msg2, msg3);
kenjiArai 2:77ec44bf1fa5 109 myled = 0;
kenjiArai 10:806cfec92eb6 110 InterruptIn usr_sw(USER_BUTTON);
kenjiArai 10:806cfec92eb6 111 thread_sleep_for(1000);
kenjiArai 10:806cfec92eb6 112 DigitalIn dmy0(LED1);
kenjiArai 10:806cfec92eb6 113 DigitalIn dmy1(USBTX);
kenjiArai 10:806cfec92eb6 114 DigitalIn dmy2(USBRX);
kenjiArai 10:806cfec92eb6 115 usr_sw.fall(&usr_sw_irq);
kenjiArai 10:806cfec92eb6 116 thread_sleep_for(LONGLONGTIME);
kenjiArai 2:77ec44bf1fa5 117 }
kenjiArai 10:806cfec92eb6 118 thread_sleep_for(50);
kenjiArai 4:a9cebfe4715f 119 if (++wait_counter > (2000 / 50)){
kenjiArai 4:a9cebfe4715f 120 break;
kenjiArai 4:a9cebfe4715f 121 }
kenjiArai 0:0751c92c0f71 122 }
kenjiArai 8:bf593344668e 123 uint8_t n = strlen(msg0) + strlen(msg1);
kenjiArai 8:bf593344668e 124 for (uint8_t i = 0; i < n; i++){
kenjiArai 8:bf593344668e 125 pc.putc(' ');
kenjiArai 2:77ec44bf1fa5 126 }
kenjiArai 8:bf593344668e 127 pc.printf(" \r"); // Not use '\n'
kenjiArai 2:77ec44bf1fa5 128 myled = !myled;
kenjiArai 0:0751c92c0f71 129 }
kenjiArai 0:0751c92c0f71 130 }
kenjiArai 9:6a64b0207f72 131
kenjiArai 10:806cfec92eb6 132 // Interrupt for wake up
kenjiArai 10:806cfec92eb6 133 static void usr_sw_irq(void)
kenjiArai 10:806cfec92eb6 134 {
kenjiArai 10:806cfec92eb6 135 system_reset(); // restart from RESET condition
kenjiArai 10:806cfec92eb6 136 }
kenjiArai 10:806cfec92eb6 137
kenjiArai 10:806cfec92eb6 138 // Time adjustment
kenjiArai 10:806cfec92eb6 139 static void time_enter_mode(void)
kenjiArai 9:6a64b0207f72 140 {
kenjiArai 9:6a64b0207f72 141 char *ptr;
kenjiArai 9:6a64b0207f72 142 char linebuf[64];
kenjiArai 9:6a64b0207f72 143
kenjiArai 9:6a64b0207f72 144 pc.printf("\r\nSet time into RTC\r\n");
kenjiArai 10:806cfec92eb6 145 pc.printf(" e.g. >20 7 7 20 21 22 -> July 7,'20, 20:21:22\r\n");
kenjiArai 10:806cfec92eb6 146 pc.printf(" If time is fine, just hit enter key\r\n");
kenjiArai 9:6a64b0207f72 147 pc.putc('>');
kenjiArai 9:6a64b0207f72 148 ptr = linebuf;
kenjiArai 9:6a64b0207f72 149 get_line(ptr, sizeof(linebuf));
kenjiArai 9:6a64b0207f72 150 pc.printf("\r");
kenjiArai 9:6a64b0207f72 151 chk_and_set_time(ptr);
kenjiArai 9:6a64b0207f72 152 }
kenjiArai 9:6a64b0207f72 153
kenjiArai 10:806cfec92eb6 154 // Change string -> integer
kenjiArai 10:806cfec92eb6 155 static int32_t xatoi(char **str, int32_t *res)
kenjiArai 9:6a64b0207f72 156 {
kenjiArai 10:806cfec92eb6 157 uint32_t val;
kenjiArai 10:806cfec92eb6 158 uint8_t c, radix, s = 0;
kenjiArai 9:6a64b0207f72 159
kenjiArai 9:6a64b0207f72 160 while ((c = **str) == ' ') (*str)++;
kenjiArai 9:6a64b0207f72 161 if (c == '-') {
kenjiArai 9:6a64b0207f72 162 s = 1;
kenjiArai 9:6a64b0207f72 163 c = *(++(*str));
kenjiArai 9:6a64b0207f72 164 }
kenjiArai 9:6a64b0207f72 165 if (c == '0') {
kenjiArai 9:6a64b0207f72 166 c = *(++(*str));
kenjiArai 9:6a64b0207f72 167 if (c <= ' ') {
kenjiArai 9:6a64b0207f72 168 *res = 0;
kenjiArai 9:6a64b0207f72 169 return 1;
kenjiArai 9:6a64b0207f72 170 }
kenjiArai 9:6a64b0207f72 171 if (c == 'x') {
kenjiArai 9:6a64b0207f72 172 radix = 16;
kenjiArai 9:6a64b0207f72 173 c = *(++(*str));
kenjiArai 9:6a64b0207f72 174 } else {
kenjiArai 9:6a64b0207f72 175 if (c == 'b') {
kenjiArai 9:6a64b0207f72 176 radix = 2;
kenjiArai 9:6a64b0207f72 177 c = *(++(*str));
kenjiArai 9:6a64b0207f72 178 } else {
kenjiArai 9:6a64b0207f72 179 if ((c >= '0')&&(c <= '9')) {
kenjiArai 9:6a64b0207f72 180 radix = 8;
kenjiArai 9:6a64b0207f72 181 } else {
kenjiArai 9:6a64b0207f72 182 return 0;
kenjiArai 9:6a64b0207f72 183 }
kenjiArai 9:6a64b0207f72 184 }
kenjiArai 9:6a64b0207f72 185 }
kenjiArai 9:6a64b0207f72 186 } else {
kenjiArai 9:6a64b0207f72 187 if ((c < '1')||(c > '9')) {
kenjiArai 9:6a64b0207f72 188 return 0;
kenjiArai 9:6a64b0207f72 189 }
kenjiArai 9:6a64b0207f72 190 radix = 10;
kenjiArai 9:6a64b0207f72 191 }
kenjiArai 9:6a64b0207f72 192 val = 0;
kenjiArai 9:6a64b0207f72 193 while (c > ' ') {
kenjiArai 9:6a64b0207f72 194 if (c >= 'a') c -= 0x20;
kenjiArai 9:6a64b0207f72 195 c -= '0';
kenjiArai 9:6a64b0207f72 196 if (c >= 17) {
kenjiArai 9:6a64b0207f72 197 c -= 7;
kenjiArai 9:6a64b0207f72 198 if (c <= 9) return 0;
kenjiArai 9:6a64b0207f72 199 }
kenjiArai 9:6a64b0207f72 200 if (c >= radix) return 0;
kenjiArai 9:6a64b0207f72 201 val = val * radix + c;
kenjiArai 9:6a64b0207f72 202 c = *(++(*str));
kenjiArai 9:6a64b0207f72 203 }
kenjiArai 9:6a64b0207f72 204 if (s) val = -val;
kenjiArai 9:6a64b0207f72 205 *res = val;
kenjiArai 9:6a64b0207f72 206 return 1;
kenjiArai 9:6a64b0207f72 207 }
kenjiArai 9:6a64b0207f72 208
kenjiArai 9:6a64b0207f72 209 // Get key input data
kenjiArai 10:806cfec92eb6 210 static void get_line(char *buff, int32_t len)
kenjiArai 9:6a64b0207f72 211 {
kenjiArai 9:6a64b0207f72 212 char c;
kenjiArai 10:806cfec92eb6 213 int32_t idx = 0;
kenjiArai 9:6a64b0207f72 214
kenjiArai 9:6a64b0207f72 215 for (;;) {
kenjiArai 9:6a64b0207f72 216 c = pc.getc();
kenjiArai 9:6a64b0207f72 217 if (c == '\r') {
kenjiArai 9:6a64b0207f72 218 buff[idx++] = c;
kenjiArai 9:6a64b0207f72 219 break;
kenjiArai 9:6a64b0207f72 220 }
kenjiArai 9:6a64b0207f72 221 if ((c == '\b') && idx) {
kenjiArai 9:6a64b0207f72 222 idx--;
kenjiArai 9:6a64b0207f72 223 pc.putc(c);
kenjiArai 9:6a64b0207f72 224 pc.putc(' ');
kenjiArai 9:6a64b0207f72 225 pc.putc(c);
kenjiArai 9:6a64b0207f72 226 }
kenjiArai 9:6a64b0207f72 227 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 9:6a64b0207f72 228 buff[idx++] = c;
kenjiArai 9:6a64b0207f72 229 pc.putc(c);
kenjiArai 9:6a64b0207f72 230 }
kenjiArai 9:6a64b0207f72 231 }
kenjiArai 9:6a64b0207f72 232 buff[idx] = 0;
kenjiArai 9:6a64b0207f72 233 pc.putc('\n');
kenjiArai 9:6a64b0207f72 234 }
kenjiArai 9:6a64b0207f72 235
kenjiArai 10:806cfec92eb6 236 // Check key input strings and set time
kenjiArai 10:806cfec92eb6 237 static void chk_and_set_time(char *ptr)
kenjiArai 9:6a64b0207f72 238 {
kenjiArai 10:806cfec92eb6 239 int32_t p1;
kenjiArai 9:6a64b0207f72 240 struct tm t;
kenjiArai 9:6a64b0207f72 241 time_t seconds;
kenjiArai 9:6a64b0207f72 242
kenjiArai 9:6a64b0207f72 243 if (xatoi(&ptr, &p1)) {
kenjiArai 9:6a64b0207f72 244 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 9:6a64b0207f72 245 pc.printf("Year:%d ",p1);
kenjiArai 9:6a64b0207f72 246 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 247 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 9:6a64b0207f72 248 pc.printf("Month:%d ",p1);
kenjiArai 9:6a64b0207f72 249 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 250 t.tm_mday = (uint8_t)p1;
kenjiArai 9:6a64b0207f72 251 pc.printf("Day:%d ",p1);
kenjiArai 9:6a64b0207f72 252 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 253 t.tm_hour = (uint8_t)p1;
kenjiArai 9:6a64b0207f72 254 pc.printf("Hour:%d ",p1);
kenjiArai 9:6a64b0207f72 255 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 256 t.tm_min = (uint8_t)p1;
kenjiArai 9:6a64b0207f72 257 pc.printf("Min:%d ",p1);
kenjiArai 9:6a64b0207f72 258 xatoi( &ptr, &p1 );
kenjiArai 9:6a64b0207f72 259 t.tm_sec = (uint8_t)p1;
kenjiArai 9:6a64b0207f72 260 pc.printf("Sec: %d \r\n",p1);
kenjiArai 9:6a64b0207f72 261 } else {
kenjiArai 9:6a64b0207f72 262 return;
kenjiArai 9:6a64b0207f72 263 }
kenjiArai 9:6a64b0207f72 264 seconds = mktime(&t);
kenjiArai 9:6a64b0207f72 265 set_time(seconds);
kenjiArai 9:6a64b0207f72 266 // ex.1
kenjiArai 9:6a64b0207f72 267 pc.printf(
kenjiArai 9:6a64b0207f72 268 "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
kenjiArai 9:6a64b0207f72 269 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec
kenjiArai 9:6a64b0207f72 270 );
kenjiArai 9:6a64b0207f72 271 #if 0
kenjiArai 10:806cfec92eb6 272 // Show Time with several example
kenjiArai 9:6a64b0207f72 273 // ex.2
kenjiArai 9:6a64b0207f72 274 strftime(buf, 40, "%x %X", localtime(&seconds));
kenjiArai 9:6a64b0207f72 275 pc.printf("Date: %s\r\n", buf);
kenjiArai 9:6a64b0207f72 276 // ex.3
kenjiArai 9:6a64b0207f72 277 strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 9:6a64b0207f72 278 pc.printf("Date: %s\r\n", buf);
kenjiArai 9:6a64b0207f72 279 // ex.4
kenjiArai 9:6a64b0207f72 280 strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
kenjiArai 9:6a64b0207f72 281 pc.printf("Date: %s\r\n", buf);
kenjiArai 9:6a64b0207f72 282 #endif
kenjiArai 9:6a64b0207f72 283 }