This is a RTC additional function. This is only for Nucleo F401RE & F411RE mbed(Added L152RE, F334R8, L476RG & F746xx). If you connected battery backup circuit for internal RTC, you can make a power-off and reset condition. RTC still has proper time and date.

Dependents:   Nucleo_rtos_sample PB_Emma_Ethernet

Please refer following NOTE information.
/users/kenjiArai/notebook/nucleo-series-rtc-control-under-power-onoff-and-re/

Committer:
kenjiArai
Date:
Sat Feb 07 02:19:57 2015 +0000
Revision:
0:e4c20fd769f1
Child:
1:3129de8d50ea
Child:
2:765470eab2a6
This is a RTC additional function. This is only for Nucleo F401RE & F411RE mbed. If you connected battery backup circuit for internal RTC, you can make a power-off and reset condition. RTC still has proper time and date.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:e4c20fd769f1 1 /*
kenjiArai 0:e4c20fd769f1 2 * mbed Library program
kenjiArai 0:e4c20fd769f1 3 * Check & set RTC function and set proper clock if we can set
kenjiArai 0:e4c20fd769f1 4 * ONLY FOR "Nucleo Board"
kenjiArai 0:e4c20fd769f1 5 *
kenjiArai 0:e4c20fd769f1 6 * Copyright (c) 2014-2015 Kenji Arai / JH1PJL
kenjiArai 0:e4c20fd769f1 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:e4c20fd769f1 8 * http://mbed.org/users/kenjiArai/
kenjiArai 0:e4c20fd769f1 9 * Created: October 24th, 2014
kenjiArai 0:e4c20fd769f1 10 * Revised: Feburary 7th, 2015
kenjiArai 0:e4c20fd769f1 11 *
kenjiArai 0:e4c20fd769f1 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:e4c20fd769f1 13 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:e4c20fd769f1 14 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:e4c20fd769f1 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:e4c20fd769f1 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:e4c20fd769f1 17 */
kenjiArai 0:e4c20fd769f1 18
kenjiArai 0:e4c20fd769f1 19 #if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_L152RE)
kenjiArai 0:e4c20fd769f1 20
kenjiArai 0:e4c20fd769f1 21 //#define DEBUG // use Communication with PC(UART)
kenjiArai 0:e4c20fd769f1 22
kenjiArai 0:e4c20fd769f1 23 // Include ---------------------------------------------------------------------------------------
kenjiArai 0:e4c20fd769f1 24 #include "mbed.h"
kenjiArai 0:e4c20fd769f1 25 #include "SetRTC.h"
kenjiArai 0:e4c20fd769f1 26
kenjiArai 0:e4c20fd769f1 27 // Definition ------------------------------------------------------------------------------------
kenjiArai 0:e4c20fd769f1 28 #ifdef DEBUG
kenjiArai 0:e4c20fd769f1 29 #define BAUD(x) pcr.baud(x)
kenjiArai 0:e4c20fd769f1 30 #define GETC(x) pcr.getc(x)
kenjiArai 0:e4c20fd769f1 31 #define PUTC(x) pcr.putc(x)
kenjiArai 0:e4c20fd769f1 32 #define PRINTF(...) pcr.printf(__VA_ARGS__)
kenjiArai 0:e4c20fd769f1 33 #define READABLE(x) pcr.readable(x)
kenjiArai 0:e4c20fd769f1 34 #else
kenjiArai 0:e4c20fd769f1 35 #define BAUD(x) {;}
kenjiArai 0:e4c20fd769f1 36 #define GETC(x) {;}
kenjiArai 0:e4c20fd769f1 37 #define PUTC(x) {;}
kenjiArai 0:e4c20fd769f1 38 #define PRINTF(...) {;}
kenjiArai 0:e4c20fd769f1 39 #define READABLE(x) {;}
kenjiArai 0:e4c20fd769f1 40 #endif
kenjiArai 0:e4c20fd769f1 41
kenjiArai 0:e4c20fd769f1 42 // Object ----------------------------------------------------------------------------------------
kenjiArai 0:e4c20fd769f1 43 Serial pcr(USBTX, USBRX);
kenjiArai 0:e4c20fd769f1 44
kenjiArai 0:e4c20fd769f1 45 // RAM -------------------------------------------------------------------------------------------
kenjiArai 0:e4c20fd769f1 46
kenjiArai 0:e4c20fd769f1 47 // ROM / Constant data ---------------------------------------------------------------------------
kenjiArai 0:e4c20fd769f1 48
kenjiArai 0:e4c20fd769f1 49 // Function prototypes ---------------------------------------------------------------------------
kenjiArai 0:e4c20fd769f1 50 static int32_t set_RTC_LSI(void);
kenjiArai 0:e4c20fd769f1 51 static int32_t set_RTC_LSE(void);
kenjiArai 0:e4c20fd769f1 52 static int32_t rtc_external_osc_init(void);
kenjiArai 0:e4c20fd769f1 53 static uint32_t read_RTC_reg(uint32_t RTC_BKP_DR);
kenjiArai 0:e4c20fd769f1 54 static uint32_t check_RTC_backup_reg( void );
kenjiArai 0:e4c20fd769f1 55 static int xatoi (char **str, unsigned long *res);
kenjiArai 0:e4c20fd769f1 56 static void get_line (char *buff, int len);
kenjiArai 0:e4c20fd769f1 57
kenjiArai 0:e4c20fd769f1 58 //-------------------------------------------------------------------------------------------------
kenjiArai 0:e4c20fd769f1 59 // Control Program
kenjiArai 0:e4c20fd769f1 60 //-------------------------------------------------------------------------------------------------
kenjiArai 0:e4c20fd769f1 61 int32_t SetRTC()
kenjiArai 0:e4c20fd769f1 62 {
kenjiArai 0:e4c20fd769f1 63 if (rtc_external_osc_init() == OK) {
kenjiArai 0:e4c20fd769f1 64 return OK;
kenjiArai 0:e4c20fd769f1 65 } else {
kenjiArai 0:e4c20fd769f1 66 return NG;
kenjiArai 0:e4c20fd769f1 67 }
kenjiArai 0:e4c20fd769f1 68 }
kenjiArai 0:e4c20fd769f1 69
kenjiArai 0:e4c20fd769f1 70 int32_t set_RTC_LSE(void)
kenjiArai 0:e4c20fd769f1 71 {
kenjiArai 0:e4c20fd769f1 72 uint32_t timeout = 0;
kenjiArai 0:e4c20fd769f1 73
kenjiArai 0:e4c20fd769f1 74 //---------------------------- LSE Configuration -------------------------
kenjiArai 0:e4c20fd769f1 75 // Enable Power Clock
kenjiArai 0:e4c20fd769f1 76 __PWR_CLK_ENABLE();
kenjiArai 0:e4c20fd769f1 77 // Enable write access to Backup domain
kenjiArai 0:e4c20fd769f1 78 PWR->CR |= PWR_CR_DBP;
kenjiArai 0:e4c20fd769f1 79 // Wait for Backup domain Write protection disable
kenjiArai 0:e4c20fd769f1 80 timeout = HAL_GetTick() + DBP_TIMEOUT_VALUE;
kenjiArai 0:e4c20fd769f1 81 while((PWR->CR & PWR_CR_DBP) == RESET) {
kenjiArai 0:e4c20fd769f1 82 if(HAL_GetTick() >= timeout) {
kenjiArai 0:e4c20fd769f1 83 PRINTF("Time-Out 1\r\n");
kenjiArai 0:e4c20fd769f1 84 return NG;
kenjiArai 0:e4c20fd769f1 85 }
kenjiArai 0:e4c20fd769f1 86 }
kenjiArai 0:e4c20fd769f1 87 // Reset LSEON and LSEBYP bits before configuring the LSE ----------------
kenjiArai 0:e4c20fd769f1 88 __HAL_RCC_LSE_CONFIG(RCC_LSE_OFF);
kenjiArai 0:e4c20fd769f1 89 // Get timeout
kenjiArai 0:e4c20fd769f1 90 timeout = HAL_GetTick() + TIMEOUT;
kenjiArai 0:e4c20fd769f1 91 // Wait till LSE is ready
kenjiArai 0:e4c20fd769f1 92 while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) {
kenjiArai 0:e4c20fd769f1 93 if(HAL_GetTick() >= timeout) {
kenjiArai 0:e4c20fd769f1 94 PRINTF("Time-Out 2\r\n");
kenjiArai 0:e4c20fd769f1 95 return NG;
kenjiArai 0:e4c20fd769f1 96 }
kenjiArai 0:e4c20fd769f1 97 }
kenjiArai 0:e4c20fd769f1 98 // Set the new LSE configuration -----------------------------------------
kenjiArai 0:e4c20fd769f1 99 __HAL_RCC_LSE_CONFIG(RCC_LSE_ON);
kenjiArai 0:e4c20fd769f1 100 // Get timeout
kenjiArai 0:e4c20fd769f1 101 timeout = HAL_GetTick() + TIMEOUT;
kenjiArai 0:e4c20fd769f1 102 // Wait till LSE is ready
kenjiArai 0:e4c20fd769f1 103 while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) {
kenjiArai 0:e4c20fd769f1 104 if(HAL_GetTick() >= timeout) {
kenjiArai 0:e4c20fd769f1 105 PRINTF("Time-Out 3\r\n");
kenjiArai 0:e4c20fd769f1 106 return NG;
kenjiArai 0:e4c20fd769f1 107 }
kenjiArai 0:e4c20fd769f1 108 }
kenjiArai 0:e4c20fd769f1 109 PRINTF("OK");
kenjiArai 0:e4c20fd769f1 110 return OK;
kenjiArai 0:e4c20fd769f1 111 }
kenjiArai 0:e4c20fd769f1 112
kenjiArai 0:e4c20fd769f1 113 int32_t set_RTC_LSI(void)
kenjiArai 0:e4c20fd769f1 114 {
kenjiArai 0:e4c20fd769f1 115 uint32_t timeout = 0;
kenjiArai 0:e4c20fd769f1 116
kenjiArai 0:e4c20fd769f1 117 // Enable Power clock
kenjiArai 0:e4c20fd769f1 118 __PWR_CLK_ENABLE();
kenjiArai 0:e4c20fd769f1 119 // Enable access to Backup domain
kenjiArai 0:e4c20fd769f1 120 HAL_PWR_EnableBkUpAccess();
kenjiArai 0:e4c20fd769f1 121 // Reset Backup domain
kenjiArai 0:e4c20fd769f1 122 __HAL_RCC_BACKUPRESET_FORCE();
kenjiArai 0:e4c20fd769f1 123 __HAL_RCC_BACKUPRESET_RELEASE();
kenjiArai 0:e4c20fd769f1 124 // Enable Power Clock
kenjiArai 0:e4c20fd769f1 125 __PWR_CLK_ENABLE();
kenjiArai 0:e4c20fd769f1 126 // Enable write access to Backup domain
kenjiArai 0:e4c20fd769f1 127 PWR->CR |= PWR_CR_DBP;
kenjiArai 0:e4c20fd769f1 128 // Wait for Backup domain Write protection disable
kenjiArai 0:e4c20fd769f1 129 timeout = HAL_GetTick() + DBP_TIMEOUT_VALUE;
kenjiArai 0:e4c20fd769f1 130 while((PWR->CR & PWR_CR_DBP) == RESET) {
kenjiArai 0:e4c20fd769f1 131 if(HAL_GetTick() >= timeout) {
kenjiArai 0:e4c20fd769f1 132 return NG;
kenjiArai 0:e4c20fd769f1 133 }
kenjiArai 0:e4c20fd769f1 134 }
kenjiArai 0:e4c20fd769f1 135 __HAL_RCC_LSE_CONFIG(RCC_LSE_OFF);
kenjiArai 0:e4c20fd769f1 136 // Enable LSI
kenjiArai 0:e4c20fd769f1 137 __HAL_RCC_LSI_ENABLE();
kenjiArai 0:e4c20fd769f1 138 timeout = HAL_GetTick() + TIMEOUT;
kenjiArai 0:e4c20fd769f1 139 // Wait till LSI is ready
kenjiArai 0:e4c20fd769f1 140 while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) {
kenjiArai 0:e4c20fd769f1 141 if(HAL_GetTick() >= timeout) {
kenjiArai 0:e4c20fd769f1 142 return NG;
kenjiArai 0:e4c20fd769f1 143 }
kenjiArai 0:e4c20fd769f1 144 }
kenjiArai 0:e4c20fd769f1 145 // Connect LSI to RTC
kenjiArai 0:e4c20fd769f1 146 __HAL_RCC_RTC_CLKPRESCALER(RCC_RTCCLKSOURCE_LSI);
kenjiArai 0:e4c20fd769f1 147 __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI);
kenjiArai 0:e4c20fd769f1 148 return OK;
kenjiArai 0:e4c20fd769f1 149 }
kenjiArai 0:e4c20fd769f1 150
kenjiArai 0:e4c20fd769f1 151 int32_t rtc_external_osc_init(void)
kenjiArai 0:e4c20fd769f1 152 {
kenjiArai 0:e4c20fd769f1 153 // Enable Power clock
kenjiArai 0:e4c20fd769f1 154 __PWR_CLK_ENABLE();
kenjiArai 0:e4c20fd769f1 155 // Enable access to Backup domain
kenjiArai 0:e4c20fd769f1 156 HAL_PWR_EnableBkUpAccess();
kenjiArai 0:e4c20fd769f1 157 // Check backup condition
kenjiArai 0:e4c20fd769f1 158 if ( check_RTC_backup_reg() ) {
kenjiArai 0:e4c20fd769f1 159 return OK;
kenjiArai 0:e4c20fd769f1 160 } else {
kenjiArai 0:e4c20fd769f1 161 // Reset Backup domain
kenjiArai 0:e4c20fd769f1 162 __HAL_RCC_BACKUPRESET_FORCE();
kenjiArai 0:e4c20fd769f1 163 __HAL_RCC_BACKUPRESET_RELEASE();
kenjiArai 0:e4c20fd769f1 164 // Enable LSE Oscillator
kenjiArai 0:e4c20fd769f1 165 if (set_RTC_LSE() == OK) {
kenjiArai 0:e4c20fd769f1 166 // Connect LSE to RTC
kenjiArai 0:e4c20fd769f1 167 __HAL_RCC_RTC_CLKPRESCALER(RCC_RTCCLKSOURCE_LSE);
kenjiArai 0:e4c20fd769f1 168 __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
kenjiArai 0:e4c20fd769f1 169 return OK;
kenjiArai 0:e4c20fd769f1 170 } else {
kenjiArai 0:e4c20fd769f1 171 set_RTC_LSI();
kenjiArai 0:e4c20fd769f1 172 return NG;
kenjiArai 0:e4c20fd769f1 173 }
kenjiArai 0:e4c20fd769f1 174 }
kenjiArai 0:e4c20fd769f1 175 }
kenjiArai 0:e4c20fd769f1 176
kenjiArai 0:e4c20fd769f1 177 uint32_t read_RTC_reg(uint32_t RTC_BKP_DR)
kenjiArai 0:e4c20fd769f1 178 {
kenjiArai 0:e4c20fd769f1 179 __IO uint32_t tmp = 0;
kenjiArai 0:e4c20fd769f1 180
kenjiArai 0:e4c20fd769f1 181 // Check the parameters
kenjiArai 0:e4c20fd769f1 182 assert_param(IS_RTC_BKP(RTC_BKP_DR));
kenjiArai 0:e4c20fd769f1 183 tmp = RTC_BASE + 0x50;
kenjiArai 0:e4c20fd769f1 184 tmp += (RTC_BKP_DR * 4);
kenjiArai 0:e4c20fd769f1 185 // Read the specified register
kenjiArai 0:e4c20fd769f1 186 return (*(__IO uint32_t *)tmp);
kenjiArai 0:e4c20fd769f1 187 }
kenjiArai 0:e4c20fd769f1 188
kenjiArai 0:e4c20fd769f1 189 // Check RTC Backup registers contents
kenjiArai 0:e4c20fd769f1 190 uint32_t check_RTC_backup_reg( void )
kenjiArai 0:e4c20fd769f1 191 {
kenjiArai 0:e4c20fd769f1 192 if ( read_RTC_reg( RTC_BKP_DR0 ) == RTC_DAT0 ) {
kenjiArai 0:e4c20fd769f1 193 if ( read_RTC_reg( RTC_BKP_DR1 ) == RTC_DAT1 ) {
kenjiArai 0:e4c20fd769f1 194 return 1;
kenjiArai 0:e4c20fd769f1 195 }
kenjiArai 0:e4c20fd769f1 196 }
kenjiArai 0:e4c20fd769f1 197 return 0;
kenjiArai 0:e4c20fd769f1 198 }
kenjiArai 0:e4c20fd769f1 199
kenjiArai 0:e4c20fd769f1 200 void show_RTC_reg( void )
kenjiArai 0:e4c20fd769f1 201 {
kenjiArai 0:e4c20fd769f1 202 // Show registers
kenjiArai 0:e4c20fd769f1 203 pcr.printf( "\r\nShow RTC registers by JH1PJL\r\n" );
kenjiArai 0:e4c20fd769f1 204 pcr.printf( " Reg0 =0x%08x, Reg1 =0x%08x\r\n",
kenjiArai 0:e4c20fd769f1 205 read_RTC_reg( RTC_BKP_DR0 ),
kenjiArai 0:e4c20fd769f1 206 read_RTC_reg( RTC_BKP_DR1 )
kenjiArai 0:e4c20fd769f1 207 );
kenjiArai 0:e4c20fd769f1 208 pcr.printf( " TR =0x..%06x, DR =0x..%06x, CR =0x..%06x\r\n",
kenjiArai 0:e4c20fd769f1 209 RTC->TR, RTC->DR, RTC->CR
kenjiArai 0:e4c20fd769f1 210 );
kenjiArai 0:e4c20fd769f1 211 pcr.printf( " ISR =0x...%05x, PRER =0x..%06x, WUTR =0x....%04x\r\n",
kenjiArai 0:e4c20fd769f1 212 RTC->ISR, RTC->PRER, RTC->WUTR
kenjiArai 0:e4c20fd769f1 213 );
kenjiArai 0:e4c20fd769f1 214 pcr.printf( " CALIBR=0x....%04x, ALRMAR=0x%08x, ALRMBR=0x%08x\r\n",
kenjiArai 0:e4c20fd769f1 215 RTC->CALIBR, RTC->ALRMAR, RTC->ALRMBR
kenjiArai 0:e4c20fd769f1 216 );
kenjiArai 0:e4c20fd769f1 217 pcr.printf(
kenjiArai 0:e4c20fd769f1 218 " WPR =0x......%02x, SSR =0x....%04x, SHIFTR=0x....%04x\r\n",
kenjiArai 0:e4c20fd769f1 219 RTC->WPR, RTC->SSR, RTC->SHIFTR
kenjiArai 0:e4c20fd769f1 220 );
kenjiArai 0:e4c20fd769f1 221 pcr.printf(
kenjiArai 0:e4c20fd769f1 222 " TSTR =0x..%06x, TSDR =0x....%04x, TSSSR =0x....%04x\r\n\r\n",
kenjiArai 0:e4c20fd769f1 223 RTC->TSTR, RTC->TSDR, RTC->TSSSR
kenjiArai 0:e4c20fd769f1 224 );
kenjiArai 0:e4c20fd769f1 225 }
kenjiArai 0:e4c20fd769f1 226
kenjiArai 0:e4c20fd769f1 227 // Change string -> integer
kenjiArai 0:e4c20fd769f1 228 int xatoi (char **str, unsigned long *res)
kenjiArai 0:e4c20fd769f1 229 {
kenjiArai 0:e4c20fd769f1 230 unsigned long val;
kenjiArai 0:e4c20fd769f1 231 unsigned char c, radix, s = 0;
kenjiArai 0:e4c20fd769f1 232
kenjiArai 0:e4c20fd769f1 233 while ((c = **str) == ' ') (*str)++;
kenjiArai 0:e4c20fd769f1 234 if (c == '-') {
kenjiArai 0:e4c20fd769f1 235 s = 1;
kenjiArai 0:e4c20fd769f1 236 c = *(++(*str));
kenjiArai 0:e4c20fd769f1 237 }
kenjiArai 0:e4c20fd769f1 238 if (c == '0') {
kenjiArai 0:e4c20fd769f1 239 c = *(++(*str));
kenjiArai 0:e4c20fd769f1 240 if (c <= ' ') {
kenjiArai 0:e4c20fd769f1 241 *res = 0;
kenjiArai 0:e4c20fd769f1 242 return 1;
kenjiArai 0:e4c20fd769f1 243 }
kenjiArai 0:e4c20fd769f1 244 if (c == 'x') {
kenjiArai 0:e4c20fd769f1 245 radix = 16;
kenjiArai 0:e4c20fd769f1 246 c = *(++(*str));
kenjiArai 0:e4c20fd769f1 247 } else {
kenjiArai 0:e4c20fd769f1 248 if (c == 'b') {
kenjiArai 0:e4c20fd769f1 249 radix = 2;
kenjiArai 0:e4c20fd769f1 250 c = *(++(*str));
kenjiArai 0:e4c20fd769f1 251 } else {
kenjiArai 0:e4c20fd769f1 252 if ((c >= '0')&&(c <= '9')) {
kenjiArai 0:e4c20fd769f1 253 radix = 8;
kenjiArai 0:e4c20fd769f1 254 } else {
kenjiArai 0:e4c20fd769f1 255 return 0;
kenjiArai 0:e4c20fd769f1 256 }
kenjiArai 0:e4c20fd769f1 257 }
kenjiArai 0:e4c20fd769f1 258 }
kenjiArai 0:e4c20fd769f1 259 } else {
kenjiArai 0:e4c20fd769f1 260 if ((c < '1')||(c > '9')) {
kenjiArai 0:e4c20fd769f1 261 return 0;
kenjiArai 0:e4c20fd769f1 262 }
kenjiArai 0:e4c20fd769f1 263 radix = 10;
kenjiArai 0:e4c20fd769f1 264 }
kenjiArai 0:e4c20fd769f1 265 val = 0;
kenjiArai 0:e4c20fd769f1 266 while (c > ' ') {
kenjiArai 0:e4c20fd769f1 267 if (c >= 'a') c -= 0x20;
kenjiArai 0:e4c20fd769f1 268 c -= '0';
kenjiArai 0:e4c20fd769f1 269 if (c >= 17) {
kenjiArai 0:e4c20fd769f1 270 c -= 7;
kenjiArai 0:e4c20fd769f1 271 if (c <= 9) return 0;
kenjiArai 0:e4c20fd769f1 272 }
kenjiArai 0:e4c20fd769f1 273 if (c >= radix) return 0;
kenjiArai 0:e4c20fd769f1 274 val = val * radix + c;
kenjiArai 0:e4c20fd769f1 275 c = *(++(*str));
kenjiArai 0:e4c20fd769f1 276 }
kenjiArai 0:e4c20fd769f1 277 if (s) val = -val;
kenjiArai 0:e4c20fd769f1 278 *res = val;
kenjiArai 0:e4c20fd769f1 279 return 1;
kenjiArai 0:e4c20fd769f1 280 }
kenjiArai 0:e4c20fd769f1 281
kenjiArai 0:e4c20fd769f1 282 // Get key input data
kenjiArai 0:e4c20fd769f1 283 void get_line (char *buff, int len)
kenjiArai 0:e4c20fd769f1 284 {
kenjiArai 0:e4c20fd769f1 285 char c;
kenjiArai 0:e4c20fd769f1 286 int idx = 0;
kenjiArai 0:e4c20fd769f1 287
kenjiArai 0:e4c20fd769f1 288 for (;;) {
kenjiArai 0:e4c20fd769f1 289 c = pcr.getc();
kenjiArai 0:e4c20fd769f1 290 if (c == '\r') {
kenjiArai 0:e4c20fd769f1 291 buff[idx++] = c;
kenjiArai 0:e4c20fd769f1 292 break;
kenjiArai 0:e4c20fd769f1 293 }
kenjiArai 0:e4c20fd769f1 294 if ((c == '\b') && idx) {
kenjiArai 0:e4c20fd769f1 295 idx--;
kenjiArai 0:e4c20fd769f1 296 pcr.putc(c);
kenjiArai 0:e4c20fd769f1 297 pcr.putc(' ');
kenjiArai 0:e4c20fd769f1 298 pcr.putc(c);
kenjiArai 0:e4c20fd769f1 299 }
kenjiArai 0:e4c20fd769f1 300 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 0:e4c20fd769f1 301 buff[idx++] = c;
kenjiArai 0:e4c20fd769f1 302 pcr.putc(c);
kenjiArai 0:e4c20fd769f1 303 }
kenjiArai 0:e4c20fd769f1 304 }
kenjiArai 0:e4c20fd769f1 305 buff[idx] = 0;
kenjiArai 0:e4c20fd769f1 306 pcr.putc('\n');
kenjiArai 0:e4c20fd769f1 307 }
kenjiArai 0:e4c20fd769f1 308
kenjiArai 0:e4c20fd769f1 309
kenjiArai 0:e4c20fd769f1 310 // RTC related subroutines
kenjiArai 0:e4c20fd769f1 311 void chk_and_set_time(char *ptr)
kenjiArai 0:e4c20fd769f1 312 {
kenjiArai 0:e4c20fd769f1 313 unsigned long p1;
kenjiArai 0:e4c20fd769f1 314 struct tm t;
kenjiArai 0:e4c20fd769f1 315 time_t seconds;
kenjiArai 0:e4c20fd769f1 316
kenjiArai 0:e4c20fd769f1 317 if (xatoi(&ptr, &p1)) {
kenjiArai 0:e4c20fd769f1 318 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 0:e4c20fd769f1 319 PRINTF("Year:%d ",p1);
kenjiArai 0:e4c20fd769f1 320 xatoi( &ptr, &p1 );
kenjiArai 0:e4c20fd769f1 321 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 0:e4c20fd769f1 322 PRINTF("Month:%d ",p1);
kenjiArai 0:e4c20fd769f1 323 xatoi( &ptr, &p1 );
kenjiArai 0:e4c20fd769f1 324 t.tm_mday = (uint8_t)p1;
kenjiArai 0:e4c20fd769f1 325 PRINTF("Day:%d ",p1);
kenjiArai 0:e4c20fd769f1 326 xatoi( &ptr, &p1 );
kenjiArai 0:e4c20fd769f1 327 t.tm_hour = (uint8_t)p1;
kenjiArai 0:e4c20fd769f1 328 PRINTF("Hour:%d ",p1);
kenjiArai 0:e4c20fd769f1 329 xatoi( &ptr, &p1 );
kenjiArai 0:e4c20fd769f1 330 t.tm_min = (uint8_t)p1;
kenjiArai 0:e4c20fd769f1 331 PRINTF("Min:%d ",p1);
kenjiArai 0:e4c20fd769f1 332 xatoi( &ptr, &p1 );
kenjiArai 0:e4c20fd769f1 333 t.tm_sec = (uint8_t)p1;
kenjiArai 0:e4c20fd769f1 334 PRINTF("Sec: %d \r\n",p1);
kenjiArai 0:e4c20fd769f1 335 } else {
kenjiArai 0:e4c20fd769f1 336 return;
kenjiArai 0:e4c20fd769f1 337 }
kenjiArai 0:e4c20fd769f1 338 seconds = mktime(&t);
kenjiArai 0:e4c20fd769f1 339 set_time(seconds);
kenjiArai 0:e4c20fd769f1 340 // Show Time with several example
kenjiArai 0:e4c20fd769f1 341 // ex.1
kenjiArai 0:e4c20fd769f1 342 pcr.printf("Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
kenjiArai 0:e4c20fd769f1 343 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
kenjiArai 0:e4c20fd769f1 344 #if 0
kenjiArai 0:e4c20fd769f1 345 time_t seconds;
kenjiArai 0:e4c20fd769f1 346 char buf[40];
kenjiArai 0:e4c20fd769f1 347
kenjiArai 0:e4c20fd769f1 348 seconds = mktime(&t);
kenjiArai 0:e4c20fd769f1 349 // ex.2
kenjiArai 0:e4c20fd769f1 350 strftime(buf, 40, "%x %X", localtime(&seconds));
kenjiArai 0:e4c20fd769f1 351 pcr.printf("Date: %s\r\n", buf);
kenjiArai 0:e4c20fd769f1 352 // ex.3
kenjiArai 0:e4c20fd769f1 353 strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 0:e4c20fd769f1 354 pcr.printf("Date: %s\r\n", buf);
kenjiArai 0:e4c20fd769f1 355 // ex.4
kenjiArai 0:e4c20fd769f1 356 strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
kenjiArai 0:e4c20fd769f1 357 pcr.printf("Date: %s\r\n", buf);
kenjiArai 0:e4c20fd769f1 358 #endif
kenjiArai 0:e4c20fd769f1 359 }
kenjiArai 0:e4c20fd769f1 360
kenjiArai 0:e4c20fd769f1 361 void time_enter_mode(void)
kenjiArai 0:e4c20fd769f1 362 {
kenjiArai 0:e4c20fd769f1 363 char *ptr;
kenjiArai 0:e4c20fd769f1 364 char linebuf[64];
kenjiArai 0:e4c20fd769f1 365
kenjiArai 0:e4c20fd769f1 366 pcr.printf("\r\nSet time into RTC\r\n");
kenjiArai 0:e4c20fd769f1 367 pcr.printf(" e.g. >15 2 7 10 11 12 -> Feb. 7th, '15, 10:11:12\r\n");
kenjiArai 0:e4c20fd769f1 368 pcr.printf(" If time is fine, just hit enter\r\n");
kenjiArai 0:e4c20fd769f1 369 pcr.putc('>');
kenjiArai 0:e4c20fd769f1 370 ptr = linebuf;
kenjiArai 0:e4c20fd769f1 371 get_line(ptr, sizeof(linebuf));
kenjiArai 0:e4c20fd769f1 372 pcr.printf("\r");
kenjiArai 0:e4c20fd769f1 373 chk_and_set_time(ptr);
kenjiArai 0:e4c20fd769f1 374 }
kenjiArai 0:e4c20fd769f1 375
kenjiArai 0:e4c20fd769f1 376 #else
kenjiArai 0:e4c20fd769f1 377 #error "No suport this mbed, only for Nucleo mbed"
kenjiArai 0:e4c20fd769f1 378 #endif
kenjiArai 0:e4c20fd769f1 379 // defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_L152RE)