21
21
22
22
static bool __time24 = false ;
23
23
24
+ voidFuncPtr RTC_callBack = NULL ;
25
+
24
26
void RTCZero::begin (bool timeRep)
25
27
{
26
28
uint16_t tmp_reg = 0 ;
@@ -58,13 +60,55 @@ void RTCZero::begin(bool timeRep)
58
60
RTC->MODE2 .READREQ .reg &= ~RTC_READREQ_RCONT; // disable continuously mode
59
61
60
62
RTC->MODE2 .CTRL .reg = tmp_reg;
63
+ while (RTCisSyncing ())
64
+ ;
65
+
66
+ NVIC_EnableIRQ (RTC_IRQn); // enable RTC interrupt
67
+ NVIC_SetPriority (RTC_IRQn, 0x00 );
68
+
69
+ RTC->MODE2 .INTENSET .reg |= RTC_MODE2_INTENSET_ALARM0; // enable alarm interrupt
70
+ RTC->MODE2 .Mode2Alarm [0 ].MASK .bit .SEL = MATCH_OFF; // default alarm match is off (disabled)
71
+
61
72
while (RTCisSyncing ())
62
73
;
63
74
64
75
RTCenable ();
65
76
RTCresetRemove ();
66
77
}
67
78
79
+ void RTC_Handler (void )
80
+ {
81
+ if (RTC_callBack != NULL ) {
82
+ RTC_callBack ();
83
+ }
84
+
85
+ RTC->MODE2 .INTFLAG .reg = RTC_MODE2_INTFLAG_ALARM0; // must clear flag at end
86
+ }
87
+
88
+ void RTCZero::enableAlarm (Alarm_Match match)
89
+ {
90
+ RTC->MODE2 .Mode2Alarm [0 ].MASK .bit .SEL = match;
91
+ while (RTCisSyncing ())
92
+ ;
93
+ }
94
+
95
+ void RTCZero::disableAlarm ()
96
+ {
97
+ RTC->MODE2 .Mode2Alarm [0 ].MASK .bit .SEL = 0x00 ;
98
+ while (RTCisSyncing ())
99
+ ;
100
+ }
101
+
102
+ void RTCZero::attachInterrupt (voidFuncPtr callback)
103
+ {
104
+ RTC_callBack = callback;
105
+ }
106
+
107
+ void RTCZero::detachInterrupt ()
108
+ {
109
+ RTC_callBack = NULL ;
110
+ }
111
+
68
112
/*
69
113
* Get Functions
70
114
*/
@@ -99,6 +143,36 @@ uint8_t RTCZero::getYear()
99
143
return RTC->MODE2 .CLOCK .bit .YEAR ;
100
144
}
101
145
146
+ uint8_t RTCZero::getAlarmSeconds ()
147
+ {
148
+ return RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .SECOND ;
149
+ }
150
+
151
+ uint8_t RTCZero::getAlarmMinutes ()
152
+ {
153
+ return RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .MINUTE ;
154
+ }
155
+
156
+ uint8_t RTCZero::getAlarmHours ()
157
+ {
158
+ return RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .HOUR ;
159
+ }
160
+
161
+ uint8_t RTCZero::getAlarmDay ()
162
+ {
163
+ return RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .DAY ;
164
+ }
165
+
166
+ uint8_t RTCZero::getAlarmMonth ()
167
+ {
168
+ return RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .MONTH ;
169
+ }
170
+
171
+ uint8_t RTCZero::getAlarmYear ()
172
+ {
173
+ return RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .YEAR ;
174
+ }
175
+
102
176
/*
103
177
* Set Functions
104
178
*/
@@ -119,7 +193,7 @@ void RTCZero::setMinutes(uint8_t minutes)
119
193
120
194
void RTCZero::setHours (uint8_t hours)
121
195
{
122
- if (__time24) {
196
+ if (( __time24) || (hours < 13 ) ) {
123
197
RTC->MODE2 .CLOCK .bit .HOUR = hours;
124
198
} else {
125
199
RTC->MODE2 .CLOCK .bit .HOUR = hours - 12 ;
@@ -163,6 +237,67 @@ void RTCZero::setDate(uint8_t day, uint8_t month, uint8_t year)
163
237
setYear (year);
164
238
}
165
239
240
+ void RTCZero::setAlarmSeconds (uint8_t seconds)
241
+ {
242
+ RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .SECOND = seconds;
243
+ while (RTCisSyncing ())
244
+ ;
245
+ }
246
+
247
+ void RTCZero::setAlarmMinutes (uint8_t minutes)
248
+ {
249
+ RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .MINUTE = minutes;
250
+ while (RTCisSyncing ())
251
+ ;
252
+ }
253
+
254
+ void RTCZero::setAlarmHours (uint8_t hours)
255
+ {
256
+ if ((__time24) || (hours < 13 )) {
257
+ RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .HOUR = hours;
258
+ }
259
+ else {
260
+ RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .HOUR = hours - 12 ;
261
+ }
262
+ while (RTCisSyncing ())
263
+ ;
264
+ }
265
+
266
+ void RTCZero::setAlarmTime (uint8_t hours, uint8_t minutes, uint8_t seconds)
267
+ {
268
+ setAlarmSeconds (seconds);
269
+ setAlarmMinutes (minutes);
270
+ setAlarmHours (hours);
271
+ }
272
+
273
+ void RTCZero::setAlarmDay (uint8_t day)
274
+ {
275
+ RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .DAY = day;
276
+ while (RTCisSyncing ())
277
+ ;
278
+ }
279
+
280
+ void RTCZero::setAlarmMonth (uint8_t month)
281
+ {
282
+ RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .MONTH = month;
283
+ while (RTCisSyncing ())
284
+ ;
285
+ }
286
+
287
+ void RTCZero::setAlarmYear (uint8_t year)
288
+ {
289
+ RTC->MODE2 .Mode2Alarm [0 ].ALARM .bit .YEAR = year;
290
+ while (RTCisSyncing ())
291
+ ;
292
+ }
293
+
294
+ void RTCZero::setAlarmDate (uint8_t day, uint8_t month, uint8_t year)
295
+ {
296
+ setAlarmDay (day);
297
+ setAlarmMonth (month);
298
+ setAlarmYear (year);
299
+ }
300
+
166
301
/*
167
302
* Private Utility Functions
168
303
*/
@@ -171,6 +306,7 @@ void RTCZero::setDate(uint8_t day, uint8_t month, uint8_t year)
171
306
void RTCZero::config32kOSC ()
172
307
{
173
308
SYSCTRL->XOSC32K .reg = SYSCTRL_XOSC32K_ONDEMAND |
309
+ SYSCTRL_XOSC32K_RUNSTDBY |
174
310
SYSCTRL_XOSC32K_EN32K |
175
311
SYSCTRL_XOSC32K_XTALEN |
176
312
SYSCTRL_XOSC32K_STARTUP (6 ) |
0 commit comments