Dependencies:   WakeUp

Fork of study_step0 by Team_PjL

Please refer notebook.
/users/kenjiArai/notebook/standby-mode-current-consumption-on-nucleo-f446re/#

Files at this revision

API Documentation at this revision

Comitter:
kenjiArai
Date:
Thu Sep 21 22:10:34 2017 +0000
Parent:
0:1672d0903bdc
Commit message:
Added Standby mode into WakeUP library. This is a checking program for the standby mode on Nucleo-F446RE and other STM32 series.;

Changed in this revision

WakeUp.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
diff -r 1672d0903bdc -r abe49c3395cd WakeUp.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WakeUp.lib	Thu Sep 21 22:10:34 2017 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/kenjiArai/code/WakeUp/#2bd9df8c3ac8
diff -r 1672d0903bdc -r abe49c3395cd main.cpp
--- a/main.cpp	Thu Aug 10 20:50:46 2017 +0000
+++ b/main.cpp	Thu Sep 21 22:10:34 2017 +0000
@@ -1,20 +1,244 @@
 /*
- * Mbed Application program / Study step1 -> LED Blinky
+ * 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:    August    10th, 2017
- *      Revised:    August    10th, 2017
+ *      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
 
-DigitalOut  my_led(LED1);
+//  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() {
-    while(1) {
-        my_led = !my_led;
-        wait(1.0);  
+    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;
+}
diff -r 1672d0903bdc -r abe49c3395cd mbed-os.lib
--- a/mbed-os.lib	Thu Aug 10 20:50:46 2017 +0000
+++ b/mbed-os.lib	Thu Sep 21 22:10:34 2017 +0000
@@ -1,1 +1,1 @@
-https://github.com/ARMmbed/mbed-os/#4c256f04596179699c4f14b6863b07cc024ca9be
+https://github.com/ARMmbed/mbed-os/#ca661f9d28526ca8f874b05432493a489c9671ea