STM32 RTC Scheduler
RTC-based scheduler for ultra-low power applications
rtc.c
Go to the documentation of this file.
1 
14 /* Includes ------------------------------------------------------------------*/
15 #include "rtc.h"
16 #include "error_handler.h"
17 #include "hardware.h"
18 #include <time.h>
19 
20 /* Private variables ---------------------------------------------------------*/
22 RTC_HandleTypeDef hrtc;
23 
30 void RtcInit(void)
31 {
32  RTC_TimeTypeDef sTime = {0U};
33  RTC_DateTypeDef sDate = {0U};
34 
35  __HAL_RCC_RTC_ENABLE();
36  __HAL_RCC_PWR_CLK_ENABLE();
37  HAL_PWR_EnableBkUpAccess();
38 
39  HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 4U, 0U);
40  HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
41 
42  hrtc.Instance = RTC;
43  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
44  hrtc.Init.AsynchPrediv = 127U;
45  hrtc.Init.SynchPrediv = 249U;
46  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
47  hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
48  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
49  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
50  if(HAL_RTC_Init(&hrtc) != HAL_OK)
51  {
52  ErrorHandler();
53  }
54 
55  sTime.Hours = 11U;
56  sTime.Minutes = 0U;
57  sTime.Seconds = 0U;
58  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
59  sTime.StoreOperation = RTC_STOREOPERATION_RESET;
60  if(HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
61  {
62  ErrorHandler();
63  }
64 
65  sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
66  sDate.Month = RTC_MONTH_FEBRUARY;
67  sDate.Date = 24U;
68  sDate.Year = 21U;
69  if(HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
70  {
71  ErrorHandler();
72  }
73 }
74 
84 uint32_t RtcGetEpoch(void)
85 {
86  RTC_DateTypeDef date;
87  RTC_TimeTypeDef time;
88  struct tm dateTime;
89  static time_t epoch;
90 
91  HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
92  HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
93 
94  dateTime.tm_year = date.Year + 100U;
95  dateTime.tm_mon = date.Month - 1U;
96  dateTime.tm_mday = date.Date;
97  dateTime.tm_hour = time.Hours;
98  dateTime.tm_min = time.Minutes;
99  dateTime.tm_sec = time.Seconds;
100  dateTime.tm_isdst = 0U;
101 
102  epoch = mktime(&dateTime);
103 
104  return (uint32_t)epoch;
105 }
106 
120 void RtcConvertEpochToDatetime(uint32_t epoch,
121  RTC_DateTypeDef* date,
122  RTC_TimeTypeDef* time)
123 {
124  assert_param(date != NULL);
125  assert_param(time != NULL);
126 
127  time_t rawTime = (time_t)epoch;
128  struct tm dateTime = *localtime(&rawTime);
129 
130  date->Year = dateTime.tm_year - 100U;
131  date->Month = dateTime.tm_mon + 1U;
132  date->Date = dateTime.tm_mday;
133  date->WeekDay =
134  (dateTime.tm_wday == 0U) ? RTC_WEEKDAY_SUNDAY : dateTime.tm_wday;
135 
136  time->Hours = dateTime.tm_hour;
137  time->Minutes = dateTime.tm_min;
138  time->Seconds = dateTime.tm_sec;
139  time->SubSeconds = 0U;
140 }
141 
149 uint8_t RtcSetAlarmFromEpoch(const uint32_t epoch)
150 {
151  static RTC_DateTypeDef date = {0U};
152  static RTC_TimeTypeDef time = {0U};
153  static RTC_AlarmTypeDef sAlarm = {0U};
154  uint8_t result = 0U;
155 
156  /* Allow alarms to be set only in the future */
157  if(epoch > RtcGetEpoch())
158  {
159  RtcConvertEpochToDatetime(epoch, &date, &time);
160 
161  sAlarm.Alarm = RTC_ALARM_A;
162  sAlarm.AlarmDateWeekDay = date.Date;
163  sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
164  sAlarm.AlarmTime.Hours = time.Hours;
165  sAlarm.AlarmTime.Minutes = time.Minutes;
166  sAlarm.AlarmTime.Seconds = time.Seconds;
167  sAlarm.AlarmTime.SubSeconds = time.SubSeconds;
168  sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
169  sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
170  sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
171  sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
172 
173  if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) == HAL_OK)
174  {
175  result = 1U;
176  }
177  }
178  else
179  {
180  result = 0U;
181  }
182 
183  return result;
184 }
185 
190 {
191  HAL_RTC_DeactivateAlarm(&hrtc, RTC_ALARM_A);
192 }
193 
200 {
201  HAL_RTC_WaitForSynchro(&hrtc);
202 }
RtcWaitForClockSynchronization
void RtcWaitForClockSynchronization(void)
This function waits until the RTC time and date registers are synchronized with RTC APB clock....
Definition: rtc.c:199
hrtc
RTC_HandleTypeDef hrtc
Definition: rtc.c:22
RtcSetAlarmFromEpoch
uint8_t RtcSetAlarmFromEpoch(const uint32_t epoch)
Set an RTC alarm at a given time specified by an epoch.
Definition: rtc.c:149
RtcConvertEpochToDatetime
void RtcConvertEpochToDatetime(uint32_t epoch, RTC_DateTypeDef *date, RTC_TimeTypeDef *time)
Convert an epoch to human-readable date and time format.
Definition: rtc.c:120
RtcInit
void RtcInit(void)
RTC initialization function.
Definition: rtc.c:30
error_handler.h
This file contains the error handling function prototypes.
RtcGetEpoch
uint32_t RtcGetEpoch(void)
Get the current epoch.
Definition: rtc.c:84
hardware.h
This file contains the hardware-specific definitions and function prototypes.
ErrorHandler
void ErrorHandler(void)
This function is executed in case of an error.
Definition: error_handler.c:25
rtc.h
This file contains the RTC-specific function prototypes.
RtcDeactivateAlarm
void RtcDeactivateAlarm(void)
Deactivate a previously set RTC alarm.
Definition: rtc.c:189