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

Dependencies:   mbed WakeUp_STM32

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

Committer:
kenjiArai
Date:
Fri Mar 13 03:33:50 2020 +0000
Revision:
3:1d19ad5ddf52
Parent:
2:4793eeeac6d0
modified comments and constant

Who changed what in which revision?

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