Check Deepsleep mode on OS6.6.0

/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:
Fri Jan 15 07:31:54 2021 +0000
Revision:
1:2831faae6ef1
Parent:
0:f8c5c7d19d9a
tested on Mbed-OS6.6.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:f8c5c7d19d9a 1 /*
kenjiArai 0:f8c5c7d19d9a 2 * Mbed Application program
kenjiArai 0:f8c5c7d19d9a 3 * Check Deep Sleep Mode
kenjiArai 0:f8c5c7d19d9a 4 *
kenjiArai 1:2831faae6ef1 5 * Copyright (c) 2020,'21 Kenji Arai / JH1PJL
kenjiArai 0:f8c5c7d19d9a 6 * http://www7b.biglobe.ne.jp/~kenjia/
kenjiArai 0:f8c5c7d19d9a 7 * https://os.mbed.com/users/kenjiArai/
kenjiArai 0:f8c5c7d19d9a 8 * Revised: March 12th, 2020
kenjiArai 1:2831faae6ef1 9 * Revised: January 15th, 2021
kenjiArai 0:f8c5c7d19d9a 10 */
kenjiArai 0:f8c5c7d19d9a 11
kenjiArai 0:f8c5c7d19d9a 12 /*
kenjiArai 0:f8c5c7d19d9a 13 Reference information:
kenjiArai 1:2831faae6ef1 14 https://os.mbed.com/docs/mbed-os/v6.6/apis/power-management-sleep.html
kenjiArai 0:f8c5c7d19d9a 15 https://forums.mbed.com/t/how-to-deep-sleep/7551
kenjiArai 0:f8c5c7d19d9a 16
kenjiArai 1:2831faae6ef1 17 Tested on with mbed-os5.15.1
kenjiArai 1:2831faae6ef1 18 https://os.mbed.com/users/kenjiArai/code/Check_DeepSleep_os5/
kenjiArai 1:2831faae6ef1 19 Nucleo-L152RE -> 4.23uA (Normal run = 5mA to 8mA)
kenjiArai 1:2831faae6ef1 20 Nucleo-L476RG -> 2.13uA (Normal run = 7mA to 10mA)
kenjiArai 1:2831faae6ef1 21 Nucleo-F411RE -> 1.91mA (not uA)(Normal run = 7mA to 10mA)
kenjiArai 1:2831faae6ef1 22 Nucleo-F446RE -> 1.67mA (not uA)(Normal run = 14mA to 17mA)
kenjiArai 1:2831faae6ef1 23 Tested on with mbed-os6.6.0
kenjiArai 1:2831faae6ef1 24 Nucleo-L152RE -> 4.22uA (Normal run = 4mA to 7mA)
kenjiArai 1:2831faae6ef1 25 Nucleo-L476RG -> 2.23uA (Normal run = 7mA to 10mA)
kenjiArai 1:2831faae6ef1 26 Nucleo-F411RE -> 1.65mA (not uA)(Normal run = 7mA to 10mA)
kenjiArai 1:2831faae6ef1 27 Nucleo-F446RE -> 1.76mA (not uA)(Normal run = 14mA to 16mA)
kenjiArai 1:2831faae6ef1 28
kenjiArai 1:2831faae6ef1 29 Current Measurement:
kenjiArai 1:2831faae6ef1 30 Nucleo board has IDD Jumper (JP6).
kenjiArai 1:2831faae6ef1 31 I measured CPU current using Digital Multi-meter DCI mode.
kenjiArai 0:f8c5c7d19d9a 32 */
kenjiArai 0:f8c5c7d19d9a 33
kenjiArai 0:f8c5c7d19d9a 34 // Include --------------------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 35 #include "mbed.h"
kenjiArai 0:f8c5c7d19d9a 36
kenjiArai 0:f8c5c7d19d9a 37 // Definition -----------------------------------------------------------------
kenjiArai 1:2831faae6ef1 38 #define MODE 1 // MODE=3 does NOT work due to wait_ms() is abolished
kenjiArai 0:f8c5c7d19d9a 39
kenjiArai 0:f8c5c7d19d9a 40 // Constructor ----------------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 41 DigitalIn my_sw(USER_BUTTON);
kenjiArai 0:f8c5c7d19d9a 42 DigitalOut myled(LED1,1);
kenjiArai 1:2831faae6ef1 43 static BufferedSerial pc(USBTX, USBRX, 9600);
kenjiArai 0:f8c5c7d19d9a 44 AnalogIn a_in(A0);
kenjiArai 0:f8c5c7d19d9a 45 Timer t;
kenjiArai 0:f8c5c7d19d9a 46
kenjiArai 0:f8c5c7d19d9a 47 // RAM ------------------------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 48
kenjiArai 0:f8c5c7d19d9a 49 // ROM / Constant data --------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 50
kenjiArai 0:f8c5c7d19d9a 51 // Function prototypes --------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 52 void sw_irq(void);
kenjiArai 0:f8c5c7d19d9a 53 void LowPowerConfiguration(void);
kenjiArai 0:f8c5c7d19d9a 54 void time_enter_mode(void);
kenjiArai 0:f8c5c7d19d9a 55 void chk_and_set_time(char *ptr);
kenjiArai 0:f8c5c7d19d9a 56 int32_t xatoi (char **str, int32_t *res);
kenjiArai 1:2831faae6ef1 57 void get_line (char *buff, int32_t len);
kenjiArai 0:f8c5c7d19d9a 58 void print_revision(void);
kenjiArai 0:f8c5c7d19d9a 59
kenjiArai 0:f8c5c7d19d9a 60 //------------------------------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 61 // Control Program
kenjiArai 0:f8c5c7d19d9a 62 //------------------------------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 63 int main()
kenjiArai 0:f8c5c7d19d9a 64 {
kenjiArai 0:f8c5c7d19d9a 65 time_t seconds;
kenjiArai 0:f8c5c7d19d9a 66 char buf[64];
kenjiArai 0:f8c5c7d19d9a 67 uint32_t t_pass = 0;
kenjiArai 0:f8c5c7d19d9a 68 uint32_t loop_count = 1;
kenjiArai 0:f8c5c7d19d9a 69 float ain;
kenjiArai 0:f8c5c7d19d9a 70
kenjiArai 0:f8c5c7d19d9a 71 printf("\r\nCheck current consumption at Deep-sleep mode.\r\n");
kenjiArai 0:f8c5c7d19d9a 72 print_revision();
kenjiArai 1:2831faae6ef1 73 #if MODE == 1
kenjiArai 1:2831faae6ef1 74 printf("-->MODE=1 --> Use ThisThread::sleep_for() function.\r\n");
kenjiArai 1:2831faae6ef1 75 #elif MODE == 2
kenjiArai 1:2831faae6ef1 76 printf("-->MODE=2 --> Use thread_sleep_for() function.\r\n");
kenjiArai 1:2831faae6ef1 77 #elif MODE == 3
kenjiArai 1:2831faae6ef1 78 printf("-->MODE=3 --> Use wait_ms() function.\r\n");
kenjiArai 1:2831faae6ef1 79 #endif
kenjiArai 0:f8c5c7d19d9a 80 seconds = time(NULL);
kenjiArai 0:f8c5c7d19d9a 81 while (my_sw == 0) {;}
kenjiArai 1:2831faae6ef1 82 ThisThread::sleep_for(10ms);
kenjiArai 0:f8c5c7d19d9a 83 while (true) {
kenjiArai 0:f8c5c7d19d9a 84 t.reset();
kenjiArai 0:f8c5c7d19d9a 85 t.start();
kenjiArai 1:2831faae6ef1 86 if ((my_sw == 0) || (loop_count > 10)) {
kenjiArai 0:f8c5c7d19d9a 87 LowPowerConfiguration();
kenjiArai 0:f8c5c7d19d9a 88 InterruptIn my_irq(USER_BUTTON);
kenjiArai 0:f8c5c7d19d9a 89 while (my_irq.read() == 0) {;}
kenjiArai 1:2831faae6ef1 90 ThisThread::sleep_for(100ms);
kenjiArai 0:f8c5c7d19d9a 91 my_irq.fall(sw_irq);
kenjiArai 0:f8c5c7d19d9a 92 t.stop();
kenjiArai 1:2831faae6ef1 93 //------------ IMPORTANT-------------------
kenjiArai 1:2831faae6ef1 94 // 1) removes the receive interrupt handler
kenjiArai 1:2831faae6ef1 95 pc.enable_input(false);
kenjiArai 1:2831faae6ef1 96 // 2) and releases the deep sleep lock
kenjiArai 1:2831faae6ef1 97 sleep_manager_can_deep_sleep();
kenjiArai 1:2831faae6ef1 98 // 3) then enter Deep Sleep mode
kenjiArai 1:2831faae6ef1 99 #if MODE == 1
kenjiArai 1:2831faae6ef1 100 ThisThread::sleep_for(10s);
kenjiArai 1:2831faae6ef1 101 #elif MODE == 2
kenjiArai 1:2831faae6ef1 102 thread_sleep_for(10000);
kenjiArai 1:2831faae6ef1 103 #elif MODE == 3
kenjiArai 1:2831faae6ef1 104 wait_ms(10000);
kenjiArai 1:2831faae6ef1 105 #endif
kenjiArai 0:f8c5c7d19d9a 106 system_reset();
kenjiArai 0:f8c5c7d19d9a 107 }
kenjiArai 0:f8c5c7d19d9a 108 ain = a_in.read();
kenjiArai 0:f8c5c7d19d9a 109 myled = !myled;
kenjiArai 0:f8c5c7d19d9a 110 seconds = time(NULL);
kenjiArai 0:f8c5c7d19d9a 111 strftime(buf, 50, "%H:%M:%S -> ", localtime(&seconds));
kenjiArai 1:2831faae6ef1 112 printf("%s", buf);
kenjiArai 1:2831faae6ef1 113 printf(
kenjiArai 1:2831faae6ef1 114 "analog = %4.3f, processing time=%3d, counter=%4d\r\n",
kenjiArai 0:f8c5c7d19d9a 115 ain, t_pass, loop_count++
kenjiArai 0:f8c5c7d19d9a 116 );
kenjiArai 1:2831faae6ef1 117 t_pass = chrono::duration_cast<chrono::milliseconds>(
kenjiArai 1:2831faae6ef1 118 t.elapsed_time()).count();
kenjiArai 1:2831faae6ef1 119 ThisThread::sleep_for(chrono::milliseconds(1000 - t_pass));
kenjiArai 1:2831faae6ef1 120 if (pc.readable()) {
kenjiArai 1:2831faae6ef1 121 strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
kenjiArai 1:2831faae6ef1 122 printf("[Time] %s\r\n", buf);
kenjiArai 1:2831faae6ef1 123 time_enter_mode();
kenjiArai 1:2831faae6ef1 124 }
kenjiArai 0:f8c5c7d19d9a 125 }
kenjiArai 0:f8c5c7d19d9a 126 }
kenjiArai 0:f8c5c7d19d9a 127
kenjiArai 0:f8c5c7d19d9a 128
kenjiArai 0:f8c5c7d19d9a 129 void sw_irq(void)
kenjiArai 0:f8c5c7d19d9a 130 {
kenjiArai 0:f8c5c7d19d9a 131 system_reset();
kenjiArai 0:f8c5c7d19d9a 132 }
kenjiArai 0:f8c5c7d19d9a 133
kenjiArai 0:f8c5c7d19d9a 134 void LowPowerConfiguration(void)
kenjiArai 0:f8c5c7d19d9a 135 {
kenjiArai 0:f8c5c7d19d9a 136 #if defined(TARGET_NUCLEO_L152RE)
kenjiArai 0:f8c5c7d19d9a 137 RCC->AHBENR |=
kenjiArai 0:f8c5c7d19d9a 138 (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN |
kenjiArai 0:f8c5c7d19d9a 139 RCC_AHBENR_GPIODEN | RCC_AHBENR_GPIOHEN);
kenjiArai 1:2831faae6ef1 140 #elif defined(TARGET_NUCLEO_L476RG)
kenjiArai 1:2831faae6ef1 141
kenjiArai 0:f8c5c7d19d9a 142 #elif defined(TARGET_NUCLEO_F446RE)
kenjiArai 0:f8c5c7d19d9a 143 RCC->AHB1ENR |=
kenjiArai 0:f8c5c7d19d9a 144 (RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN |
kenjiArai 0:f8c5c7d19d9a 145 RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOHEN);
kenjiArai 0:f8c5c7d19d9a 146 #endif
kenjiArai 0:f8c5c7d19d9a 147 GPIO_InitTypeDef GPIO_InitStruct;
kenjiArai 0:f8c5c7d19d9a 148 // All other ports are analog input mode
kenjiArai 0:f8c5c7d19d9a 149 GPIO_InitStruct.Pin = GPIO_PIN_All;
kenjiArai 0:f8c5c7d19d9a 150 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
kenjiArai 0:f8c5c7d19d9a 151 GPIO_InitStruct.Pull = GPIO_NOPULL;
kenjiArai 0:f8c5c7d19d9a 152 GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
kenjiArai 0:f8c5c7d19d9a 153 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
kenjiArai 0:f8c5c7d19d9a 154 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
kenjiArai 0:f8c5c7d19d9a 155 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
kenjiArai 0:f8c5c7d19d9a 156 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
kenjiArai 0:f8c5c7d19d9a 157 HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
kenjiArai 0:f8c5c7d19d9a 158 HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
kenjiArai 0:f8c5c7d19d9a 159 #if defined(TARGET_NUCLEO_L152RE)
kenjiArai 0:f8c5c7d19d9a 160 RCC->AHBENR &=
kenjiArai 0:f8c5c7d19d9a 161 ~(RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN |RCC_AHBENR_GPIOCEN |
kenjiArai 0:f8c5c7d19d9a 162 RCC_AHBENR_GPIODEN | RCC_AHBENR_GPIOHEN);
kenjiArai 1:2831faae6ef1 163 #elif defined(TARGET_NUCLEO_L476RG)
kenjiArai 1:2831faae6ef1 164 RCC->AHB1ENR = 0;
kenjiArai 1:2831faae6ef1 165 RCC->AHB2ENR = 0;
kenjiArai 1:2831faae6ef1 166 RCC->AHB3ENR = 0;
kenjiArai 1:2831faae6ef1 167 RCC->APB1ENR2 = 0;
kenjiArai 1:2831faae6ef1 168 RCC->APB2ENR = 0;
kenjiArai 0:f8c5c7d19d9a 169 #elif defined(TARGET_NUCLEO_F446RE)
kenjiArai 1:2831faae6ef1 170 RCC->AHB1ENR = 0;
kenjiArai 1:2831faae6ef1 171 RCC->AHB2ENR = 0;
kenjiArai 1:2831faae6ef1 172 RCC->AHB3ENR = 0;
kenjiArai 1:2831faae6ef1 173 RCC->APB1ENR = 0x8; // alive TIM5
kenjiArai 1:2831faae6ef1 174 RCC->APB2ENR = 0;
kenjiArai 1:2831faae6ef1 175 RCC->AHB1LPENR = 0;
kenjiArai 1:2831faae6ef1 176 RCC->AHB2LPENR = 0;
kenjiArai 1:2831faae6ef1 177 RCC->APB1LPENR = 0x8; // alive TIM5
kenjiArai 1:2831faae6ef1 178 RCC->APB2LPENR = 0;
kenjiArai 0:f8c5c7d19d9a 179 #endif
kenjiArai 0:f8c5c7d19d9a 180 }
kenjiArai 0:f8c5c7d19d9a 181
kenjiArai 0:f8c5c7d19d9a 182 void time_enter_mode(void)
kenjiArai 0:f8c5c7d19d9a 183 {
kenjiArai 0:f8c5c7d19d9a 184 char *ptr;
kenjiArai 0:f8c5c7d19d9a 185 char linebuf[64];
kenjiArai 0:f8c5c7d19d9a 186
kenjiArai 1:2831faae6ef1 187 if (pc.readable()) {
kenjiArai 1:2831faae6ef1 188 pc.read(linebuf, 1); // dummy read
kenjiArai 1:2831faae6ef1 189 }
kenjiArai 1:2831faae6ef1 190 puts("\r\nSet time into RTC");
kenjiArai 1:2831faae6ef1 191 puts(" e.g. >21 1 12 13 14 15 -> January 12,'21, 13:14:14");
kenjiArai 1:2831faae6ef1 192 linebuf[0] = '>';
kenjiArai 1:2831faae6ef1 193 pc.write(linebuf, 1);
kenjiArai 0:f8c5c7d19d9a 194 ptr = linebuf;
kenjiArai 0:f8c5c7d19d9a 195 get_line(ptr, sizeof(linebuf));
kenjiArai 1:2831faae6ef1 196 puts("\r");
kenjiArai 0:f8c5c7d19d9a 197 chk_and_set_time(ptr);
kenjiArai 0:f8c5c7d19d9a 198 }
kenjiArai 0:f8c5c7d19d9a 199
kenjiArai 1:2831faae6ef1 200 // Change string -> integer
kenjiArai 1:2831faae6ef1 201 int32_t xatoi(char **str, int32_t *res)
kenjiArai 0:f8c5c7d19d9a 202 {
kenjiArai 1:2831faae6ef1 203 uint32_t val;
kenjiArai 0:f8c5c7d19d9a 204 uint8_t c, radix, s = 0;
kenjiArai 0:f8c5c7d19d9a 205
kenjiArai 1:2831faae6ef1 206 while ((c = **str) == ' ') (*str)++;
kenjiArai 0:f8c5c7d19d9a 207 if (c == '-') {
kenjiArai 0:f8c5c7d19d9a 208 s = 1;
kenjiArai 0:f8c5c7d19d9a 209 c = *(++(*str));
kenjiArai 0:f8c5c7d19d9a 210 }
kenjiArai 0:f8c5c7d19d9a 211 if (c == '0') {
kenjiArai 0:f8c5c7d19d9a 212 c = *(++(*str));
kenjiArai 0:f8c5c7d19d9a 213 if (c <= ' ') {
kenjiArai 0:f8c5c7d19d9a 214 *res = 0;
kenjiArai 0:f8c5c7d19d9a 215 return 1;
kenjiArai 0:f8c5c7d19d9a 216 }
kenjiArai 0:f8c5c7d19d9a 217 if (c == 'x') {
kenjiArai 0:f8c5c7d19d9a 218 radix = 16;
kenjiArai 0:f8c5c7d19d9a 219 c = *(++(*str));
kenjiArai 0:f8c5c7d19d9a 220 } else {
kenjiArai 0:f8c5c7d19d9a 221 if (c == 'b') {
kenjiArai 0:f8c5c7d19d9a 222 radix = 2;
kenjiArai 0:f8c5c7d19d9a 223 c = *(++(*str));
kenjiArai 0:f8c5c7d19d9a 224 } else {
kenjiArai 0:f8c5c7d19d9a 225 if ((c >= '0')&&(c <= '9')) {
kenjiArai 0:f8c5c7d19d9a 226 radix = 8;
kenjiArai 1:2831faae6ef1 227 } else {
kenjiArai 0:f8c5c7d19d9a 228 return 0;
kenjiArai 0:f8c5c7d19d9a 229 }
kenjiArai 0:f8c5c7d19d9a 230 }
kenjiArai 0:f8c5c7d19d9a 231 }
kenjiArai 0:f8c5c7d19d9a 232 } else {
kenjiArai 0:f8c5c7d19d9a 233 if ((c < '1')||(c > '9')) {
kenjiArai 0:f8c5c7d19d9a 234 return 0;
kenjiArai 0:f8c5c7d19d9a 235 }
kenjiArai 0:f8c5c7d19d9a 236 radix = 10;
kenjiArai 0:f8c5c7d19d9a 237 }
kenjiArai 0:f8c5c7d19d9a 238 val = 0;
kenjiArai 0:f8c5c7d19d9a 239 while (c > ' ') {
kenjiArai 1:2831faae6ef1 240 if (c >= 'a') c -= 0x20;
kenjiArai 0:f8c5c7d19d9a 241 c -= '0';
kenjiArai 0:f8c5c7d19d9a 242 if (c >= 17) {
kenjiArai 0:f8c5c7d19d9a 243 c -= 7;
kenjiArai 1:2831faae6ef1 244 if (c <= 9) return 0;
kenjiArai 0:f8c5c7d19d9a 245 }
kenjiArai 1:2831faae6ef1 246 if (c >= radix) return 0;
kenjiArai 0:f8c5c7d19d9a 247 val = val * radix + c;
kenjiArai 0:f8c5c7d19d9a 248 c = *(++(*str));
kenjiArai 0:f8c5c7d19d9a 249 }
kenjiArai 1:2831faae6ef1 250 if (s) val = -val;
kenjiArai 0:f8c5c7d19d9a 251 *res = val;
kenjiArai 0:f8c5c7d19d9a 252 return 1;
kenjiArai 0:f8c5c7d19d9a 253 }
kenjiArai 1:2831faae6ef1 254
kenjiArai 1:2831faae6ef1 255 // Get key input data
kenjiArai 1:2831faae6ef1 256 void get_line(char *buff, int32_t len)
kenjiArai 1:2831faae6ef1 257 {
kenjiArai 1:2831faae6ef1 258 char c;
kenjiArai 1:2831faae6ef1 259 char bf[8];
kenjiArai 1:2831faae6ef1 260 int32_t idx = 0;
kenjiArai 1:2831faae6ef1 261
kenjiArai 1:2831faae6ef1 262 for (;;) {
kenjiArai 1:2831faae6ef1 263 pc.read(bf, 1);
kenjiArai 1:2831faae6ef1 264 c = bf[0];
kenjiArai 1:2831faae6ef1 265 //printf("0x%x \r\n", c);
kenjiArai 1:2831faae6ef1 266 if (c == '\r') {
kenjiArai 1:2831faae6ef1 267 buff[idx++] = c;
kenjiArai 1:2831faae6ef1 268 break;
kenjiArai 1:2831faae6ef1 269 }
kenjiArai 1:2831faae6ef1 270 if ((c == '\b') && idx) {
kenjiArai 1:2831faae6ef1 271 idx--;
kenjiArai 1:2831faae6ef1 272 const char bf_bs[] =
kenjiArai 1:2831faae6ef1 273 {0x1b, '[', '1', 'D', ' ', 0x1b, '[', '1', 'D'};
kenjiArai 1:2831faae6ef1 274 pc.write(bf_bs, 9);
kenjiArai 1:2831faae6ef1 275 }
kenjiArai 1:2831faae6ef1 276 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 1:2831faae6ef1 277 buff[idx++] = c;
kenjiArai 1:2831faae6ef1 278 pc.write(bf, 1);
kenjiArai 1:2831faae6ef1 279 }
kenjiArai 1:2831faae6ef1 280 }
kenjiArai 1:2831faae6ef1 281 buff[idx] = 0;
kenjiArai 1:2831faae6ef1 282 bf[0] = '\n';
kenjiArai 1:2831faae6ef1 283 pc.write(bf, 1);
kenjiArai 1:2831faae6ef1 284 }
kenjiArai 1:2831faae6ef1 285
kenjiArai 1:2831faae6ef1 286 // Check key input strings and set time
kenjiArai 1:2831faae6ef1 287 void chk_and_set_time(char *ptr)
kenjiArai 1:2831faae6ef1 288 {
kenjiArai 1:2831faae6ef1 289 int32_t p1;
kenjiArai 1:2831faae6ef1 290 struct tm t;
kenjiArai 1:2831faae6ef1 291 time_t seconds;
kenjiArai 1:2831faae6ef1 292
kenjiArai 1:2831faae6ef1 293 if (xatoi(&ptr, &p1)) {
kenjiArai 1:2831faae6ef1 294 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 1:2831faae6ef1 295 printf("Year:%d ",p1);
kenjiArai 1:2831faae6ef1 296 xatoi( &ptr, &p1 );
kenjiArai 1:2831faae6ef1 297 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 1:2831faae6ef1 298 printf("Month:%d ",p1);
kenjiArai 1:2831faae6ef1 299 xatoi( &ptr, &p1 );
kenjiArai 1:2831faae6ef1 300 t.tm_mday = (uint8_t)p1;
kenjiArai 1:2831faae6ef1 301 printf("Day:%d ",p1);
kenjiArai 1:2831faae6ef1 302 xatoi( &ptr, &p1 );
kenjiArai 1:2831faae6ef1 303 t.tm_hour = (uint8_t)p1;
kenjiArai 1:2831faae6ef1 304 printf("Hour:%d ",p1);
kenjiArai 1:2831faae6ef1 305 xatoi( &ptr, &p1 );
kenjiArai 1:2831faae6ef1 306 t.tm_min = (uint8_t)p1;
kenjiArai 1:2831faae6ef1 307 printf("Min:%d ",p1);
kenjiArai 1:2831faae6ef1 308 xatoi( &ptr, &p1 );
kenjiArai 1:2831faae6ef1 309 t.tm_sec = (uint8_t)p1;
kenjiArai 1:2831faae6ef1 310 printf("Sec: %d \r\n",p1);
kenjiArai 1:2831faae6ef1 311 } else {
kenjiArai 1:2831faae6ef1 312 return;
kenjiArai 1:2831faae6ef1 313 }
kenjiArai 1:2831faae6ef1 314 seconds = mktime(&t);
kenjiArai 1:2831faae6ef1 315 set_time(seconds);
kenjiArai 1:2831faae6ef1 316 // Show Time with several example
kenjiArai 1:2831faae6ef1 317 // ex.1
kenjiArai 1:2831faae6ef1 318 printf(
kenjiArai 1:2831faae6ef1 319 "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
kenjiArai 1:2831faae6ef1 320 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec
kenjiArai 1:2831faae6ef1 321 );
kenjiArai 1:2831faae6ef1 322 char buf[64];
kenjiArai 1:2831faae6ef1 323 // ex.2
kenjiArai 1:2831faae6ef1 324 strftime(buf, 40, "%x %X", localtime(&seconds));
kenjiArai 1:2831faae6ef1 325 printf("Date: %s\r\n", buf);
kenjiArai 1:2831faae6ef1 326 // ex.3
kenjiArai 1:2831faae6ef1 327 strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 1:2831faae6ef1 328 printf("Date: %s\r\n", buf);
kenjiArai 1:2831faae6ef1 329 // ex.4
kenjiArai 1:2831faae6ef1 330 strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
kenjiArai 1:2831faae6ef1 331 printf("Date: %s\r\n", buf);
kenjiArai 1:2831faae6ef1 332 }