STM32

RTC사용해보기

찬영_00 2024. 11. 26. 10:49

Data와 Time을 한번 UART로 보내볼건데, 먼저 시간을 우리가 설정해줄것이다.

 

먼저 RTC란 현재의 시간을 유지시키는 컴퓨터 시계이다.

그래서 현재의 시간은 우리가 정해주고 (그러기 싫으면 NTP) 시간의 흐름을 출력해보자

 

먼저 외부클럭을 다음과 같이 설정해주자

 

 

날짜 시간을 설정해준다.

RTC의 동작 주기는 기본적으로 LSE(32.768 kHz) 또는 LSI(약 32 kHz) 클럭을 사용

RTC를 정확히 1Hz로 동작시키기 위해, 분주기를 설정하여 클럭을 나눈다.

RTC 클럭을 1Hz로 만들기 위한 Prescaler 계산

 

 

그리고 다음과 같은 코드를 짜준다.

RTC_HandleTypeDef hrtc;

UART_HandleTypeDef huart2;

/* USER CODE BEGIN PV */
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_RTC_Init(void);
static void MX_USART2_UART_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */

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

int __io_putchar(int ch){
	HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, 0xFFFF);
	return ch;
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
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_RTC_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  RTC_TimeTypeDef sTime;
  RTC_DateTypeDef sDate;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
	HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);

	printf("data=%d %d %d %d, time=%d %d %d \r\n", sDate.Year, sDate.Month, sDate.WeekDay, sDate.Date, sTime.Hours, sTime.Minutes, sTime.Seconds);
	HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

 

그리고 UART통신을 하면

 

다음과 같은 결과를 얻는다.

 

Delay를 쓰니 중간에 1초가 누락되는 걸 볼수 있다.

이걸 알람기능을 활용하여 누락을 없애보겠다.

 

 

 

Wake Up Counter을 0으로 하자 1초마다 시간을 표시할 거기 때문임

 

int __io_putchar(int ch){
	HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, 0xFFFF);
	return ch;
}

void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
	RTC_TimeTypeDef sTime;
	RTC_DateTypeDef sDate;

    HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BIN);

    printf("date=%d %d %d %d, time=%d %d %d \r\n",
           sDate.Year, sDate.Month, sDate.WeekDay, sDate.Date,
           sTime.Hours, sTime.Minutes, sTime.Seconds);
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
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_RTC_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

다음 결과이다.

 

 

이렇게 알람으로 누락없이 해결해봤다.

'STM32' 카테고리의 다른 글

STM32 익히기 2)  (0) 2024.12.05
STM32 익히기 1)  (0) 2024.12.02
I2C로 LCD 제어해보기  (0) 2024.11.25
STM32F407VE - 기초 7) Timer  (0) 2024.11.25
MCU Internal 온도 측정하기  (0) 2024.11.24