2015-05-01 06:48 AM
hi
my rtc is initialized i set date and time. long getUnixTimestamp() { struct tm timeinfo; //Setup a tm structure based on the RTC timeinfo.tm_wday = dateStruct.WeekDay; timeinfo.tm_mon = dateStruct.Month - 1; timeinfo.tm_mday = dateStruct.Date; timeinfo.tm_year = dateStruct.Year + 100; timeinfo.tm_hour = timeStruct.Hours; timeinfo.tm_min = timeStruct.Minutes; timeinfo.tm_sec = timeStruct.Seconds; time_t rawtime = mktime(&timeinfo); printf(''Current date and time are: %s\n'', ctime(&rawtime)); long x = time(&rawtime); printf(''time %lu\n'', x); return x; } i do a call to HAL_RTC_GetTime HAL_RTC_GetDate getUnixTimestamp i getCurrent date and time are: Wed Apr 29 22:46:00 2015time 1430347560
5 second later, i do another call to HAL_RTC_GetTime, HAL_RTC_GetDate, getUnixTimestamp and getCurrent date and time return Wed Apr 29 22:46:05 2015 and time 1430347560
why time function value is not modified?
thanks #rtc #stm32f4 #discovery #time2015-05-01 07:36 AM
Maybe the RTC clock (LSE) is not running.
Try running it from LSI, just as an experiment. JW2015-05-01 08:43 AM
Isn't that a hosting issue? ie the tool chain, and it's library, has absolutely no idea how the timing/interrupts work on your board/chip. This is code you'd have to provide for the platform.
http://www.keil.com/support/man/docs/armlib/armlib_chr1358938918041.htm
2015-05-01 09:04 AM
Nevermind...
If the HAL functions always return the same values, any further processing of those numbers will result in the same answer.Check the clock sources, and that the RTC is suitably configured and enabled.2015-05-01 02:58 PM
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
// Enable Power Control clock
__PWR_CLK_ENABLE();
// Enable access to Backup domain
HAL_PWR_EnableBkUpAccess();
// Reset Backup domain
__HAL_RCC_BACKUPRESET_FORCE();
__HAL_RCC_BACKUPRESET_RELEASE();
// The voltage scaling allows optimizing the power consumption when the
// device is clocked below the maximum system frequency, to update the
// voltage scaling value regarding system frequency refer to product
// datasheet.
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
// Enable HSE Oscillator and activate PLL with HSE as source
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
// This assumes the HSE_VALUE is a multiple of 1MHz. If this is not
// your case, you have to recompute these PLL constants.
RCC_OscInitStruct.PLL.PLLM = (HSE_VALUE / 1000000u);
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
// Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
// clocks dividers
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
// Enable LSE Oscillator
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; /* Mandatory, otherwise the PLL is reconfigured! */
RCC_OscInitStruct.LSEState = RCC_LSE_ON; /* External 768 kHz clock on OSC_IN/OSC_OUT */
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) {
// Connect LSE to RTC
__HAL_RCC_RTC_CLKPRESCALER(RCC_RTCCLKSOURCE_LSE);
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
}
// Enable RTC
__HAL_RCC_RTC_ENABLE();
RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24;
RtcHandle.Init.AsynchPrediv = 127;
trace_printf(''LSE_VALUE %d.
'', LSE_VALUE);
RtcHandle.Init.SynchPrediv = (LSE_VALUE / 128) - 1;
RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
RtcHandle.Instance = RTC;
if (HAL_RTC_Init(&RtcHandle) != HAL_OK) {
trace_printf(''RTC error: RTC initialization failed.
'');
}
it's not all who return the same value, it's c function.
trace_printf(''Current date and time are: %s
'', ctime(&rawtime));
trace_printf(''time %lu
'', time(&rawtime);
Current date and time are: Wed Apr 29 22:46:00 2015
time 4294967295
and the second call
Current date and time are: Wed Apr 29 22:46:06 2015
time 4294967295
2015-05-02 12:12 AM
time return -1 if an error occur
-1 = 0xFFFFFFFF = 4294967295 try first with time (0) ; time return a time_t type, convert it to long or separe the time call from printf