Enter Standby mode then wake up(only restart) by RTC timer

Dependencies:   WakeUp_STM32

/users/kenjiArai/notebook/standby-mode-current-consumption-on-nucleo-f446re/

IDD Jumper(JP6)
ModeMbed-OSBoardIDD Current(sleep)IDD Current(Normal(*1))
DeepSleep0s5.15.1Nucleo-L152RE4.23uA5mA to 8mA
^0s6.6.0^4.22uA4mA to 7mA
StandBy0s5.15.1^3.90uA4mA to 7mA
^0s6.6.0^3.90uA4mA to 7mA
DeepSleep0s5.15.1Nucleo-L476RG2.13uA7mA to 10mA
^0s6.6.0^2.23uA7mA to 10mA
StandBy0s5.15.1^-uA(*2)-mA(*2)
^0s6.6.0^-uA(*2)-mA(*2)
DeepSleep0s5.15.1Nucleo-F411RE1.91mA(*3)7mA to 10mA
^0s6.6.0^1.65mA(*3)7mA to 10mA
StandBy0s5.15.1^3.35uA7mA to 10mA
^0s6.6.0^3.40uA7mA to 9mA
DeepSleep0s5.15.1Nucleo-F446RE1.67mA(*3)14mA to 17mA
^0s6.6.0^1.76mA(*3)14mA to 16mA
StandBy0s5.15.1^3.42uA14mA to 17mA
^0s6.6.0^3.42uA14mA to 16mA

(*1)-> LED1 Blinky every 1sec and change LED1 current
(*2)-> Could NOT make proper program and could NOT measure
(*3)-> NOT uA but mA
All Nucleo boards are stand alone condition(not additional circuit).
Equipment: DMM6500

/users/kenjiArai/code/Check_DeepSleep_os5/
/users/kenjiArai/code/Check_DeepSleep_os6/
/users/kenjiArai/code/Check_StandBy_os5/
/users/kenjiArai/code/Check_StandBy_os6/

Revision:
2:281dbfae5cd0
Parent:
1:abe49c3395cd
Child:
3:4cdb02c5bd94
--- a/main.cpp	Thu Sep 21 22:10:34 2017 +0000
+++ b/main.cpp	Thu Mar 12 09:30:00 2020 +0000
@@ -1,244 +1,236 @@
-/*
- * Mbed Application program / check StandBy function
- *
- * Copyright (c) 2017 Kenji Arai / JH1PJL
- *  http://www.page.sannet.ne.jp/kenjia/index.html
- *  http://mbed.org/users/kenjiArai/
- *      Created:    September 19th, 2017
- *      Revised:    September 21st, 2017
- */
-
-#if defined(TARGET_NUCLEO_F446RE) || defined(TARGET_NUCLEO_F411RE)\
- || defined(TARGET_NUCLEO_F401RE)\
- || defined(TARGET_NUCLEO_L152RE) || defined(TARGET_NUCLEO_L073RZ)\
- || defined(TARGET_NUCLEO_L053R8)
-#else
-#error "This program does NOT run your target!"
-#endif
-
-//  Include --------------------------------------------------------------------
-#include "mbed.h"
-#include "WakeUp.h"
- 
-//  Definition -----------------------------------------------------------------
-#define TRY_STANDBY_MODE
-
-//  Object ---------------------------------------------------------------------
-DigitalOut  myled(LED1);
-DigitalOut  out(D7);
-Serial      pc(USBTX, USBRX);       // Communication with Host
-
-//  RAM ------------------------------------------------------------------------
-
-//  ROM / Constant data --------------------------------------------------------
-char *const msg0  = "Is a time correct? If no, please hit any key. ";
-char *const msg1  = "<Push USER SW then enter sleep mode> ";
-
-//  Function prototypes --------------------------------------------------------
-static void time_enter_mode(void);
-static void chk_and_set_time(char *ptr);
-static int  xatoi (char **str, unsigned long *res);
-static void get_line (char *buff, int len);
-#ifndef TRY_STANDBY_MODE
-static void wakeup_action(void);
-#endif
-
-//------------------------------------------------------------------------------
-//  Control Program
-//------------------------------------------------------------------------------
-int main() {
-    char buf[64];               // data buffer for text
-    time_t seconds;
-    uint32_t count = 0;
-
-    pc.printf("\r\nStart program\r\n");
-    while(true){
-        seconds = time(NULL);
-        strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
-        pc.printf("[Time] %s", buf);
-        pc.printf(msg0);
-        pc.printf("%s\r", msg1);
-        while (seconds == time(NULL)){;}
-        if (pc.readable() == 1){
-            buf[0] = pc.getc();  // dummy read
-            time_enter_mode();
-            break;
-        }
-        uint8_t n = strlen(msg0) + strlen(msg1);
-        for (uint8_t i = 0; i < n; i++){
-            pc.putc(' ');
-        }
-        pc.printf("      \r"); // Not use '\n'
-        if(++count >= 9){
-            break;
-        }
-    }
-    seconds = time(NULL);
-    strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
-    pc.printf("[Time] %s", buf);
-#ifdef TRY_STANDBY_MODE
-    pc.printf("Check Stand-By function using internal RTC\r\n");
-#else
-    pc.printf("Check Deep Sleep function using internal RTC\r\n");
-#endif
-    wait(1);
-#ifdef TRY_STANDBY_MODE
-    while(true){
-        WakeUp::standby_then_reset(10000);
-        // not come to here
-        while(true){;}
-    }
-#else
-    WakeUp::attach(wakeup_action);
-    uint32_t n = 0;
-    while(true){
-        pc.printf("main_Step(%u)\r\n", __LINE__);
-        myled = 0;
-        WakeUp::set_ms(6000);
-        deepsleep();
-        myled = 1;
-        wait(4);
-        pc.printf("\r\nmain_Step(%u)\r\n", __LINE__);
-        if (++n >= 5){
-            NVIC_SystemReset();
-        }
-    }
-#endif
-}
-
-#ifndef TRY_STANDBY_MODE
-void wakeup_action()
-{
-    out = !out;
-}
-#endif
-
-void time_enter_mode(void)
-{
-    char *ptr;
-    char linebuf[64];
-
-    pc.printf("\r\nSet time into RTC\r\n");
-    pc.printf(" e.g. >17 1 16 20 55 23 -> January 16th,'17, 20:55:23\r\n");
-    pc.printf(" If time is fine, just hit enter\r\n");
-    pc.putc('>');
-    ptr = linebuf;
-    get_line(ptr, sizeof(linebuf));
-    pc.printf("\r");
-    chk_and_set_time(ptr);
-}
-
-//  Get key input data
-void get_line (char *buff, int len)
-{
-    char c;
-    int idx = 0;
-
-    for (;;) {
-        c = pc.getc();
-        if (c == '\r') {
-            buff[idx++] = c;
-            break;
-        }
-        if ((c == '\b') && idx) {
-            idx--;
-            pc.putc(c);
-            pc.putc(' ');
-            pc.putc(c);
-        }
-        if (((uint8_t)c >= ' ') && (idx < len - 1)) {
-            buff[idx++] = c;
-            pc.putc(c);
-        }
-    }
-    buff[idx] = 0;
-    pc.putc('\n');
-}
-
-void chk_and_set_time(char *ptr)
-{
-    unsigned long p1;
-    struct tm t;
-    time_t seconds;
-
-    if (xatoi(&ptr, &p1)) {
-        t.tm_year       = (uint8_t)p1 + 100;
-        pc.printf("Year:%d ",p1);
-        xatoi( &ptr, &p1 );
-        t.tm_mon        = (uint8_t)p1 - 1;
-        pc.printf("Month:%d ",p1);
-        xatoi( &ptr, &p1 );
-        t.tm_mday       = (uint8_t)p1;
-        pc.printf("Day:%d ",p1);
-        xatoi( &ptr, &p1 );
-        t.tm_hour       = (uint8_t)p1;
-        pc.printf("Hour:%d ",p1);
-        xatoi( &ptr, &p1 );
-        t.tm_min        = (uint8_t)p1;
-        pc.printf("Min:%d ",p1);
-        xatoi( &ptr, &p1 );
-        t.tm_sec        = (uint8_t)p1;
-        pc.printf("Sec: %d \r\n",p1);
-    } else {
-        return;
-    }
-    seconds = mktime(&t);
-    set_time(seconds);
-    pc.printf(
-        "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
-        t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec
-    );
-}
-
-//  Change string -> integer
-int xatoi (char **str, unsigned long *res)
-{
-    unsigned long val;
-    unsigned char c, radix, s = 0;
-
-    while ((c = **str) == ' '){ (*str)++;}
-    if (c == '-'){
-        s = 1;
-        c = *(++(*str));
-    }
-    if (c == '0'){
-        c = *(++(*str));
-        if (c <= ' '){
-            *res = 0;
-            return 1;
-        }
-        if (c == 'x'){
-            radix = 16;
-            c = *(++(*str));
-        } else {
-            if (c == 'b'){
-                radix = 2;
-                c = *(++(*str));
-            } else {
-                if ((c >= '0')&&(c <= '9')){
-                    radix = 8;
-                } else {
-                    return 0;
-                }
-            }
-        }
-    } else {
-        if ((c < '1')||(c > '9')){ return 0;}
-        radix = 10;
-    }
-    val = 0;
-    while (c > ' ') {
-        if (c >= 'a'){ c -= 0x20;}
-        c -= '0';
-        if (c >= 17) {
-            c -= 7;
-            if (c <= 9){ return 0;}
-        }
-        if (c >= radix){ return 0;}
-        val = val * radix + c;
-        c = *(++(*str));
-    }
-    if (s){ val = -val;}
-    *res = val;
-    return 1;
-}
+/*
+ * Mbed Application program
+ *  Check Deep Sleep Mode
+ *
+ * Copyright (c) 2020 Kenji Arai / JH1PJL
+ *  http://www7b.biglobe.ne.jp/~kenjia/
+ *  https://os.mbed.com/users/kenjiArai/
+ *      Revised:    March     12th, 2020
+ *      Revised:    March     12th, 2020
+ */
+
+/*
+    Reference information:
+        https://forums.mbed.com/t/how-to-deep-sleep/7551
+
+    Tested on
+
+        Nucleo-L152RE
+ */
+
+//  Include --------------------------------------------------------------------
+#include "mbed.h"
+#include "WakeUp.h"
+
+//  Definition -----------------------------------------------------------------
+//      https://keisan.casio.jp/exec/system/1526003938
+#define DATE_20200222_222222    1582377742      // 2020/2/22 22:22:22 
+
+#if (MBED_MAJOR_VERSION == 5)
+#define WAIT_MS(x)  ThisThread::sleep_for(x)
+#else
+#define WAIT_MS(x)  wait_ms(x)
+#endif
+
+//  Constructor ----------------------------------------------------------------
+DigitalIn   my_sw(USER_BUTTON);
+DigitalOut  myled(LED1,1);
+Serial      pc(USBTX, USBRX);
+AnalogIn    a_in(A0);
+Timer       t;
+
+//  RAM ------------------------------------------------------------------------
+
+//  ROM / Constant data --------------------------------------------------------
+
+//  Function prototypes --------------------------------------------------------
+void sw_irq(void);
+void time_enter_mode(void);
+void chk_and_set_time(char *ptr);
+int32_t  xatoi (char **str, int32_t *res);
+void get_line (char *buff, int len);
+void print_revision(void);
+
+//------------------------------------------------------------------------------
+//  Control Program
+//------------------------------------------------------------------------------
+int main()
+{
+    time_t seconds;
+    char buf[64];
+    uint32_t t_pass = 0;
+    uint32_t loop_count = 1;
+    float ain;
+
+    printf("\r\nCheck current consumption at Deep-sleep mode.\r\n");
+    print_revision();
+    seconds = time(NULL);
+    if (seconds < DATE_20200220_222222) {
+        strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
+        pc.printf("[Time] %s\r\n", buf);
+        time_enter_mode();
+    }
+    while (my_sw == 0) {;}
+    WAIT_MS(10);
+    while (true) {
+        t.reset();
+        t.start();
+        if ((my_sw == 0) || (loop_count > 20)) {
+            DigitalIn dmy0(LED1);
+            DigitalIn dmy1(USBTX);
+            DigitalIn dmy2(USBRX);
+            WakeUp::standby_then_reset(10000);
+            while(true) {;} // never executing this line
+        }
+        ain = a_in.read();
+        myled = !myled;
+        seconds = time(NULL);
+        strftime(buf, 50, "%H:%M:%S -> ", localtime(&seconds));
+        pc.printf("%s", buf);
+        pc.printf(
+            "analog = %4.3f, loop_time=%3d, counter=%4d\r\n",
+            ain, t_pass, loop_count++
+        );
+        t_pass = t.read_ms();
+        WAIT_MS(1000 - t_pass);
+    }
+}
+
+void time_enter_mode(void)
+{
+    char *ptr;
+    char linebuf[64];
+
+    pc.printf("\r\nSet time into RTC\r\n");
+    pc.printf(" e.g. >20 2 22 22 22 22 -> February 22,'20, 22:22:22\r\n");
+    pc.putc('>');
+    ptr = linebuf;
+    get_line(ptr, sizeof(linebuf));
+    pc.printf("\r");
+    chk_and_set_time(ptr);
+}
+
+void get_line (char *buff, int len)
+{
+    char c;
+    uint32_t idx = 0;
+
+    while(true) {
+        c = pc.getc();
+        if (c == '\r') {
+            buff[idx++] = c;
+            break;
+        }
+        if ((c == '\b') && idx) {
+            idx--;
+            pc.putc(c);
+            pc.putc(' ');
+            pc.putc(c);
+        }
+        if (((uint8_t)c >= ' ') && (idx < len - 1)) {
+            buff[idx++] = c;
+            pc.putc(c);
+        }
+    }
+    buff[idx] = 0;
+    pc.puts("\r\n");
+}
+
+void chk_and_set_time(char *ptr)
+{
+    int32_t p1;
+    struct tm t;
+    time_t seconds;
+
+    if (xatoi(&ptr, &p1)) {
+        t.tm_year       = (uint8_t)p1 + 100;
+        pc.printf("Year:%d ",p1);
+        xatoi( &ptr, &p1 );
+        t.tm_mon        = (uint8_t)p1 - 1;
+        pc.printf("Month:%d ",p1);
+        xatoi( &ptr, &p1 );
+        t.tm_mday       = (uint8_t)p1;
+        pc.printf("Day:%d ",p1);
+        xatoi( &ptr, &p1 );
+        t.tm_hour       = (uint8_t)p1;
+        pc.printf("Hour:%d ",p1);
+        xatoi( &ptr, &p1 );
+        t.tm_min        = (uint8_t)p1;
+        pc.printf("Min:%d ",p1);
+        xatoi( &ptr, &p1 );
+        t.tm_sec        = (uint8_t)p1;
+        pc.printf("Sec: %d \r\n",p1);
+    } else {
+        return;
+    }
+    seconds = mktime(&t);
+    set_time(seconds);
+    pc.printf(
+        "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
+        t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec
+    );
+}
+
+int32_t xatoi (char **str, int32_t *res)
+{
+    int32_t val;
+    uint8_t c, radix, s = 0;
+
+    while ((c = **str) == ' ') {
+        (*str)++;
+    }
+    if (c == '-') {
+        s = 1;
+        c = *(++(*str));
+    }
+    if (c == '0') {
+        c = *(++(*str));
+        if (c <= ' ') {
+            *res = 0;
+            return 1;
+        }
+        if (c == 'x') {
+            radix = 16;
+            c = *(++(*str));
+        } else {
+            if (c == 'b') {
+                radix = 2;
+                c = *(++(*str));
+            } else {
+                if ((c >= '0')&&(c <= '9')) {
+                    radix = 8;
+                } else {
+                    return 0;
+                }
+            }
+        }
+    } else {
+        if ((c < '1')||(c > '9')) {
+            return 0;
+        }
+        radix = 10;
+    }
+    val = 0;
+    while (c > ' ') {
+        if (c >= 'a') {
+            c -= 0x20;
+        }
+        c -= '0';
+        if (c >= 17) {
+            c -= 7;
+            if (c <= 9) {
+                return 0;
+            }
+        }
+        if (c >= radix) {
+            return 0;
+        }
+        val = val * radix + c;
+        c = *(++(*str));
+    }
+    if (s) {
+        val = -val;
+    }
+    *res = val;
+    return 1;
+}