Enter Standby mode then wake up(only restart) by RTC timer
/users/kenjiArai/notebook/standby-mode-current-consumption-on-nucleo-f446re/
IDD Jumper(JP6) | ||||
Mode | Mbed-OS | Board | IDD Current(sleep) | IDD Current(Normal(*1)) |
DeepSleep | 0s5.15.1 | Nucleo-L152RE | 4.23uA | 5mA to 8mA |
^ | 0s6.6.0 | ^ | 4.22uA | 4mA to 7mA |
StandBy | 0s5.15.1 | ^ | 3.90uA | 4mA to 7mA |
^ | 0s6.6.0 | ^ | 3.90uA | 4mA to 7mA |
DeepSleep | 0s5.15.1 | Nucleo-L476RG | 2.13uA | 7mA to 10mA |
^ | 0s6.6.0 | ^ | 2.23uA | 7mA to 10mA |
StandBy | 0s5.15.1 | ^ | -uA(*2) | -mA(*2) |
^ | 0s6.6.0 | ^ | -uA(*2) | -mA(*2) |
DeepSleep | 0s5.15.1 | Nucleo-F411RE | 1.91mA(*3) | 7mA to 10mA |
^ | 0s6.6.0 | ^ | 1.65mA(*3) | 7mA to 10mA |
StandBy | 0s5.15.1 | ^ | 3.35uA | 7mA to 10mA |
^ | 0s6.6.0 | ^ | 3.40uA | 7mA to 9mA |
DeepSleep | 0s5.15.1 | Nucleo-F446RE | 1.67mA(*3) | 14mA to 17mA |
^ | 0s6.6.0 | ^ | 1.76mA(*3) | 14mA to 16mA |
StandBy | 0s5.15.1 | ^ | 3.42uA | 14mA to 17mA |
^ | 0s6.6.0 | ^ | 3.42uA | 14mA 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/
Diff: main.cpp
- 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; +}