2014-07-13 06:52 AM
I used STM32CubeMX for a configuration of RTC in STM32F405RG on the OLIMEX STM32-H405 board. It seems that RTC does not work although the OLIMEX example works. For sure, I tried LSI also.
I watched the ''time'' structure after HAL_RTC_GetTime function was processed but all zeros. Any advice? Thank you.int main(void)
{
HAL_Init();
SystemClock_Config();
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
MX_GPIO_Init();
MX_RTC_Init();
while (1)
{
if (ButtonPressed())
{
HAL_RTC_GetTime(&hrtc, &time, FORMAT_BCD);
}
}
}
void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
__PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
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;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|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);
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; // _LSI
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
}
void MX_RTC_Init(void)
{
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
RTC_AlarmTypeDef sAlarm;
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
HAL_RTC_Init(&hrtc);
sTime.Hours = 0;
sTime.Minutes = 0;
sTime.Seconds = 0;
sTime.SubSeconds = 0;
sTime.TimeFormat = RTC_HOURFORMAT12_AM;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_SUB1H;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
HAL_RTC_SetTime(&hrtc, &sTime, FORMAT_BCD);
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 1;
sDate.Year = 0;
HAL_RTC_SetDate(&hrtc, &sDate, FORMAT_BCD);
}
#stm32f4-rtc-stm32cube
2014-07-16 02:21 AM
Sounds like RTC CLK is not on
Look to RTC->BDCR If this is issue you can try if(!(*(volatile uint32_t *) (BDCR_RTCEN_BB))) { __HAL_RCC_RTC_ENABLE(); // // printf(''RTC battery reconnected. Set up date and time'' // }2014-07-16 05:46 AM
Thank you, k.g., for the advice.
I put the setting at the end of SystemClock_Config(). Unfortunately it is not the case. I wanted to adapt the RTC part of the OLIMEX example into my code but it is very complicated as the example uses StdPeriphLib.2014-07-17 11:15 PM
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.LSEState = RCC_LSE_ON; (edit: text big font problem)2014-07-21 12:48 AM
That is, thank you, this setting works in a conjuction with the previous recommended one.
So it is probably bug in the STM32CubeMX - however, I will check again the setting of the RTC clock in the GUI. However, sampling of the time gives me every next value the same as the first one - e.g. value is 00:00:20 when I sample in 20 s after reset but the same after e.g. 25 s, 40 s etc. // sampling by the command from PC over VCP HAL_RTC_GetTime(&hrtc, &time, FORMAT_BIN); sprintf(outstr, '' RTC = %02u:%02u:%02u\r\n'', (uint32_t)(time.Hours), (uint32_t)(time.Minutes), (uint32_t)(time.Seconds)); // output by CDC packet to PC terminal Any next opinion or advice? Thank you.2014-07-21 10:07 PM
I am not sure if I understood problem, but try commend out:
HAL_RTC_SetTime(&hrtc, &sTime, FORMAT_BCD);
HAL_RTC_SetDate(&hrtc, &sDate, FORMAT_BCD);
from first post
2014-07-23 10:21 AM
It hasn't helped and, to be honest, it would be strange because these functions act during Init only.
For sure, I tried to output directly RTC->TR register without calling HAL_RTC_GetTime. It works as expected. Terrible bug in the function that stops RTC, isn't it? However, I would like to have TR data converted into time items. Yes, I could try to play with HAL_RTC_GetTime code but it isn't quite a help from STM.2014-07-23 10:54 AM
There 2 bugs in STM32CubeF4 that can be fixed:
1.a) In SystemClock_Config to add/change: RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.LSEState = RCC_LSE_ON; 1.b) E.g. in MX_RTC_Init to restart the RTC clock: if(!(*(volatile uint32_t *) (BDCR_RTCEN_BB))) __HAL_RCC_RTC_ENABLE(); Thanks to k.g. 2. In HAL_RTC_GetTime to delete: sTime->SubSeconds = (uint32_t)(hrtc->Instance->SSR); because it probably stops the RTC incrementation. I don't know at the moment the workaround how to obtain SubSeconds.2015-11-16 07:46 AM
Hey!
I've struggled with the same issue, util I've found this solution:/* Allow access to RTC */
HAL_PWR_EnableBkUpAccess();
/* RTC Clock selection can be changed only if the Backup Domain is reset */
__HAL_RCC_BACKUPRESET_FORCE();
__HAL_RCC_BACKUPRESET_RELEASE();
This needs to be done where you configure the RTC clocksource and the RTC Init structure.
Cheers!