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:
Thu Mar 12 09:30:00 2020 +0000
Revision:
2:281dbfae5cd0
Parent:
1:abe49c3395cd
Child:
3:4cdb02c5bd94
Enter Standby mode then wake up(only restart) by RTC timer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 2:281dbfae5cd0 1 /*
kenjiArai 2:281dbfae5cd0 2 * Mbed Application program
kenjiArai 2:281dbfae5cd0 3 * Check Deep Sleep Mode
kenjiArai 2:281dbfae5cd0 4 *
kenjiArai 2:281dbfae5cd0 5 * Copyright (c) 2020 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 2:281dbfae5cd0 9 * Revised: March 12th, 2020
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 2:281dbfae5cd0 15
kenjiArai 2:281dbfae5cd0 16 Tested on
kenjiArai 2:281dbfae5cd0 17
kenjiArai 2:281dbfae5cd0 18 Nucleo-L152RE
kenjiArai 2:281dbfae5cd0 19 */
kenjiArai 2:281dbfae5cd0 20
kenjiArai 2:281dbfae5cd0 21 // Include --------------------------------------------------------------------
kenjiArai 2:281dbfae5cd0 22 #include "mbed.h"
kenjiArai 2:281dbfae5cd0 23 #include "WakeUp.h"
kenjiArai 2:281dbfae5cd0 24
kenjiArai 2:281dbfae5cd0 25 // Definition -----------------------------------------------------------------
kenjiArai 2:281dbfae5cd0 26 // https://keisan.casio.jp/exec/system/1526003938
kenjiArai 2:281dbfae5cd0 27 #define DATE_20200222_222222 1582377742 // 2020/2/22 22:22:22
kenjiArai 2:281dbfae5cd0 28
kenjiArai 2:281dbfae5cd0 29 #if (MBED_MAJOR_VERSION == 5)
kenjiArai 2:281dbfae5cd0 30 #define WAIT_MS(x) ThisThread::sleep_for(x)
kenjiArai 2:281dbfae5cd0 31 #else
kenjiArai 2:281dbfae5cd0 32 #define WAIT_MS(x) wait_ms(x)
kenjiArai 2:281dbfae5cd0 33 #endif
kenjiArai 2:281dbfae5cd0 34
kenjiArai 2:281dbfae5cd0 35 // Constructor ----------------------------------------------------------------
kenjiArai 2:281dbfae5cd0 36 DigitalIn my_sw(USER_BUTTON);
kenjiArai 2:281dbfae5cd0 37 DigitalOut myled(LED1,1);
kenjiArai 2:281dbfae5cd0 38 Serial pc(USBTX, USBRX);
kenjiArai 2:281dbfae5cd0 39 AnalogIn a_in(A0);
kenjiArai 2:281dbfae5cd0 40 Timer t;
kenjiArai 2:281dbfae5cd0 41
kenjiArai 2:281dbfae5cd0 42 // RAM ------------------------------------------------------------------------
kenjiArai 2:281dbfae5cd0 43
kenjiArai 2:281dbfae5cd0 44 // ROM / Constant data --------------------------------------------------------
kenjiArai 2:281dbfae5cd0 45
kenjiArai 2:281dbfae5cd0 46 // Function prototypes --------------------------------------------------------
kenjiArai 2:281dbfae5cd0 47 void sw_irq(void);
kenjiArai 2:281dbfae5cd0 48 void time_enter_mode(void);
kenjiArai 2:281dbfae5cd0 49 void chk_and_set_time(char *ptr);
kenjiArai 2:281dbfae5cd0 50 int32_t xatoi (char **str, int32_t *res);
kenjiArai 2:281dbfae5cd0 51 void get_line (char *buff, int len);
kenjiArai 2:281dbfae5cd0 52 void print_revision(void);
kenjiArai 2:281dbfae5cd0 53
kenjiArai 2:281dbfae5cd0 54 //------------------------------------------------------------------------------
kenjiArai 2:281dbfae5cd0 55 // Control Program
kenjiArai 2:281dbfae5cd0 56 //------------------------------------------------------------------------------
kenjiArai 2:281dbfae5cd0 57 int main()
kenjiArai 2:281dbfae5cd0 58 {
kenjiArai 2:281dbfae5cd0 59 time_t seconds;
kenjiArai 2:281dbfae5cd0 60 char buf[64];
kenjiArai 2:281dbfae5cd0 61 uint32_t t_pass = 0;
kenjiArai 2:281dbfae5cd0 62 uint32_t loop_count = 1;
kenjiArai 2:281dbfae5cd0 63 float ain;
kenjiArai 2:281dbfae5cd0 64
kenjiArai 2:281dbfae5cd0 65 printf("\r\nCheck current consumption at Deep-sleep mode.\r\n");
kenjiArai 2:281dbfae5cd0 66 print_revision();
kenjiArai 2:281dbfae5cd0 67 seconds = time(NULL);
kenjiArai 2:281dbfae5cd0 68 if (seconds < DATE_20200220_222222) {
kenjiArai 2:281dbfae5cd0 69 strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
kenjiArai 2:281dbfae5cd0 70 pc.printf("[Time] %s\r\n", buf);
kenjiArai 2:281dbfae5cd0 71 time_enter_mode();
kenjiArai 2:281dbfae5cd0 72 }
kenjiArai 2:281dbfae5cd0 73 while (my_sw == 0) {;}
kenjiArai 2:281dbfae5cd0 74 WAIT_MS(10);
kenjiArai 2:281dbfae5cd0 75 while (true) {
kenjiArai 2:281dbfae5cd0 76 t.reset();
kenjiArai 2:281dbfae5cd0 77 t.start();
kenjiArai 2:281dbfae5cd0 78 if ((my_sw == 0) || (loop_count > 20)) {
kenjiArai 2:281dbfae5cd0 79 DigitalIn dmy0(LED1);
kenjiArai 2:281dbfae5cd0 80 DigitalIn dmy1(USBTX);
kenjiArai 2:281dbfae5cd0 81 DigitalIn dmy2(USBRX);
kenjiArai 2:281dbfae5cd0 82 WakeUp::standby_then_reset(10000);
kenjiArai 2:281dbfae5cd0 83 while(true) {;} // never executing this line
kenjiArai 2:281dbfae5cd0 84 }
kenjiArai 2:281dbfae5cd0 85 ain = a_in.read();
kenjiArai 2:281dbfae5cd0 86 myled = !myled;
kenjiArai 2:281dbfae5cd0 87 seconds = time(NULL);
kenjiArai 2:281dbfae5cd0 88 strftime(buf, 50, "%H:%M:%S -> ", localtime(&seconds));
kenjiArai 2:281dbfae5cd0 89 pc.printf("%s", buf);
kenjiArai 2:281dbfae5cd0 90 pc.printf(
kenjiArai 2:281dbfae5cd0 91 "analog = %4.3f, loop_time=%3d, counter=%4d\r\n",
kenjiArai 2:281dbfae5cd0 92 ain, t_pass, loop_count++
kenjiArai 2:281dbfae5cd0 93 );
kenjiArai 2:281dbfae5cd0 94 t_pass = t.read_ms();
kenjiArai 2:281dbfae5cd0 95 WAIT_MS(1000 - t_pass);
kenjiArai 2:281dbfae5cd0 96 }
kenjiArai 2:281dbfae5cd0 97 }
kenjiArai 2:281dbfae5cd0 98
kenjiArai 2:281dbfae5cd0 99 void time_enter_mode(void)
kenjiArai 2:281dbfae5cd0 100 {
kenjiArai 2:281dbfae5cd0 101 char *ptr;
kenjiArai 2:281dbfae5cd0 102 char linebuf[64];
kenjiArai 2:281dbfae5cd0 103
kenjiArai 2:281dbfae5cd0 104 pc.printf("\r\nSet time into RTC\r\n");
kenjiArai 2:281dbfae5cd0 105 pc.printf(" e.g. >20 2 22 22 22 22 -> February 22,'20, 22:22:22\r\n");
kenjiArai 2:281dbfae5cd0 106 pc.putc('>');
kenjiArai 2:281dbfae5cd0 107 ptr = linebuf;
kenjiArai 2:281dbfae5cd0 108 get_line(ptr, sizeof(linebuf));
kenjiArai 2:281dbfae5cd0 109 pc.printf("\r");
kenjiArai 2:281dbfae5cd0 110 chk_and_set_time(ptr);
kenjiArai 2:281dbfae5cd0 111 }
kenjiArai 2:281dbfae5cd0 112
kenjiArai 2:281dbfae5cd0 113 void get_line (char *buff, int len)
kenjiArai 2:281dbfae5cd0 114 {
kenjiArai 2:281dbfae5cd0 115 char c;
kenjiArai 2:281dbfae5cd0 116 uint32_t idx = 0;
kenjiArai 2:281dbfae5cd0 117
kenjiArai 2:281dbfae5cd0 118 while(true) {
kenjiArai 2:281dbfae5cd0 119 c = pc.getc();
kenjiArai 2:281dbfae5cd0 120 if (c == '\r') {
kenjiArai 2:281dbfae5cd0 121 buff[idx++] = c;
kenjiArai 2:281dbfae5cd0 122 break;
kenjiArai 2:281dbfae5cd0 123 }
kenjiArai 2:281dbfae5cd0 124 if ((c == '\b') && idx) {
kenjiArai 2:281dbfae5cd0 125 idx--;
kenjiArai 2:281dbfae5cd0 126 pc.putc(c);
kenjiArai 2:281dbfae5cd0 127 pc.putc(' ');
kenjiArai 2:281dbfae5cd0 128 pc.putc(c);
kenjiArai 2:281dbfae5cd0 129 }
kenjiArai 2:281dbfae5cd0 130 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 2:281dbfae5cd0 131 buff[idx++] = c;
kenjiArai 2:281dbfae5cd0 132 pc.putc(c);
kenjiArai 2:281dbfae5cd0 133 }
kenjiArai 2:281dbfae5cd0 134 }
kenjiArai 2:281dbfae5cd0 135 buff[idx] = 0;
kenjiArai 2:281dbfae5cd0 136 pc.puts("\r\n");
kenjiArai 2:281dbfae5cd0 137 }
kenjiArai 2:281dbfae5cd0 138
kenjiArai 2:281dbfae5cd0 139 void chk_and_set_time(char *ptr)
kenjiArai 2:281dbfae5cd0 140 {
kenjiArai 2:281dbfae5cd0 141 int32_t p1;
kenjiArai 2:281dbfae5cd0 142 struct tm t;
kenjiArai 2:281dbfae5cd0 143 time_t seconds;
kenjiArai 2:281dbfae5cd0 144
kenjiArai 2:281dbfae5cd0 145 if (xatoi(&ptr, &p1)) {
kenjiArai 2:281dbfae5cd0 146 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 2:281dbfae5cd0 147 pc.printf("Year:%d ",p1);
kenjiArai 2:281dbfae5cd0 148 xatoi( &ptr, &p1 );
kenjiArai 2:281dbfae5cd0 149 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 2:281dbfae5cd0 150 pc.printf("Month:%d ",p1);
kenjiArai 2:281dbfae5cd0 151 xatoi( &ptr, &p1 );
kenjiArai 2:281dbfae5cd0 152 t.tm_mday = (uint8_t)p1;
kenjiArai 2:281dbfae5cd0 153 pc.printf("Day:%d ",p1);
kenjiArai 2:281dbfae5cd0 154 xatoi( &ptr, &p1 );
kenjiArai 2:281dbfae5cd0 155 t.tm_hour = (uint8_t)p1;
kenjiArai 2:281dbfae5cd0 156 pc.printf("Hour:%d ",p1);
kenjiArai 2:281dbfae5cd0 157 xatoi( &ptr, &p1 );
kenjiArai 2:281dbfae5cd0 158 t.tm_min = (uint8_t)p1;
kenjiArai 2:281dbfae5cd0 159 pc.printf("Min:%d ",p1);
kenjiArai 2:281dbfae5cd0 160 xatoi( &ptr, &p1 );
kenjiArai 2:281dbfae5cd0 161 t.tm_sec = (uint8_t)p1;
kenjiArai 2:281dbfae5cd0 162 pc.printf("Sec: %d \r\n",p1);
kenjiArai 2:281dbfae5cd0 163 } else {
kenjiArai 2:281dbfae5cd0 164 return;
kenjiArai 2:281dbfae5cd0 165 }
kenjiArai 2:281dbfae5cd0 166 seconds = mktime(&t);
kenjiArai 2:281dbfae5cd0 167 set_time(seconds);
kenjiArai 2:281dbfae5cd0 168 pc.printf(
kenjiArai 2:281dbfae5cd0 169 "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
kenjiArai 2:281dbfae5cd0 170 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec
kenjiArai 2:281dbfae5cd0 171 );
kenjiArai 2:281dbfae5cd0 172 }
kenjiArai 2:281dbfae5cd0 173
kenjiArai 2:281dbfae5cd0 174 int32_t xatoi (char **str, int32_t *res)
kenjiArai 2:281dbfae5cd0 175 {
kenjiArai 2:281dbfae5cd0 176 int32_t val;
kenjiArai 2:281dbfae5cd0 177 uint8_t c, radix, s = 0;
kenjiArai 2:281dbfae5cd0 178
kenjiArai 2:281dbfae5cd0 179 while ((c = **str) == ' ') {
kenjiArai 2:281dbfae5cd0 180 (*str)++;
kenjiArai 2:281dbfae5cd0 181 }
kenjiArai 2:281dbfae5cd0 182 if (c == '-') {
kenjiArai 2:281dbfae5cd0 183 s = 1;
kenjiArai 2:281dbfae5cd0 184 c = *(++(*str));
kenjiArai 2:281dbfae5cd0 185 }
kenjiArai 2:281dbfae5cd0 186 if (c == '0') {
kenjiArai 2:281dbfae5cd0 187 c = *(++(*str));
kenjiArai 2:281dbfae5cd0 188 if (c <= ' ') {
kenjiArai 2:281dbfae5cd0 189 *res = 0;
kenjiArai 2:281dbfae5cd0 190 return 1;
kenjiArai 2:281dbfae5cd0 191 }
kenjiArai 2:281dbfae5cd0 192 if (c == 'x') {
kenjiArai 2:281dbfae5cd0 193 radix = 16;
kenjiArai 2:281dbfae5cd0 194 c = *(++(*str));
kenjiArai 2:281dbfae5cd0 195 } else {
kenjiArai 2:281dbfae5cd0 196 if (c == 'b') {
kenjiArai 2:281dbfae5cd0 197 radix = 2;
kenjiArai 2:281dbfae5cd0 198 c = *(++(*str));
kenjiArai 2:281dbfae5cd0 199 } else {
kenjiArai 2:281dbfae5cd0 200 if ((c >= '0')&&(c <= '9')) {
kenjiArai 2:281dbfae5cd0 201 radix = 8;
kenjiArai 2:281dbfae5cd0 202 } else {
kenjiArai 2:281dbfae5cd0 203 return 0;
kenjiArai 2:281dbfae5cd0 204 }
kenjiArai 2:281dbfae5cd0 205 }
kenjiArai 2:281dbfae5cd0 206 }
kenjiArai 2:281dbfae5cd0 207 } else {
kenjiArai 2:281dbfae5cd0 208 if ((c < '1')||(c > '9')) {
kenjiArai 2:281dbfae5cd0 209 return 0;
kenjiArai 2:281dbfae5cd0 210 }
kenjiArai 2:281dbfae5cd0 211 radix = 10;
kenjiArai 2:281dbfae5cd0 212 }
kenjiArai 2:281dbfae5cd0 213 val = 0;
kenjiArai 2:281dbfae5cd0 214 while (c > ' ') {
kenjiArai 2:281dbfae5cd0 215 if (c >= 'a') {
kenjiArai 2:281dbfae5cd0 216 c -= 0x20;
kenjiArai 2:281dbfae5cd0 217 }
kenjiArai 2:281dbfae5cd0 218 c -= '0';
kenjiArai 2:281dbfae5cd0 219 if (c >= 17) {
kenjiArai 2:281dbfae5cd0 220 c -= 7;
kenjiArai 2:281dbfae5cd0 221 if (c <= 9) {
kenjiArai 2:281dbfae5cd0 222 return 0;
kenjiArai 2:281dbfae5cd0 223 }
kenjiArai 2:281dbfae5cd0 224 }
kenjiArai 2:281dbfae5cd0 225 if (c >= radix) {
kenjiArai 2:281dbfae5cd0 226 return 0;
kenjiArai 2:281dbfae5cd0 227 }
kenjiArai 2:281dbfae5cd0 228 val = val * radix + c;
kenjiArai 2:281dbfae5cd0 229 c = *(++(*str));
kenjiArai 2:281dbfae5cd0 230 }
kenjiArai 2:281dbfae5cd0 231 if (s) {
kenjiArai 2:281dbfae5cd0 232 val = -val;
kenjiArai 2:281dbfae5cd0 233 }
kenjiArai 2:281dbfae5cd0 234 *res = val;
kenjiArai 2:281dbfae5cd0 235 return 1;
kenjiArai 2:281dbfae5cd0 236 }