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/

Committer:
kenjiArai
Date:
Sun Jan 17 03:22:47 2021 +0000
Revision:
5:37c4c47a5546
Parent:
4:bee93f6bae20
added Nucleo-L476RG and DISCO-L475VG-IOT01A

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 2:281dbfae5cd0 1 /*
kenjiArai 2:281dbfae5cd0 2 * Mbed Application program
kenjiArai 4:bee93f6bae20 3 * Check Standby Mode
kenjiArai 2:281dbfae5cd0 4 *
kenjiArai 4:bee93f6bae20 5 * Copyright (c) 2020,'21 Kenji Arai / JH1PJL
kenjiArai 2:281dbfae5cd0 6 * http://www7b.biglobe.ne.jp/~kenjia/
kenjiArai 2:281dbfae5cd0 7 * https://os.mbed.com/users/kenjiArai/
kenjiArai 2:281dbfae5cd0 8 * Revised: March 12th, 2020
kenjiArai 5:37c4c47a5546 9 * Revised: January 17th, 2021
kenjiArai 2:281dbfae5cd0 10 */
kenjiArai 2:281dbfae5cd0 11
kenjiArai 2:281dbfae5cd0 12 /*
kenjiArai 2:281dbfae5cd0 13 Reference information:
kenjiArai 2:281dbfae5cd0 14 https://forums.mbed.com/t/how-to-deep-sleep/7551
kenjiArai 4:bee93f6bae20 15 https://os.mbed.com/users/kenjiArai/code/Check_DeepSleep_os5/
kenjiArai 4:bee93f6bae20 16 https://os.mbed.com/users/kenjiArai/code/Check_StandBy_os5/
kenjiArai 2:281dbfae5cd0 17
kenjiArai 4:bee93f6bae20 18 DEEP SLEEP MODE (Tested on with mbed-os6.6.0)
kenjiArai 4:bee93f6bae20 19 https://os.mbed.com/users/kenjiArai/code/Check_DeepSleep_os6/
kenjiArai 4:bee93f6bae20 20 Nucleo-L152RE -> 4.22uA (Normal run = 4mA to 7mA)
kenjiArai 4:bee93f6bae20 21 Nucleo-L476RG -> 2.23uA (Normal run = 7mA to 10mA)
kenjiArai 4:bee93f6bae20 22 Nucleo-F411RE -> 1.65mA (not uA)(Normal run = 7mA to 10mA)
kenjiArai 4:bee93f6bae20 23 Nucleo-F446RE -> 1.76mA (not uA)(Normal run = 14mA to 16mA)
kenjiArai 4:bee93f6bae20 24 STANDBY MODE (Tested on with mbed-os6.6.0)
kenjiArai 4:bee93f6bae20 25 Nucleo-L152RE -> 3.90uA (Normal run = 4mA to 7mA)
kenjiArai 5:37c4c47a5546 26 Nucleo-L476RG -> 0.62uA (Normal run = 7mA to 10mA)
kenjiArai 4:bee93f6bae20 27 Nucleo-F411RE -> 3.40uA (Normal run = 7mA to 9mA)
kenjiArai 4:bee93f6bae20 28 Nucleo-F446RE -> 3.42uA (Normal run = 14mA to 16mA)
kenjiArai 5:37c4c47a5546 29 DISCO-L475VG-IOT01A -> 0.58uA (Normal run = 7mA to 9mA)
kenjiArai 4:bee93f6bae20 30
kenjiArai 4:bee93f6bae20 31 Current Measurement:
kenjiArai 4:bee93f6bae20 32 Nucleo board has IDD Jumper (JP6).
kenjiArai 4:bee93f6bae20 33 I measured CPU current using Digital Multi-meter DCI mode.
kenjiArai 2:281dbfae5cd0 34 */
kenjiArai 2:281dbfae5cd0 35
kenjiArai 2:281dbfae5cd0 36 // Include --------------------------------------------------------------------
kenjiArai 2:281dbfae5cd0 37 #include "mbed.h"
kenjiArai 2:281dbfae5cd0 38 #include "WakeUp.h"
kenjiArai 2:281dbfae5cd0 39
kenjiArai 2:281dbfae5cd0 40 // Definition -----------------------------------------------------------------
kenjiArai 2:281dbfae5cd0 41
kenjiArai 2:281dbfae5cd0 42 // Constructor ----------------------------------------------------------------
kenjiArai 2:281dbfae5cd0 43 DigitalIn my_sw(USER_BUTTON);
kenjiArai 5:37c4c47a5546 44 #if defined(TARGET_DISCO_L475VG_IOT01A)
kenjiArai 5:37c4c47a5546 45 DigitalOut myled(LED2,0);
kenjiArai 5:37c4c47a5546 46 #else
kenjiArai 2:281dbfae5cd0 47 DigitalOut myled(LED1,1);
kenjiArai 5:37c4c47a5546 48 #endif
kenjiArai 4:bee93f6bae20 49 static BufferedSerial pc(USBTX, USBRX, 9600);
kenjiArai 2:281dbfae5cd0 50 AnalogIn a_in(A0);
kenjiArai 2:281dbfae5cd0 51 Timer t;
kenjiArai 2:281dbfae5cd0 52
kenjiArai 2:281dbfae5cd0 53 // RAM ------------------------------------------------------------------------
kenjiArai 2:281dbfae5cd0 54
kenjiArai 2:281dbfae5cd0 55 // ROM / Constant data --------------------------------------------------------
kenjiArai 2:281dbfae5cd0 56
kenjiArai 2:281dbfae5cd0 57 // Function prototypes --------------------------------------------------------
kenjiArai 4:bee93f6bae20 58 static void time_enter_mode(void);
kenjiArai 4:bee93f6bae20 59 static void chk_and_set_time(char *ptr);
kenjiArai 4:bee93f6bae20 60 static int32_t xatoi (char **str, int32_t *res);
kenjiArai 4:bee93f6bae20 61 static void get_line (char *buff, int32_t len);
kenjiArai 4:bee93f6bae20 62 extern void print_revision(void);
kenjiArai 2:281dbfae5cd0 63
kenjiArai 2:281dbfae5cd0 64 //------------------------------------------------------------------------------
kenjiArai 2:281dbfae5cd0 65 // Control Program
kenjiArai 2:281dbfae5cd0 66 //------------------------------------------------------------------------------
kenjiArai 2:281dbfae5cd0 67 int main()
kenjiArai 2:281dbfae5cd0 68 {
kenjiArai 2:281dbfae5cd0 69 time_t seconds;
kenjiArai 2:281dbfae5cd0 70 char buf[64];
kenjiArai 2:281dbfae5cd0 71 uint32_t t_pass = 0;
kenjiArai 2:281dbfae5cd0 72 uint32_t loop_count = 1;
kenjiArai 2:281dbfae5cd0 73 float ain;
kenjiArai 2:281dbfae5cd0 74
kenjiArai 4:bee93f6bae20 75 printf("\r\nCheck current consumption at Standby mode.\r\n");
kenjiArai 2:281dbfae5cd0 76 print_revision();
kenjiArai 2:281dbfae5cd0 77 seconds = time(NULL);
kenjiArai 2:281dbfae5cd0 78 while (my_sw == 0) {;}
kenjiArai 4:bee93f6bae20 79 ThisThread::sleep_for(10ms);
kenjiArai 2:281dbfae5cd0 80 while (true) {
kenjiArai 2:281dbfae5cd0 81 t.reset();
kenjiArai 2:281dbfae5cd0 82 t.start();
kenjiArai 4:bee93f6bae20 83 if ((my_sw == 0) || (loop_count > 10)) {
kenjiArai 2:281dbfae5cd0 84 DigitalIn dmy0(LED1);
kenjiArai 2:281dbfae5cd0 85 DigitalIn dmy1(USBTX);
kenjiArai 2:281dbfae5cd0 86 DigitalIn dmy2(USBRX);
kenjiArai 5:37c4c47a5546 87 WakeUp::standby_then_reset(20000);
kenjiArai 2:281dbfae5cd0 88 while(true) {;} // never executing this line
kenjiArai 2:281dbfae5cd0 89 }
kenjiArai 2:281dbfae5cd0 90 ain = a_in.read();
kenjiArai 2:281dbfae5cd0 91 myled = !myled;
kenjiArai 2:281dbfae5cd0 92 seconds = time(NULL);
kenjiArai 2:281dbfae5cd0 93 strftime(buf, 50, "%H:%M:%S -> ", localtime(&seconds));
kenjiArai 4:bee93f6bae20 94 printf("%s", buf);
kenjiArai 4:bee93f6bae20 95 printf(
kenjiArai 4:bee93f6bae20 96 "analog = %4.3f, processing time=%3d, counter=%4d\r\n",
kenjiArai 2:281dbfae5cd0 97 ain, t_pass, loop_count++
kenjiArai 2:281dbfae5cd0 98 );
kenjiArai 4:bee93f6bae20 99 t_pass = chrono::duration_cast<chrono::milliseconds>(
kenjiArai 4:bee93f6bae20 100 t.elapsed_time()).count();
kenjiArai 4:bee93f6bae20 101 ThisThread::sleep_for(chrono::milliseconds(1000 - t_pass));
kenjiArai 4:bee93f6bae20 102 if (pc.readable()) {
kenjiArai 4:bee93f6bae20 103 strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
kenjiArai 4:bee93f6bae20 104 printf("[Time] %s\r\n", buf);
kenjiArai 4:bee93f6bae20 105 time_enter_mode();
kenjiArai 4:bee93f6bae20 106 }
kenjiArai 2:281dbfae5cd0 107 }
kenjiArai 2:281dbfae5cd0 108 }
kenjiArai 2:281dbfae5cd0 109
kenjiArai 4:bee93f6bae20 110
kenjiArai 4:bee93f6bae20 111 static void time_enter_mode(void)
kenjiArai 2:281dbfae5cd0 112 {
kenjiArai 2:281dbfae5cd0 113 char *ptr;
kenjiArai 2:281dbfae5cd0 114 char linebuf[64];
kenjiArai 2:281dbfae5cd0 115
kenjiArai 4:bee93f6bae20 116 if (pc.readable()) {
kenjiArai 4:bee93f6bae20 117 pc.read(linebuf, 1); // dummy read
kenjiArai 4:bee93f6bae20 118 }
kenjiArai 4:bee93f6bae20 119 puts("\r\nSet time into RTC");
kenjiArai 4:bee93f6bae20 120 puts(" e.g. >21 1 12 13 14 15 -> January 12,'21, 13:14:14");
kenjiArai 4:bee93f6bae20 121 linebuf[0] = '>';
kenjiArai 4:bee93f6bae20 122 pc.write(linebuf, 1);
kenjiArai 2:281dbfae5cd0 123 ptr = linebuf;
kenjiArai 2:281dbfae5cd0 124 get_line(ptr, sizeof(linebuf));
kenjiArai 4:bee93f6bae20 125 puts("\r");
kenjiArai 2:281dbfae5cd0 126 chk_and_set_time(ptr);
kenjiArai 2:281dbfae5cd0 127 }
kenjiArai 2:281dbfae5cd0 128
kenjiArai 4:bee93f6bae20 129 // Change string -> integer
kenjiArai 4:bee93f6bae20 130 static int32_t xatoi(char **str, int32_t *res)
kenjiArai 2:281dbfae5cd0 131 {
kenjiArai 4:bee93f6bae20 132 uint32_t val;
kenjiArai 2:281dbfae5cd0 133 uint8_t c, radix, s = 0;
kenjiArai 2:281dbfae5cd0 134
kenjiArai 4:bee93f6bae20 135 while ((c = **str) == ' ') (*str)++;
kenjiArai 2:281dbfae5cd0 136 if (c == '-') {
kenjiArai 2:281dbfae5cd0 137 s = 1;
kenjiArai 2:281dbfae5cd0 138 c = *(++(*str));
kenjiArai 2:281dbfae5cd0 139 }
kenjiArai 2:281dbfae5cd0 140 if (c == '0') {
kenjiArai 2:281dbfae5cd0 141 c = *(++(*str));
kenjiArai 2:281dbfae5cd0 142 if (c <= ' ') {
kenjiArai 2:281dbfae5cd0 143 *res = 0;
kenjiArai 2:281dbfae5cd0 144 return 1;
kenjiArai 2:281dbfae5cd0 145 }
kenjiArai 2:281dbfae5cd0 146 if (c == 'x') {
kenjiArai 2:281dbfae5cd0 147 radix = 16;
kenjiArai 2:281dbfae5cd0 148 c = *(++(*str));
kenjiArai 2:281dbfae5cd0 149 } else {
kenjiArai 2:281dbfae5cd0 150 if (c == 'b') {
kenjiArai 2:281dbfae5cd0 151 radix = 2;
kenjiArai 2:281dbfae5cd0 152 c = *(++(*str));
kenjiArai 2:281dbfae5cd0 153 } else {
kenjiArai 2:281dbfae5cd0 154 if ((c >= '0')&&(c <= '9')) {
kenjiArai 2:281dbfae5cd0 155 radix = 8;
kenjiArai 4:bee93f6bae20 156 } else {
kenjiArai 2:281dbfae5cd0 157 return 0;
kenjiArai 2:281dbfae5cd0 158 }
kenjiArai 2:281dbfae5cd0 159 }
kenjiArai 2:281dbfae5cd0 160 }
kenjiArai 2:281dbfae5cd0 161 } else {
kenjiArai 2:281dbfae5cd0 162 if ((c < '1')||(c > '9')) {
kenjiArai 2:281dbfae5cd0 163 return 0;
kenjiArai 2:281dbfae5cd0 164 }
kenjiArai 2:281dbfae5cd0 165 radix = 10;
kenjiArai 2:281dbfae5cd0 166 }
kenjiArai 2:281dbfae5cd0 167 val = 0;
kenjiArai 2:281dbfae5cd0 168 while (c > ' ') {
kenjiArai 4:bee93f6bae20 169 if (c >= 'a') c -= 0x20;
kenjiArai 2:281dbfae5cd0 170 c -= '0';
kenjiArai 2:281dbfae5cd0 171 if (c >= 17) {
kenjiArai 2:281dbfae5cd0 172 c -= 7;
kenjiArai 4:bee93f6bae20 173 if (c <= 9) return 0;
kenjiArai 2:281dbfae5cd0 174 }
kenjiArai 4:bee93f6bae20 175 if (c >= radix) return 0;
kenjiArai 2:281dbfae5cd0 176 val = val * radix + c;
kenjiArai 2:281dbfae5cd0 177 c = *(++(*str));
kenjiArai 2:281dbfae5cd0 178 }
kenjiArai 4:bee93f6bae20 179 if (s) val = -val;
kenjiArai 2:281dbfae5cd0 180 *res = val;
kenjiArai 2:281dbfae5cd0 181 return 1;
kenjiArai 2:281dbfae5cd0 182 }
kenjiArai 4:bee93f6bae20 183
kenjiArai 4:bee93f6bae20 184 // Get key input data
kenjiArai 4:bee93f6bae20 185 static void get_line(char *buff, int32_t len)
kenjiArai 4:bee93f6bae20 186 {
kenjiArai 4:bee93f6bae20 187 char c;
kenjiArai 4:bee93f6bae20 188 char bf[8];
kenjiArai 4:bee93f6bae20 189 int32_t idx = 0;
kenjiArai 4:bee93f6bae20 190
kenjiArai 4:bee93f6bae20 191 for (;;) {
kenjiArai 4:bee93f6bae20 192 pc.read(bf, 1);
kenjiArai 4:bee93f6bae20 193 c = bf[0];
kenjiArai 4:bee93f6bae20 194 //printf("0x%x \r\n", c);
kenjiArai 4:bee93f6bae20 195 if (c == '\r') {
kenjiArai 4:bee93f6bae20 196 buff[idx++] = c;
kenjiArai 4:bee93f6bae20 197 break;
kenjiArai 4:bee93f6bae20 198 }
kenjiArai 4:bee93f6bae20 199 if ((c == '\b') && idx) {
kenjiArai 4:bee93f6bae20 200 idx--;
kenjiArai 4:bee93f6bae20 201 const char bf_bs[] =
kenjiArai 4:bee93f6bae20 202 {0x1b, '[', '1', 'D', ' ', 0x1b, '[', '1', 'D'};
kenjiArai 4:bee93f6bae20 203 pc.write(bf_bs, 9);
kenjiArai 4:bee93f6bae20 204 }
kenjiArai 4:bee93f6bae20 205 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 4:bee93f6bae20 206 buff[idx++] = c;
kenjiArai 4:bee93f6bae20 207 pc.write(bf, 1);
kenjiArai 4:bee93f6bae20 208 }
kenjiArai 4:bee93f6bae20 209 }
kenjiArai 4:bee93f6bae20 210 buff[idx] = 0;
kenjiArai 4:bee93f6bae20 211 bf[0] = '\n';
kenjiArai 4:bee93f6bae20 212 pc.write(bf, 1);
kenjiArai 4:bee93f6bae20 213 }
kenjiArai 4:bee93f6bae20 214
kenjiArai 4:bee93f6bae20 215 // Check key input strings and set time
kenjiArai 4:bee93f6bae20 216 static void chk_and_set_time(char *ptr)
kenjiArai 4:bee93f6bae20 217 {
kenjiArai 4:bee93f6bae20 218 int32_t p1;
kenjiArai 4:bee93f6bae20 219 struct tm t;
kenjiArai 4:bee93f6bae20 220 time_t seconds;
kenjiArai 4:bee93f6bae20 221
kenjiArai 4:bee93f6bae20 222 if (xatoi(&ptr, &p1)) {
kenjiArai 4:bee93f6bae20 223 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 4:bee93f6bae20 224 printf("Year:%d ",p1);
kenjiArai 4:bee93f6bae20 225 xatoi( &ptr, &p1 );
kenjiArai 4:bee93f6bae20 226 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 4:bee93f6bae20 227 printf("Month:%d ",p1);
kenjiArai 4:bee93f6bae20 228 xatoi( &ptr, &p1 );
kenjiArai 4:bee93f6bae20 229 t.tm_mday = (uint8_t)p1;
kenjiArai 4:bee93f6bae20 230 printf("Day:%d ",p1);
kenjiArai 4:bee93f6bae20 231 xatoi( &ptr, &p1 );
kenjiArai 4:bee93f6bae20 232 t.tm_hour = (uint8_t)p1;
kenjiArai 4:bee93f6bae20 233 printf("Hour:%d ",p1);
kenjiArai 4:bee93f6bae20 234 xatoi( &ptr, &p1 );
kenjiArai 4:bee93f6bae20 235 t.tm_min = (uint8_t)p1;
kenjiArai 4:bee93f6bae20 236 printf("Min:%d ",p1);
kenjiArai 4:bee93f6bae20 237 xatoi( &ptr, &p1 );
kenjiArai 4:bee93f6bae20 238 t.tm_sec = (uint8_t)p1;
kenjiArai 4:bee93f6bae20 239 printf("Sec: %d \r\n",p1);
kenjiArai 4:bee93f6bae20 240 } else {
kenjiArai 4:bee93f6bae20 241 return;
kenjiArai 4:bee93f6bae20 242 }
kenjiArai 4:bee93f6bae20 243 seconds = mktime(&t);
kenjiArai 4:bee93f6bae20 244 set_time(seconds);
kenjiArai 4:bee93f6bae20 245 // Show Time with several example
kenjiArai 4:bee93f6bae20 246 // ex.1
kenjiArai 4:bee93f6bae20 247 printf(
kenjiArai 4:bee93f6bae20 248 "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
kenjiArai 4:bee93f6bae20 249 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec
kenjiArai 4:bee93f6bae20 250 );
kenjiArai 4:bee93f6bae20 251 char buf[64];
kenjiArai 4:bee93f6bae20 252 // ex.2
kenjiArai 4:bee93f6bae20 253 strftime(buf, 40, "%x %X", localtime(&seconds));
kenjiArai 4:bee93f6bae20 254 printf("Date: %s\r\n", buf);
kenjiArai 4:bee93f6bae20 255 // ex.3
kenjiArai 4:bee93f6bae20 256 strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 4:bee93f6bae20 257 printf("Date: %s\r\n", buf);
kenjiArai 4:bee93f6bae20 258 // ex.4
kenjiArai 4:bee93f6bae20 259 strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
kenjiArai 4:bee93f6bae20 260 printf("Date: %s\r\n", buf);
kenjiArai 4:bee93f6bae20 261 }