Making RTC clock based on STM32CubeMX (HAL Library)

Keywords: Single-Chip Microcomputer stm32

1, RTC overview

The abbreviation of real-time clock is RTC(Real_Time Clock). RTC is an integrated circuit, usually called clock chip.
Real time clock chip is one of the most widely used consumer electronic products in daily life. It provides accurate real-time time for people, or provides accurate time reference for electronic systems. At present, most real-time clock chips use high-precision crystal oscillator as clock source. Some clock chips need additional battery power supply in order to work when the main power supply is powered down.

  • hardware structure
    1) Crystal oscillator
    Crystal oscillator is generally called crystal resonator, which is an electromechanical device. Crystal oscillator is the abbreviation of quartz oscillator. It is made of quartz crystal with small electrical loss through precision cutting, grinding, electrode plating and lead welding.
    Function of crystal oscillator: provide reference frequency.
    Crystal oscillator of RTC:
    The core of any real-time clock is a crystal oscillator with a frequency of 32768 Hz. It provides accurate and low-power real base signal for frequency division counter. It can be used to generate information such as seconds, minutes, hours and days. In order to ensure the long-term accuracy of the clock, the crystal oscillator must work normally without interference. The crystal oscillator of RTC is divided into external crystal oscillator and built-in crystal oscillator.
    Why is the crystal oscillator frequency of RTC 32768Hz?
    ① RTC time is calculated in terms of oscillation frequency. Therefore, it is not a timepiece, but a counter. The general counter is 16 bits. Because the accuracy of time is very important, the lower the number of shocks, the lower the accuracy of time. So it must be a high number. 2^15 = 32768 .
    ② 32768 Hz = 2^15, i.e. 1Hz after 15 frequency divisions, period = 1s.
    ③ Based on the experience of engineers, 32768 Hz is the most accurate clock.
    ④ Standardization and unification.

Calendar clock structure block diagram:

2, Create a new project

  • Setting RCC

  • Configure RTC



  • Configure serial port:

  • Configure clock tree:

  • Project settings:


3, Modify code

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "rtc.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
int fputc(int ch,FILE *f)
	{
		uint8_t temp[1]={ch};
		HAL_UART_Transmit(&huart1,temp,1,2);
		return ch;
	}
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
RTC_DateTypeDef GetData;//Get date structure
	
	RTC_TimeTypeDef GetTime;//Get time structure
  /* 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_RTC_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);//Get time
      /* Get the RTC current Date */
      HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);//get date

      /* Display date Format : yy/mm/dd */
      printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
		if(GetData.WeekDay==01)
		{
			printf("Monday\r\n");
		}
		else if(GetData.WeekDay==02)
		{
			printf("Tuesday\r\n");
		}
		else if(GetData.WeekDay==03)
		{
			printf("Wednesday\r\n");
		}
		else if(GetData.WeekDay==04)
		{
			printf("Thursday\r\n");
		}
		else if(GetData.WeekDay==05)
		{
			printf("Friday\r\n");
		}
		else if(GetData.WeekDay==06)
		{
			printf("Saturday\r\n");
		}
		else if(GetData.WeekDay==07)
		{
			printf("Sunday\r\n");
		}
      /* Display time Format : hh:mm:ss */
      printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);

      printf("\r\n");

      HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses 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_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


4, Burning operation

5, Summary

In this experiment, the RTC clock is realized, but it is not real-time, but the time is superimposed on the set initial value.

6, References

Real time clock
STM32CubeMX HAL Library: RTC clock

Posted by cueball2000uk on Thu, 02 Dec 2021 23:01:23 -0800