Embedded/1. STM32, Arduino

STM32 - RTC (Real Time Clock), Alarm을 통한 시간 및 알람 출력

잇(IT) 2024. 6. 20. 12:46

RTC (Real Time Clock)

RTC는 기본적으로 초고속 클럭이 필요하지 않기 때문에 LSE를 사용한다. 

 

STM32는 RCC(Reset and Clock Control)를 통해 HSI, HSE, LSI, LSE를 설정하게 된다.

HSE는 MCO 즉, ST-Link로부터 클럭을 전달 받고, LSE의 경우 Nucleo 보드에 장착된 크리스탈에 의해 클럭 신호가 생성된다.

Clock Configuration을 보게 되면 LSE는 32.768KHz를 사용중이다.


 

STM32 RTC는 Clock Source 외에도 Alarm 용도로 사용 가능하다.

RTC의 Parameter Settings를 보게되면 기본적으로 시간과 관련된 Parameter를 확인 가능하다.

 

시간 포맷을 정함과 동시에 Asynchronous Predivider value와 Synchronous Predivider value를 확인할 수 있다.

비동기, 동기 프리스케일러가 필요한 이유는 RTC 모듈은 1Hz 신호를 생성하여 초를 계산한다.

비동기, 동기 프리스케일러의 곱이 입력 주파수와 동일하지 않으면 시간 오차가 발생할 수 있기 때문이다.

비동기 프리스케일러는 RTC 입력 클럭을 큰 단위로 나누고, 동기 프리스케일러는 비동기 프리스케일러의 출력 신호를 더 세밀하게 나눈다.

 

그 외 날짜 및 시간을 설정하는 파라미터들이 보이고,

Alarm 설정 관련 parameter를 보게 되면 Mask가 붙은 시간 날짜 관련 설정을 볼 수 있다.

STM32에서 Mask는 특정 비트나 비트 필드를 선택적으로 처리하거나 무시하는데 사용되는 의미다.

만약 위 설정들이 Enable되면 해당 값은 무시하겠다는 의미가 된다.

 

즉, Date Week day, Hours를 Masking 처리하게 되면 날짜와 시간은 신경쓰지 않고 Minutes와 Seconds만 비교하여 알람을 울리겠다는 의미와 같아진다.


rtc.c

코드 생성 후 rtc.c 파일을 보게 되면 rtc 레지스터에 접근하기 위한 구조체가 생성된 것을 확인할 수 있다.

 hrtc, sTime, sDate 전부 RTC, 시간, 날짜와 관련된 구조체에 해당한다.

 

RTC_TimeTypeDef

 

RTC_DateTypeDef

 

구조체로 선언된 변수들을 이용해 RTC, 시간, 날짜 레지스터에 직접 접근하여 값을 직접 설정 할 수 있다.(물론 초기 코드들은 GUI를 통해 선언한 값들이 들어가게 된다.)

RTC 속성과 관련된 내용들을 포함하여 시간 날짜에 대한 값들이 선언되어 있다.

 

GUI를 통한 값들이 아닌 코드를 통해 직접 시간을 설정해주고 싶다면 위 구조체에 접근하여 해당 레지스터에 직접 접근하여 원하는 값을 지정하여 변경 시킬 수 있다.

ex) sTime.Hours = 0x06;으로 변경 뒤 실행하게 되면 RTC의 시간이 06시로 변경된다.

추가로 RTC를 이용한 Alarm에 대한 내용도 포함된 것을 확인할 수 있다.

 

Alarm도 마찬가지로 해당 구조체를 통해 레지스터에 접근하여 파라미터 값들을 설정할 수 있다.

 

GUI를 통해 설정하거나 레지스터에 직접 접근하여 시간을 설정한 뒤 get_time을 통해 현재 Board에서 흐르고 있는 RTC 값을 받아올 수 잇다.

GetTime, GetDate를 통해 값을 받아올 수 있다.

 

get_time 함수를 통해 값을 받아오고, 

main() 함수에서 UART를 통해 시간을 출력하게 되면 아래와 같이 1초에 1씩 증가하여 값을 받아오는 것을 확인할 수 있다.


Alarm

 

Alarm도 마찬가지로

GUI를 통해서 값을 설정할 수 있지만 직접 레지스터에 접근하여 값을 설정할 수 있다.

위 함수는 호출되면 시간, 분, 초에 대한 알람을 설정하게 된다.

!추가로 AlarmMask를 DATEWEEKDAY, HOURS, MINUTES를 설정했기 때문에 날짜, 시간, 분은 무시되고 초에 대해서 Alarm이 반영된다.

 

위 코드와 같이 직접 작성한 get_time()(RTC에 흐르고 있는 시간을 받아오는 함수)와 함께 해당 시간을 Uart 통신을 통해 Console로 전달하고 있다. 추가로 GPIOC의 PIN13 (User Button)이 누르게 되면 SetRTCAlarmA() 함수가 실행되게 된다.

User Button을 누른 뒤 00초가 되는 시점에 Console 창을 통해 Alarm이 울리는 것을 확인할 수 있다.

728x90