Skip to main content
JPanc.1
Associate III
January 31, 2020
Question

getting internal RTC time always 00:00:00 (I am using STM32F446RE nucleo board )

  • January 31, 2020
  • 1 reply
  • 1570 views

0690X00000BxBKOQA3.jpgI am using STM32F446RE Nucleo Board and want to read internal RTC timing.

But I am unable to get the time getting 00:00:00

Here I shared my core

Clock Setting: LSE : 32768Hz

System Clock: HSI : 84MHz

int main(void)
{
 /* USER CODE BEGIN 1 */
 
 /* USER CODE END 1 */
 
 
 /* MCU Configuration--------------------------------------------------------*/
 
 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();
 
 /* USER CODE BEGIN Init */
 
 /* USER CODE END Init */
 
 /* Configure the system clock */
 SystemClock_Config();
 
 /* USER CODE BEGIN SysInit */
 
 /* USER CODE END SysInit */
 
 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_DMA_Init();
 MX_USART1_UART_Init();
 MX_USART2_UART_Init();
 MX_SPI2_Init();
 MX_FATFS_Init();
 MX_RTC_Init();
 /* USER CODE BEGIN 2 */
 
 /* USER CODE END 2 */
 
 uint32_t prevTick = 0;
 
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 /* USER CODE END WHILE */
	 if((uint32_t)HAL_GetTick() - prevTick >= 2000)
	 {
		 /*
		 if(read_truck_no(buffer))
		 {
			 send_uart(buffer);
			 send_uart("\n");
			 bufclear();
		 }
		 */
		 if(get_time(tTime))
		 {
		 sprintf(buffer,"TIME: %02d:%02d:%02d %d\n",tTime.Hours,tTime.Minutes,tTime.Seconds,HAL_RTC_GetState(&hrtc));
		 send_uart(buffer);
		 bufclear();
		 }
		 else
		 {
			 send_uart("RTC ERROR\n");
			 bufclear();
		 }
		 prevTick = HAL_GetTick();
	 }
 /* USER CODE BEGIN 3 */
 }
 /* USER CODE END 3 */
}
 
 
bool set_time(RTC_TimeTypeDef sTime)
{
	sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
	sTime.StoreOperation = RTC_STOREOPERATION_RESET;
	if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
	{
		Error_Handler();
		return false;
	}
	else return true;
}
 
 
bool get_time(RTC_TimeTypeDef gTime)
{
 
	if (HAL_RTC_SetTime(&hrtc, &gTime, RTC_FORMAT_BIN) != HAL_OK)
	{
		Error_Handler();
		return false;
	}
	else
	{
		HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x32F2);
		return true;
	}
}
 
 
bool set_date(RTC_DateTypeDef sDate)
{
	 sDate.WeekDay = RTC_WEEKDAY_FRIDAY;
	 /*
	 sDate.Month = RTC_MONTH_JANUARY;
	 sDate.Date = 0x31;
	 sDate.Year = 0x20;
	 */
 
	 if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
	 {
	 Error_Handler();
		return false;
	 }
	 else return true;
}
 
 
bool get_date(RTC_DateTypeDef gDate)
{
	 /*
	 sDate.WeekDay = RTC_WEEKDAY_FRIDAY;
	 sDate.Month = RTC_MONTH_JANUARY;
	 sDate.Date = 0x31;
	 sDate.Year = 0x20;
	 */
 
	 if (HAL_RTC_GetDate(&hrtc, &gDate, RTC_FORMAT_BIN) != HAL_OK)
	 {
	 Error_Handler();
	 return false;
	 }
	 else
	 return true;
}
 
bool set_alarm(RTC_AlarmTypeDef sAlarm)
{
	 /*
	 sAlarm.AlarmTime.Hours = 0x0;
	 sAlarm.AlarmTime.Minutes = 0x0;
	 sAlarm.AlarmTime.Seconds = 0x0;
	 */
	 sAlarm.AlarmTime.SubSeconds = 0x0;
	 sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
	 sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
	 sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
	 sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
	 sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
	 sAlarm.AlarmDateWeekDay = 0x31;
	 sAlarm.Alarm = RTC_ALARM_A;
	 if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
	 {
	 Error_Handler();
	 return false;
	 }
	 else return true;
}
 
/**
 * @brief System Clock Configuration
 * @retval None
 */
void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
 
 /** Configure the main internal regulator output voltage 
 */
 __HAL_RCC_PWR_CLK_ENABLE();
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
 /** Initializes the CPU, AHB and APB busses clocks 
 */
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSE;
 RCC_OscInitStruct.LSEState = RCC_LSE_ON;
 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
 RCC_OscInitStruct.PLL.PLLM = 8;
 RCC_OscInitStruct.PLL.PLLN = 84;
 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
 RCC_OscInitStruct.PLL.PLLQ = 2;
 RCC_OscInitStruct.PLL.PLLR = 2;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
 /** Initializes the CPU, AHB and APB busses clocks 
 */
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|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_DIV2;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 
 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
 {
 Error_Handler();
 }
 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
 PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
}
 
/**
 * @brief RTC Initialization Function
 * @param None
 * @retval None
 */
static void MX_RTC_Init(void)
{
 
 /* USER CODE BEGIN RTC_Init 0 */
 
 /* USER CODE END RTC_Init 0 */
 
 RTC_TimeTypeDef sTime = {0};
 RTC_DateTypeDef sDate = {0};
 RTC_AlarmTypeDef sAlarm = {0};
 
 /* USER CODE BEGIN RTC_Init 1 */
 
 /* USER CODE END RTC_Init 1 */
 /** Initialize RTC Only 
 */
 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;
 if (HAL_RTC_Init(&hrtc) != HAL_OK)
 {
 Error_Handler();
 }
 
 /* USER CODE BEGIN Check_RTC_BKUP */
 
 /* USER CODE END Check_RTC_BKUP */
 
 /** Initialize RTC and set the Time and Date 
 */
 sTime.Hours = 0x18;
 sTime.Minutes = 0x45;
 sTime.Seconds = 0x0;
 sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
 sTime.StoreOperation = RTC_STOREOPERATION_RESET;
 if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
 {
 Error_Handler();
 }
 sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
 sDate.Month = RTC_MONTH_JANUARY;
 sDate.Date = 0x30;
 sDate.Year = 0x0;
 
 if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
 {
 Error_Handler();
 }
 /** Enable the Alarm A 
 */
 sAlarm.AlarmTime.Hours = 0x0;
 sAlarm.AlarmTime.Minutes = 0x0;
 sAlarm.AlarmTime.Seconds = 0x0;
 sAlarm.AlarmTime.SubSeconds = 0x0;
 sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
 sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
 sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
 sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
 sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
 sAlarm.AlarmDateWeekDay = 0x31;
 sAlarm.Alarm = RTC_ALARM_A;
 if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN RTC_Init 2 */
 
 /* USER CODE END RTC_Init 2 */
 
}
 
void send_uart(char* string)
{
	uint16_t len = strlen(string);
	HAL_UART_Transmit(&huart2,(uint8_t *)string,len,2000);
}
int bufsize(char* buf)
{
	int i=0;
	while(*buf++ != '\0')i++;
	return i;
}
 
void bufclear(void)
{
	for(int i=0;i<1024;i++)
	{
		buffer[i] = '\0';
	}
 
}

This topic has been closed for replies.

1 reply

Senior
February 1, 2020

You should use HAL_RTC_GetTime() in your function get_time().