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:
Thu Mar 12 09:19:48 2020 +0000
Revision:
0:f8c5c7d19d9a
Child:
1:2831faae6ef1
check ThisThread::sleep_for() + json MBED_TICKLESS function for CPU IDD reduction

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 0:f8c5c7d19d9a 5 * Copyright (c) 2020 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 0:f8c5c7d19d9a 9 * Revised: March 12th, 2020
kenjiArai 0:f8c5c7d19d9a 10 */
kenjiArai 0:f8c5c7d19d9a 11
kenjiArai 0:f8c5c7d19d9a 12 /*
kenjiArai 0:f8c5c7d19d9a 13 Reference information:
kenjiArai 0:f8c5c7d19d9a 14 https://forums.mbed.com/t/how-to-deep-sleep/7551
kenjiArai 0:f8c5c7d19d9a 15
kenjiArai 0:f8c5c7d19d9a 16 Tested on
kenjiArai 0:f8c5c7d19d9a 17 Nucleo-L152RE -> less than 20uA
kenjiArai 0:f8c5c7d19d9a 18 Nucleo-F446RE -> 1.5mA
kenjiArai 0:f8c5c7d19d9a 19 */
kenjiArai 0:f8c5c7d19d9a 20
kenjiArai 0:f8c5c7d19d9a 21 // Include --------------------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 22 #include "mbed.h"
kenjiArai 0:f8c5c7d19d9a 23
kenjiArai 0:f8c5c7d19d9a 24 // Definition -----------------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 25 // https://keisan.casio.jp/exec/system/1526003938
kenjiArai 0:f8c5c7d19d9a 26 #define DATE_20200222_222222 1582377742 // 2020/2/22 22:22:22
kenjiArai 0:f8c5c7d19d9a 27
kenjiArai 0:f8c5c7d19d9a 28 // Constructor ----------------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 29 DigitalIn my_sw(USER_BUTTON);
kenjiArai 0:f8c5c7d19d9a 30 DigitalOut myled(LED1,1);
kenjiArai 0:f8c5c7d19d9a 31 Serial pc(USBTX, USBRX);
kenjiArai 0:f8c5c7d19d9a 32 AnalogIn a_in(A0);
kenjiArai 0:f8c5c7d19d9a 33 Timer t;
kenjiArai 0:f8c5c7d19d9a 34
kenjiArai 0:f8c5c7d19d9a 35 // RAM ------------------------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 36
kenjiArai 0:f8c5c7d19d9a 37 // ROM / Constant data --------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 38
kenjiArai 0:f8c5c7d19d9a 39 // Function prototypes --------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 40 void sw_irq(void);
kenjiArai 0:f8c5c7d19d9a 41 void LowPowerConfiguration(void);
kenjiArai 0:f8c5c7d19d9a 42 void time_enter_mode(void);
kenjiArai 0:f8c5c7d19d9a 43 void chk_and_set_time(char *ptr);
kenjiArai 0:f8c5c7d19d9a 44 int32_t xatoi (char **str, int32_t *res);
kenjiArai 0:f8c5c7d19d9a 45 void get_line (char *buff, int len);
kenjiArai 0:f8c5c7d19d9a 46 void print_revision(void);
kenjiArai 0:f8c5c7d19d9a 47
kenjiArai 0:f8c5c7d19d9a 48 //------------------------------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 49 // Control Program
kenjiArai 0:f8c5c7d19d9a 50 //------------------------------------------------------------------------------
kenjiArai 0:f8c5c7d19d9a 51 int main()
kenjiArai 0:f8c5c7d19d9a 52 {
kenjiArai 0:f8c5c7d19d9a 53 time_t seconds;
kenjiArai 0:f8c5c7d19d9a 54 char buf[64];
kenjiArai 0:f8c5c7d19d9a 55 uint32_t t_pass = 0;
kenjiArai 0:f8c5c7d19d9a 56 uint32_t loop_count = 1;
kenjiArai 0:f8c5c7d19d9a 57 float ain;
kenjiArai 0:f8c5c7d19d9a 58
kenjiArai 0:f8c5c7d19d9a 59 printf("\r\nCheck current consumption at Deep-sleep mode.\r\n");
kenjiArai 0:f8c5c7d19d9a 60 print_revision();
kenjiArai 0:f8c5c7d19d9a 61 seconds = time(NULL);
kenjiArai 0:f8c5c7d19d9a 62 if (seconds < DATE_20200222_222222) {
kenjiArai 0:f8c5c7d19d9a 63 strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
kenjiArai 0:f8c5c7d19d9a 64 pc.printf("[Time] %s\r\n", buf);
kenjiArai 0:f8c5c7d19d9a 65 time_enter_mode();
kenjiArai 0:f8c5c7d19d9a 66 }
kenjiArai 0:f8c5c7d19d9a 67 while (my_sw == 0) {;}
kenjiArai 0:f8c5c7d19d9a 68 ThisThread::sleep_for(10);
kenjiArai 0:f8c5c7d19d9a 69 while (true) {
kenjiArai 0:f8c5c7d19d9a 70 t.reset();
kenjiArai 0:f8c5c7d19d9a 71 t.start();
kenjiArai 0:f8c5c7d19d9a 72 if ((my_sw == 0) || (loop_count > 20)) {
kenjiArai 0:f8c5c7d19d9a 73 LowPowerConfiguration();
kenjiArai 0:f8c5c7d19d9a 74 InterruptIn my_irq(USER_BUTTON);
kenjiArai 0:f8c5c7d19d9a 75 while (my_irq.read() == 0) {;}
kenjiArai 0:f8c5c7d19d9a 76 ThisThread::sleep_for(100);
kenjiArai 0:f8c5c7d19d9a 77 my_irq.fall(sw_irq);
kenjiArai 0:f8c5c7d19d9a 78 t.stop();
kenjiArai 0:f8c5c7d19d9a 79 ThisThread::sleep_for(10000);
kenjiArai 0:f8c5c7d19d9a 80 system_reset();
kenjiArai 0:f8c5c7d19d9a 81 }
kenjiArai 0:f8c5c7d19d9a 82 ain = a_in.read();
kenjiArai 0:f8c5c7d19d9a 83 myled = !myled;
kenjiArai 0:f8c5c7d19d9a 84 seconds = time(NULL);
kenjiArai 0:f8c5c7d19d9a 85 strftime(buf, 50, "%H:%M:%S -> ", localtime(&seconds));
kenjiArai 0:f8c5c7d19d9a 86 pc.printf("%s", buf);
kenjiArai 0:f8c5c7d19d9a 87 pc.printf(
kenjiArai 0:f8c5c7d19d9a 88 "analog = %4.3f, loop_time=%3d, counter=%4d\r\n",
kenjiArai 0:f8c5c7d19d9a 89 ain, t_pass, loop_count++
kenjiArai 0:f8c5c7d19d9a 90 );
kenjiArai 0:f8c5c7d19d9a 91 t_pass = t.read_ms();
kenjiArai 0:f8c5c7d19d9a 92 ThisThread::sleep_for(1000 - t_pass);
kenjiArai 0:f8c5c7d19d9a 93 }
kenjiArai 0:f8c5c7d19d9a 94 }
kenjiArai 0:f8c5c7d19d9a 95
kenjiArai 0:f8c5c7d19d9a 96
kenjiArai 0:f8c5c7d19d9a 97 void sw_irq(void)
kenjiArai 0:f8c5c7d19d9a 98 {
kenjiArai 0:f8c5c7d19d9a 99 system_reset();
kenjiArai 0:f8c5c7d19d9a 100 }
kenjiArai 0:f8c5c7d19d9a 101
kenjiArai 0:f8c5c7d19d9a 102 void LowPowerConfiguration(void)
kenjiArai 0:f8c5c7d19d9a 103 {
kenjiArai 0:f8c5c7d19d9a 104 #if defined(TARGET_NUCLEO_L152RE)
kenjiArai 0:f8c5c7d19d9a 105 RCC->AHBENR |=
kenjiArai 0:f8c5c7d19d9a 106 (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN |
kenjiArai 0:f8c5c7d19d9a 107 RCC_AHBENR_GPIODEN | RCC_AHBENR_GPIOHEN);
kenjiArai 0:f8c5c7d19d9a 108 #elif defined(TARGET_NUCLEO_F446RE)
kenjiArai 0:f8c5c7d19d9a 109 RCC->AHB1ENR |=
kenjiArai 0:f8c5c7d19d9a 110 (RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN |
kenjiArai 0:f8c5c7d19d9a 111 RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOHEN);
kenjiArai 0:f8c5c7d19d9a 112 #endif
kenjiArai 0:f8c5c7d19d9a 113 GPIO_InitTypeDef GPIO_InitStruct;
kenjiArai 0:f8c5c7d19d9a 114 // All other ports are analog input mode
kenjiArai 0:f8c5c7d19d9a 115 GPIO_InitStruct.Pin = GPIO_PIN_All;
kenjiArai 0:f8c5c7d19d9a 116 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
kenjiArai 0:f8c5c7d19d9a 117 GPIO_InitStruct.Pull = GPIO_NOPULL;
kenjiArai 0:f8c5c7d19d9a 118 GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
kenjiArai 0:f8c5c7d19d9a 119 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
kenjiArai 0:f8c5c7d19d9a 120 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
kenjiArai 0:f8c5c7d19d9a 121 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
kenjiArai 0:f8c5c7d19d9a 122 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
kenjiArai 0:f8c5c7d19d9a 123 HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
kenjiArai 0:f8c5c7d19d9a 124 HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
kenjiArai 0:f8c5c7d19d9a 125 #if defined(TARGET_NUCLEO_L152RE)
kenjiArai 0:f8c5c7d19d9a 126 RCC->AHBENR &=
kenjiArai 0:f8c5c7d19d9a 127 ~(RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN |RCC_AHBENR_GPIOCEN |
kenjiArai 0:f8c5c7d19d9a 128 RCC_AHBENR_GPIODEN | RCC_AHBENR_GPIOHEN);
kenjiArai 0:f8c5c7d19d9a 129 #elif defined(TARGET_NUCLEO_F446RE)
kenjiArai 0:f8c5c7d19d9a 130 RCC->AHB1ENR &=
kenjiArai 0:f8c5c7d19d9a 131 ~(RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN |
kenjiArai 0:f8c5c7d19d9a 132 RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOHEN);
kenjiArai 0:f8c5c7d19d9a 133 __HAL_RCC_TIM1_CLK_DISABLE();
kenjiArai 0:f8c5c7d19d9a 134 __HAL_RCC_USART1_CLK_DISABLE();
kenjiArai 0:f8c5c7d19d9a 135 __HAL_RCC_USART6_CLK_DISABLE();
kenjiArai 0:f8c5c7d19d9a 136 __HAL_RCC_ADC1_CLK_DISABLE();
kenjiArai 0:f8c5c7d19d9a 137 __HAL_RCC_SPI1_CLK_DISABLE();
kenjiArai 0:f8c5c7d19d9a 138 __HAL_RCC_SYSCFG_CLK_DISABLE();
kenjiArai 0:f8c5c7d19d9a 139 __HAL_RCC_TIM9_CLK_DISABLE();
kenjiArai 0:f8c5c7d19d9a 140 __HAL_RCC_TIM11_CLK_DISABLE();
kenjiArai 0:f8c5c7d19d9a 141 #endif
kenjiArai 0:f8c5c7d19d9a 142 }
kenjiArai 0:f8c5c7d19d9a 143
kenjiArai 0:f8c5c7d19d9a 144 void time_enter_mode(void)
kenjiArai 0:f8c5c7d19d9a 145 {
kenjiArai 0:f8c5c7d19d9a 146 char *ptr;
kenjiArai 0:f8c5c7d19d9a 147 char linebuf[64];
kenjiArai 0:f8c5c7d19d9a 148
kenjiArai 0:f8c5c7d19d9a 149 pc.printf("\r\nSet time into RTC\r\n");
kenjiArai 0:f8c5c7d19d9a 150 pc.printf(" e.g. >20 2 22 22 22 22 -> February 22,'20, 22:22:22\r\n");
kenjiArai 0:f8c5c7d19d9a 151 pc.putc('>');
kenjiArai 0:f8c5c7d19d9a 152 ptr = linebuf;
kenjiArai 0:f8c5c7d19d9a 153 get_line(ptr, sizeof(linebuf));
kenjiArai 0:f8c5c7d19d9a 154 pc.printf("\r");
kenjiArai 0:f8c5c7d19d9a 155 chk_and_set_time(ptr);
kenjiArai 0:f8c5c7d19d9a 156 }
kenjiArai 0:f8c5c7d19d9a 157
kenjiArai 0:f8c5c7d19d9a 158 void get_line (char *buff, int len)
kenjiArai 0:f8c5c7d19d9a 159 {
kenjiArai 0:f8c5c7d19d9a 160 char c;
kenjiArai 0:f8c5c7d19d9a 161 uint32_t idx = 0;
kenjiArai 0:f8c5c7d19d9a 162
kenjiArai 0:f8c5c7d19d9a 163 while(true) {
kenjiArai 0:f8c5c7d19d9a 164 c = pc.getc();
kenjiArai 0:f8c5c7d19d9a 165 if (c == '\r') {
kenjiArai 0:f8c5c7d19d9a 166 buff[idx++] = c;
kenjiArai 0:f8c5c7d19d9a 167 break;
kenjiArai 0:f8c5c7d19d9a 168 }
kenjiArai 0:f8c5c7d19d9a 169 if ((c == '\b') && idx) {
kenjiArai 0:f8c5c7d19d9a 170 idx--;
kenjiArai 0:f8c5c7d19d9a 171 pc.putc(c);
kenjiArai 0:f8c5c7d19d9a 172 pc.putc(' ');
kenjiArai 0:f8c5c7d19d9a 173 pc.putc(c);
kenjiArai 0:f8c5c7d19d9a 174 }
kenjiArai 0:f8c5c7d19d9a 175 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 0:f8c5c7d19d9a 176 buff[idx++] = c;
kenjiArai 0:f8c5c7d19d9a 177 pc.putc(c);
kenjiArai 0:f8c5c7d19d9a 178 }
kenjiArai 0:f8c5c7d19d9a 179 }
kenjiArai 0:f8c5c7d19d9a 180 buff[idx] = 0;
kenjiArai 0:f8c5c7d19d9a 181 pc.puts("\r\n");
kenjiArai 0:f8c5c7d19d9a 182 }
kenjiArai 0:f8c5c7d19d9a 183
kenjiArai 0:f8c5c7d19d9a 184 void chk_and_set_time(char *ptr)
kenjiArai 0:f8c5c7d19d9a 185 {
kenjiArai 0:f8c5c7d19d9a 186 int32_t p1;
kenjiArai 0:f8c5c7d19d9a 187 struct tm t;
kenjiArai 0:f8c5c7d19d9a 188 time_t seconds;
kenjiArai 0:f8c5c7d19d9a 189
kenjiArai 0:f8c5c7d19d9a 190 if (xatoi(&ptr, &p1)) {
kenjiArai 0:f8c5c7d19d9a 191 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 0:f8c5c7d19d9a 192 pc.printf("Year:%d ",p1);
kenjiArai 0:f8c5c7d19d9a 193 xatoi( &ptr, &p1 );
kenjiArai 0:f8c5c7d19d9a 194 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 0:f8c5c7d19d9a 195 pc.printf("Month:%d ",p1);
kenjiArai 0:f8c5c7d19d9a 196 xatoi( &ptr, &p1 );
kenjiArai 0:f8c5c7d19d9a 197 t.tm_mday = (uint8_t)p1;
kenjiArai 0:f8c5c7d19d9a 198 pc.printf("Day:%d ",p1);
kenjiArai 0:f8c5c7d19d9a 199 xatoi( &ptr, &p1 );
kenjiArai 0:f8c5c7d19d9a 200 t.tm_hour = (uint8_t)p1;
kenjiArai 0:f8c5c7d19d9a 201 pc.printf("Hour:%d ",p1);
kenjiArai 0:f8c5c7d19d9a 202 xatoi( &ptr, &p1 );
kenjiArai 0:f8c5c7d19d9a 203 t.tm_min = (uint8_t)p1;
kenjiArai 0:f8c5c7d19d9a 204 pc.printf("Min:%d ",p1);
kenjiArai 0:f8c5c7d19d9a 205 xatoi( &ptr, &p1 );
kenjiArai 0:f8c5c7d19d9a 206 t.tm_sec = (uint8_t)p1;
kenjiArai 0:f8c5c7d19d9a 207 pc.printf("Sec: %d \r\n",p1);
kenjiArai 0:f8c5c7d19d9a 208 } else {
kenjiArai 0:f8c5c7d19d9a 209 return;
kenjiArai 0:f8c5c7d19d9a 210 }
kenjiArai 0:f8c5c7d19d9a 211 seconds = mktime(&t);
kenjiArai 0:f8c5c7d19d9a 212 set_time(seconds);
kenjiArai 0:f8c5c7d19d9a 213 pc.printf(
kenjiArai 0:f8c5c7d19d9a 214 "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
kenjiArai 0:f8c5c7d19d9a 215 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec
kenjiArai 0:f8c5c7d19d9a 216 );
kenjiArai 0:f8c5c7d19d9a 217 }
kenjiArai 0:f8c5c7d19d9a 218
kenjiArai 0:f8c5c7d19d9a 219 int32_t xatoi (char **str, int32_t *res)
kenjiArai 0:f8c5c7d19d9a 220 {
kenjiArai 0:f8c5c7d19d9a 221 int32_t val;
kenjiArai 0:f8c5c7d19d9a 222 uint8_t c, radix, s = 0;
kenjiArai 0:f8c5c7d19d9a 223
kenjiArai 0:f8c5c7d19d9a 224 while ((c = **str) == ' ') {
kenjiArai 0:f8c5c7d19d9a 225 (*str)++;
kenjiArai 0:f8c5c7d19d9a 226 }
kenjiArai 0:f8c5c7d19d9a 227 if (c == '-') {
kenjiArai 0:f8c5c7d19d9a 228 s = 1;
kenjiArai 0:f8c5c7d19d9a 229 c = *(++(*str));
kenjiArai 0:f8c5c7d19d9a 230 }
kenjiArai 0:f8c5c7d19d9a 231 if (c == '0') {
kenjiArai 0:f8c5c7d19d9a 232 c = *(++(*str));
kenjiArai 0:f8c5c7d19d9a 233 if (c <= ' ') {
kenjiArai 0:f8c5c7d19d9a 234 *res = 0;
kenjiArai 0:f8c5c7d19d9a 235 return 1;
kenjiArai 0:f8c5c7d19d9a 236 }
kenjiArai 0:f8c5c7d19d9a 237 if (c == 'x') {
kenjiArai 0:f8c5c7d19d9a 238 radix = 16;
kenjiArai 0:f8c5c7d19d9a 239 c = *(++(*str));
kenjiArai 0:f8c5c7d19d9a 240 } else {
kenjiArai 0:f8c5c7d19d9a 241 if (c == 'b') {
kenjiArai 0:f8c5c7d19d9a 242 radix = 2;
kenjiArai 0:f8c5c7d19d9a 243 c = *(++(*str));
kenjiArai 0:f8c5c7d19d9a 244 } else {
kenjiArai 0:f8c5c7d19d9a 245 if ((c >= '0')&&(c <= '9')) {
kenjiArai 0:f8c5c7d19d9a 246 radix = 8;
kenjiArai 0:f8c5c7d19d9a 247 } else {
kenjiArai 0:f8c5c7d19d9a 248 return 0;
kenjiArai 0:f8c5c7d19d9a 249 }
kenjiArai 0:f8c5c7d19d9a 250 }
kenjiArai 0:f8c5c7d19d9a 251 }
kenjiArai 0:f8c5c7d19d9a 252 } else {
kenjiArai 0:f8c5c7d19d9a 253 if ((c < '1')||(c > '9')) {
kenjiArai 0:f8c5c7d19d9a 254 return 0;
kenjiArai 0:f8c5c7d19d9a 255 }
kenjiArai 0:f8c5c7d19d9a 256 radix = 10;
kenjiArai 0:f8c5c7d19d9a 257 }
kenjiArai 0:f8c5c7d19d9a 258 val = 0;
kenjiArai 0:f8c5c7d19d9a 259 while (c > ' ') {
kenjiArai 0:f8c5c7d19d9a 260 if (c >= 'a') {
kenjiArai 0:f8c5c7d19d9a 261 c -= 0x20;
kenjiArai 0:f8c5c7d19d9a 262 }
kenjiArai 0:f8c5c7d19d9a 263 c -= '0';
kenjiArai 0:f8c5c7d19d9a 264 if (c >= 17) {
kenjiArai 0:f8c5c7d19d9a 265 c -= 7;
kenjiArai 0:f8c5c7d19d9a 266 if (c <= 9) {
kenjiArai 0:f8c5c7d19d9a 267 return 0;
kenjiArai 0:f8c5c7d19d9a 268 }
kenjiArai 0:f8c5c7d19d9a 269 }
kenjiArai 0:f8c5c7d19d9a 270 if (c >= radix) {
kenjiArai 0:f8c5c7d19d9a 271 return 0;
kenjiArai 0:f8c5c7d19d9a 272 }
kenjiArai 0:f8c5c7d19d9a 273 val = val * radix + c;
kenjiArai 0:f8c5c7d19d9a 274 c = *(++(*str));
kenjiArai 0:f8c5c7d19d9a 275 }
kenjiArai 0:f8c5c7d19d9a 276 if (s) {
kenjiArai 0:f8c5c7d19d9a 277 val = -val;
kenjiArai 0:f8c5c7d19d9a 278 }
kenjiArai 0:f8c5c7d19d9a 279 *res = val;
kenjiArai 0:f8c5c7d19d9a 280 return 1;
kenjiArai 0:f8c5c7d19d9a 281 }