Skip to content

Commit 144952c

Browse files
committed
Merge pull request #2 from GabrielNotman/master
Added Alarm/Compare Interrupt Functionality
2 parents ac041c5 + 9590892 commit 144952c

File tree

2 files changed

+174
-1
lines changed

2 files changed

+174
-1
lines changed

src/RTCZero.cpp

Lines changed: 137 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
static bool __time24 = false;
2323

24+
voidFuncPtr RTC_callBack = NULL;
25+
2426
void RTCZero::begin(bool timeRep)
2527
{
2628
uint16_t tmp_reg = 0;
@@ -58,13 +60,55 @@ void RTCZero::begin(bool timeRep)
5860
RTC->MODE2.READREQ.reg &= ~RTC_READREQ_RCONT; // disable continuously mode
5961

6062
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+
6172
while (RTCisSyncing())
6273
;
6374

6475
RTCenable();
6576
RTCresetRemove();
6677
}
6778

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+
68112
/*
69113
* Get Functions
70114
*/
@@ -99,6 +143,36 @@ uint8_t RTCZero::getYear()
99143
return RTC->MODE2.CLOCK.bit.YEAR;
100144
}
101145

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+
102176
/*
103177
* Set Functions
104178
*/
@@ -119,7 +193,7 @@ void RTCZero::setMinutes(uint8_t minutes)
119193

120194
void RTCZero::setHours(uint8_t hours)
121195
{
122-
if (__time24) {
196+
if ((__time24) || (hours < 13)) {
123197
RTC->MODE2.CLOCK.bit.HOUR = hours;
124198
} else {
125199
RTC->MODE2.CLOCK.bit.HOUR = hours - 12;
@@ -163,6 +237,67 @@ void RTCZero::setDate(uint8_t day, uint8_t month, uint8_t year)
163237
setYear(year);
164238
}
165239

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+
166301
/*
167302
* Private Utility Functions
168303
*/
@@ -171,6 +306,7 @@ void RTCZero::setDate(uint8_t day, uint8_t month, uint8_t year)
171306
void RTCZero::config32kOSC()
172307
{
173308
SYSCTRL->XOSC32K.reg = SYSCTRL_XOSC32K_ONDEMAND |
309+
SYSCTRL_XOSC32K_RUNSTDBY |
174310
SYSCTRL_XOSC32K_EN32K |
175311
SYSCTRL_XOSC32K_XTALEN |
176312
SYSCTRL_XOSC32K_STARTUP(6) |

src/RTCZero.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,30 @@
2424

2525
#include "Arduino.h"
2626

27+
typedef void(*voidFuncPtr)(void);
28+
2729
class RTCZero {
2830
public:
2931

32+
enum Alarm_Match: uint8_t // Should we have this enum or just use the identifiers from /component/rtc.h ?
33+
{
34+
MATCH_OFF = RTC_MODE2_MASK_SEL_OFF_Val,
35+
MATCH_SS = RTC_MODE2_MASK_SEL_SS_Val,
36+
MATCH_MMSS = RTC_MODE2_MASK_SEL_MMSS_Val,
37+
MATCH_HHMMSS = RTC_MODE2_MASK_SEL_HHMMSS_Val,
38+
MATCH_DHHMMSS = RTC_MODE2_MASK_SEL_DDHHMMSS_Val,
39+
MATCH_MMDDHHMMSS = RTC_MODE2_MASK_SEL_MMDDHHMMSS_Val,
40+
MATCH_YYMMDDHHMMSS = RTC_MODE2_MASK_SEL_YYMMDDHHMMSS_Val
41+
};
42+
3043
RTCZero() {};
3144
void begin(bool timeRep);
45+
46+
void enableAlarm(Alarm_Match match);
47+
void disableAlarm();
48+
49+
void attachInterrupt(voidFuncPtr callback);
50+
void detachInterrupt();
3251

3352
/* Get Functions */
3453

@@ -40,6 +59,14 @@ class RTCZero {
4059
uint8_t getMonth();
4160
uint8_t getYear();
4261

62+
uint8_t getAlarmSeconds();
63+
uint8_t getAlarmMinutes();
64+
uint8_t getAlarmHours();
65+
66+
uint8_t getAlarmDay();
67+
uint8_t getAlarmMonth();
68+
uint8_t getAlarmYear();
69+
4370
/* Set Functions */
4471

4572
void setSeconds(uint8_t seconds);
@@ -52,6 +79,16 @@ class RTCZero {
5279
void setYear(uint8_t year);
5380
void setDate(uint8_t day, uint8_t month, uint8_t year);
5481

82+
void setAlarmSeconds(uint8_t seconds);
83+
void setAlarmMinutes(uint8_t minutes);
84+
void setAlarmHours(uint8_t hours);
85+
void setAlarmTime(uint8_t hours, uint8_t minutes, uint8_t seconds);
86+
87+
void setAlarmDay(uint8_t day);
88+
void setAlarmMonth(uint8_t month);
89+
void setAlarmYear(uint8_t year);
90+
void setAlarmDate(uint8_t day, uint8_t month, uint8_t year);
91+
5592
private:
5693
void config32kOSC(void);
5794
bool RTCisSyncing(void);

0 commit comments

Comments
 (0)