xref: /btstack/port/msp432p401lp-cc256x/ti/devices/msp432p4xx/driverlib/rtc_c.c (revision 5fd0122a3e19d95e11e1f3eb8a08a2b2acb2557e)
1*5fd0122aSMatthias Ringwald /* --COPYRIGHT--,BSD
2*5fd0122aSMatthias Ringwald  * Copyright (c) 2017, Texas Instruments Incorporated
3*5fd0122aSMatthias Ringwald  * All rights reserved.
4*5fd0122aSMatthias Ringwald  *
5*5fd0122aSMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
6*5fd0122aSMatthias Ringwald  * modification, are permitted provided that the following conditions
7*5fd0122aSMatthias Ringwald  * are met:
8*5fd0122aSMatthias Ringwald  *
9*5fd0122aSMatthias Ringwald  * *  Redistributions of source code must retain the above copyright
10*5fd0122aSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
11*5fd0122aSMatthias Ringwald  *
12*5fd0122aSMatthias Ringwald  * *  Redistributions in binary form must reproduce the above copyright
13*5fd0122aSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
14*5fd0122aSMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
15*5fd0122aSMatthias Ringwald  *
16*5fd0122aSMatthias Ringwald  * *  Neither the name of Texas Instruments Incorporated nor the names of
17*5fd0122aSMatthias Ringwald  *    its contributors may be used to endorse or promote products derived
18*5fd0122aSMatthias Ringwald  *    from this software without specific prior written permission.
19*5fd0122aSMatthias Ringwald  *
20*5fd0122aSMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21*5fd0122aSMatthias Ringwald  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22*5fd0122aSMatthias Ringwald  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23*5fd0122aSMatthias Ringwald  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24*5fd0122aSMatthias Ringwald  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*5fd0122aSMatthias Ringwald  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*5fd0122aSMatthias Ringwald  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27*5fd0122aSMatthias Ringwald  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28*5fd0122aSMatthias Ringwald  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*5fd0122aSMatthias Ringwald  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*5fd0122aSMatthias Ringwald  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*5fd0122aSMatthias Ringwald  * --/COPYRIGHT--*/
32*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/rtc_c.h>
33*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/interrupt.h>
34*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/debug.h>
35*5fd0122aSMatthias Ringwald 
36*5fd0122aSMatthias Ringwald 
RTC_C_startClock(void)37*5fd0122aSMatthias Ringwald void RTC_C_startClock(void)
38*5fd0122aSMatthias Ringwald {
39*5fd0122aSMatthias Ringwald     RTC_C->CTL0 = (RTC_C->CTL0 & ~RTC_C_CTL0_KEY_MASK) | RTC_C_KEY;
40*5fd0122aSMatthias Ringwald     BITBAND_PERI(RTC_C->CTL13, RTC_C_CTL13_HOLD_OFS) = 0;
41*5fd0122aSMatthias Ringwald     BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_KEY_OFS) = 0;
42*5fd0122aSMatthias Ringwald }
43*5fd0122aSMatthias Ringwald 
RTC_C_holdClock(void)44*5fd0122aSMatthias Ringwald void RTC_C_holdClock(void)
45*5fd0122aSMatthias Ringwald {
46*5fd0122aSMatthias Ringwald     RTC_C->CTL0 = (RTC_C->CTL0 & ~RTC_C_CTL0_KEY_MASK) | RTC_C_KEY;
47*5fd0122aSMatthias Ringwald     BITBAND_PERI(RTC_C->CTL13, RTC_C_CTL13_HOLD_OFS) = 1;
48*5fd0122aSMatthias Ringwald     BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_KEY_OFS) = 0;
49*5fd0122aSMatthias Ringwald }
50*5fd0122aSMatthias Ringwald 
RTC_C_setCalibrationFrequency(uint_fast16_t frequencySelect)51*5fd0122aSMatthias Ringwald void RTC_C_setCalibrationFrequency(uint_fast16_t frequencySelect)
52*5fd0122aSMatthias Ringwald {
53*5fd0122aSMatthias Ringwald     RTC_C->CTL0 = (RTC_C->CTL0 & ~RTC_C_CTL0_KEY_MASK) | RTC_C_KEY;
54*5fd0122aSMatthias Ringwald     RTC_C->CTL13 = (RTC_C->CTL13 & ~(RTC_C_CTL13_CALF_3)) | frequencySelect;
55*5fd0122aSMatthias Ringwald     BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_KEY_OFS) = 0;
56*5fd0122aSMatthias Ringwald }
57*5fd0122aSMatthias Ringwald 
RTC_C_setCalibrationData(uint_fast8_t offsetDirection,uint_fast8_t offsetValue)58*5fd0122aSMatthias Ringwald void RTC_C_setCalibrationData(uint_fast8_t offsetDirection,
59*5fd0122aSMatthias Ringwald         uint_fast8_t offsetValue)
60*5fd0122aSMatthias Ringwald {
61*5fd0122aSMatthias Ringwald     RTC_C->CTL0 = (RTC_C->CTL0 & ~RTC_C_CTL0_KEY_MASK) | RTC_C_KEY;
62*5fd0122aSMatthias Ringwald     RTC_C->OCAL = offsetValue + offsetDirection;
63*5fd0122aSMatthias Ringwald     BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_KEY_OFS) = 0;
64*5fd0122aSMatthias Ringwald }
65*5fd0122aSMatthias Ringwald 
RTC_C_setTemperatureCompensation(uint_fast16_t offsetDirection,uint_fast8_t offsetValue)66*5fd0122aSMatthias Ringwald bool RTC_C_setTemperatureCompensation(uint_fast16_t offsetDirection,
67*5fd0122aSMatthias Ringwald         uint_fast8_t offsetValue)
68*5fd0122aSMatthias Ringwald {
69*5fd0122aSMatthias Ringwald     while (!BITBAND_PERI(RTC_C->TCMP, RTC_C_TCMP_TCRDY_OFS))
70*5fd0122aSMatthias Ringwald         ;
71*5fd0122aSMatthias Ringwald 
72*5fd0122aSMatthias Ringwald     RTC_C->TCMP = offsetValue + offsetDirection;
73*5fd0122aSMatthias Ringwald 
74*5fd0122aSMatthias Ringwald     if (BITBAND_PERI(RTC_C->TCMP, RTC_C_TCMP_TCOK_OFS))
75*5fd0122aSMatthias Ringwald         return true;
76*5fd0122aSMatthias Ringwald     else
77*5fd0122aSMatthias Ringwald         return false;
78*5fd0122aSMatthias Ringwald }
79*5fd0122aSMatthias Ringwald 
RTC_C_initCalendar(const RTC_C_Calendar * calendarTime,uint_fast16_t formatSelect)80*5fd0122aSMatthias Ringwald void RTC_C_initCalendar(const RTC_C_Calendar *calendarTime,
81*5fd0122aSMatthias Ringwald         uint_fast16_t formatSelect)
82*5fd0122aSMatthias Ringwald {
83*5fd0122aSMatthias Ringwald     RTC_C->CTL0 = (RTC_C->CTL0 & ~RTC_C_CTL0_KEY_MASK) | RTC_C_KEY;
84*5fd0122aSMatthias Ringwald 
85*5fd0122aSMatthias Ringwald     BITBAND_PERI(RTC_C->CTL13, RTC_C_CTL13_HOLD_OFS) = 1;
86*5fd0122aSMatthias Ringwald 
87*5fd0122aSMatthias Ringwald     if (formatSelect)
88*5fd0122aSMatthias Ringwald         BITBAND_PERI(RTC_C->CTL13, RTC_C_CTL13_BCD_OFS) = 1;
89*5fd0122aSMatthias Ringwald     else
90*5fd0122aSMatthias Ringwald         BITBAND_PERI(RTC_C->CTL13, RTC_C_CTL13_BCD_OFS) = 0;
91*5fd0122aSMatthias Ringwald 
92*5fd0122aSMatthias Ringwald     RTC_C->TIM0 = (calendarTime->minutes << RTC_C_TIM0_MIN_OFS)
93*5fd0122aSMatthias Ringwald             | calendarTime->seconds;
94*5fd0122aSMatthias Ringwald     RTC_C->TIM1 = (calendarTime->dayOfWeek << RTC_C_TIM1_DOW_OFS)
95*5fd0122aSMatthias Ringwald             | calendarTime->hours;
96*5fd0122aSMatthias Ringwald     RTC_C->DATE = (calendarTime->month << RTC_C_DATE_MON_OFS)
97*5fd0122aSMatthias Ringwald             | calendarTime->dayOfmonth;
98*5fd0122aSMatthias Ringwald     RTC_C->YEAR = calendarTime->year;
99*5fd0122aSMatthias Ringwald 
100*5fd0122aSMatthias Ringwald     BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_KEY_OFS) = 0;
101*5fd0122aSMatthias Ringwald }
102*5fd0122aSMatthias Ringwald 
103*5fd0122aSMatthias Ringwald 
RTC_C_getCalendarTime(void)104*5fd0122aSMatthias Ringwald RTC_C_Calendar RTC_C_getCalendarTime(void)
105*5fd0122aSMatthias Ringwald {
106*5fd0122aSMatthias Ringwald     RTC_C_Calendar tempCal;
107*5fd0122aSMatthias Ringwald 
108*5fd0122aSMatthias Ringwald     while (!(BITBAND_PERI(RTC_C->CTL13, RTC_C_CTL13_RDY_OFS)))
109*5fd0122aSMatthias Ringwald         ;
110*5fd0122aSMatthias Ringwald 
111*5fd0122aSMatthias Ringwald     tempCal.seconds = RTC_C->TIM0
112*5fd0122aSMatthias Ringwald             & (RTC_C_TIM0_SEC_LD_MASK | RTC_C_TIM0_SEC_HD_MASK);
113*5fd0122aSMatthias Ringwald     tempCal.minutes = (RTC_C->TIM0
114*5fd0122aSMatthias Ringwald             & (RTC_C_TIM0_MIN_LD_MASK | RTC_C_TIM0_MIN_HD_MASK))
115*5fd0122aSMatthias Ringwald             >> RTC_C_TIM0_MIN_OFS;
116*5fd0122aSMatthias Ringwald     tempCal.hours = RTC_C->TIM1
117*5fd0122aSMatthias Ringwald             & (RTC_C_TIM1_HOUR_LD_MASK | RTC_C_TIM1_HOUR_HD_MASK);
118*5fd0122aSMatthias Ringwald     tempCal.dayOfWeek = (RTC_C->TIM1
119*5fd0122aSMatthias Ringwald             & (RTC_C_TIM1_DOW_MASK)) >> RTC_C_TIM1_DOW_OFS;
120*5fd0122aSMatthias Ringwald     tempCal.dayOfmonth = RTC_C->DATE
121*5fd0122aSMatthias Ringwald             & (RTC_C_DATE_DAY_LD_MASK | RTC_C_DATE_DAY_HD_MASK);
122*5fd0122aSMatthias Ringwald     tempCal.month = (RTC_C->DATE & (RTC_C_DATE_MON_LD_MASK | RTC_C_DATE_MON_HD))
123*5fd0122aSMatthias Ringwald             >> RTC_C_DATE_MON_OFS;
124*5fd0122aSMatthias Ringwald     tempCal.year = RTC_C->YEAR;
125*5fd0122aSMatthias Ringwald 
126*5fd0122aSMatthias Ringwald     return (tempCal);
127*5fd0122aSMatthias Ringwald }
128*5fd0122aSMatthias Ringwald 
129*5fd0122aSMatthias Ringwald 
RTC_C_setCalendarAlarm(uint_fast8_t minutesAlarm,uint_fast8_t hoursAlarm,uint_fast8_t dayOfWeekAlarm,uint_fast8_t dayOfmonthAlarm)130*5fd0122aSMatthias Ringwald void RTC_C_setCalendarAlarm(uint_fast8_t minutesAlarm, uint_fast8_t hoursAlarm,
131*5fd0122aSMatthias Ringwald         uint_fast8_t dayOfWeekAlarm, uint_fast8_t dayOfmonthAlarm)
132*5fd0122aSMatthias Ringwald {
133*5fd0122aSMatthias Ringwald     //Each of these is XORed with 0x80 to turn on if an integer is passed,
134*5fd0122aSMatthias Ringwald     //or turn OFF if RTC_ALARM_OFF (0x80) is passed.
135*5fd0122aSMatthias Ringwald     RTC_C->AMINHR = ((hoursAlarm ^ 0x80) << 8 )| (minutesAlarm ^ 0x80);
136*5fd0122aSMatthias Ringwald     RTC_C->ADOWDAY = ((dayOfmonthAlarm ^ 0x80) << 8 )| (dayOfWeekAlarm ^ 0x80);
137*5fd0122aSMatthias Ringwald }
138*5fd0122aSMatthias Ringwald 
RTC_C_setCalendarEvent(uint_fast16_t eventSelect)139*5fd0122aSMatthias Ringwald void RTC_C_setCalendarEvent(uint_fast16_t eventSelect)
140*5fd0122aSMatthias Ringwald {
141*5fd0122aSMatthias Ringwald     RTC_C->CTL0 = (RTC_C->CTL0 & ~RTC_C_CTL0_KEY_MASK) | RTC_C_KEY;
142*5fd0122aSMatthias Ringwald     RTC_C->CTL13 = (RTC_C->CTL13 & ~(RTC_C_CTL13_TEV_3)) | eventSelect;
143*5fd0122aSMatthias Ringwald     BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_KEY_OFS) = 0;
144*5fd0122aSMatthias Ringwald }
145*5fd0122aSMatthias Ringwald 
RTC_C_definePrescaleEvent(uint_fast8_t prescaleSelect,uint_fast8_t prescaleEventDivider)146*5fd0122aSMatthias Ringwald void RTC_C_definePrescaleEvent(uint_fast8_t prescaleSelect,
147*5fd0122aSMatthias Ringwald         uint_fast8_t prescaleEventDivider)
148*5fd0122aSMatthias Ringwald {
149*5fd0122aSMatthias Ringwald     if(prescaleSelect == RTC_C_PRESCALE_0)
150*5fd0122aSMatthias Ringwald     {
151*5fd0122aSMatthias Ringwald         HWREG8(&RTC_C->PS0CTL) &= ~(RTC_C_PS0CTL_RT0IP_7);
152*5fd0122aSMatthias Ringwald         HWREG8(&RTC_C->PS0CTL) |= prescaleEventDivider;
153*5fd0122aSMatthias Ringwald     }
154*5fd0122aSMatthias Ringwald     else if(prescaleSelect == RTC_C_PRESCALE_1)
155*5fd0122aSMatthias Ringwald     {
156*5fd0122aSMatthias Ringwald         HWREG8(&RTC_C->PS1CTL) &= ~(RTC_C_PS0CTL_RT0IP_7);
157*5fd0122aSMatthias Ringwald         HWREG8(&RTC_C->PS1CTL) |= prescaleEventDivider;
158*5fd0122aSMatthias Ringwald     }
159*5fd0122aSMatthias Ringwald }
160*5fd0122aSMatthias Ringwald 
RTC_C_getPrescaleValue(uint_fast8_t prescaleSelect)161*5fd0122aSMatthias Ringwald uint_fast8_t RTC_C_getPrescaleValue(uint_fast8_t prescaleSelect)
162*5fd0122aSMatthias Ringwald {
163*5fd0122aSMatthias Ringwald     if (RTC_C_PRESCALE_0 == prescaleSelect)
164*5fd0122aSMatthias Ringwald     {
165*5fd0122aSMatthias Ringwald         return (RTC_C->PS & RTC_C_PS_RT0PS_MASK);
166*5fd0122aSMatthias Ringwald     } else if (RTC_C_PRESCALE_1 == prescaleSelect)
167*5fd0122aSMatthias Ringwald     {
168*5fd0122aSMatthias Ringwald         return (RTC_C->PS & RTC_C_PS_RT1PS_MASK)>>RTC_C_PS_RT1PS_OFS;
169*5fd0122aSMatthias Ringwald     } else
170*5fd0122aSMatthias Ringwald     {
171*5fd0122aSMatthias Ringwald         return (0);
172*5fd0122aSMatthias Ringwald     }
173*5fd0122aSMatthias Ringwald }
174*5fd0122aSMatthias Ringwald 
RTC_C_setPrescaleValue(uint_fast8_t prescaleSelect,uint_fast8_t prescaleCounterValue)175*5fd0122aSMatthias Ringwald void RTC_C_setPrescaleValue(uint_fast8_t prescaleSelect,
176*5fd0122aSMatthias Ringwald         uint_fast8_t prescaleCounterValue)
177*5fd0122aSMatthias Ringwald {
178*5fd0122aSMatthias Ringwald     RTC_C->CTL0 = (RTC_C->CTL0 & ~RTC_C_CTL0_KEY_MASK) | RTC_C_KEY;
179*5fd0122aSMatthias Ringwald 
180*5fd0122aSMatthias Ringwald     if (RTC_C_PRESCALE_0 == prescaleSelect)
181*5fd0122aSMatthias Ringwald     {
182*5fd0122aSMatthias Ringwald         RTC_C->PS = (RTC_C->PS & ~RTC_C_PS_RT0PS_MASK) | prescaleCounterValue;
183*5fd0122aSMatthias Ringwald     } else if (RTC_C_PRESCALE_1 == prescaleSelect)
184*5fd0122aSMatthias Ringwald     {
185*5fd0122aSMatthias Ringwald         RTC_C->PS = (RTC_C->PS & ~RTC_C_PS_RT1PS_MASK)
186*5fd0122aSMatthias Ringwald                 | (prescaleCounterValue << RTC_C_PS_RT1PS_OFS);
187*5fd0122aSMatthias Ringwald     }
188*5fd0122aSMatthias Ringwald 
189*5fd0122aSMatthias Ringwald     BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_KEY_OFS) = 0;
190*5fd0122aSMatthias Ringwald }
191*5fd0122aSMatthias Ringwald 
RTC_C_convertBCDToBinary(uint16_t valueToConvert)192*5fd0122aSMatthias Ringwald uint16_t RTC_C_convertBCDToBinary(uint16_t valueToConvert)
193*5fd0122aSMatthias Ringwald {
194*5fd0122aSMatthias Ringwald     RTC_C->BCD2BIN = valueToConvert;
195*5fd0122aSMatthias Ringwald     return (RTC_C->BCD2BIN);
196*5fd0122aSMatthias Ringwald }
197*5fd0122aSMatthias Ringwald 
RTC_C_convertBinaryToBCD(uint16_t valueToConvert)198*5fd0122aSMatthias Ringwald uint16_t RTC_C_convertBinaryToBCD(uint16_t valueToConvert)
199*5fd0122aSMatthias Ringwald {
200*5fd0122aSMatthias Ringwald     RTC_C->BIN2BCD = valueToConvert;
201*5fd0122aSMatthias Ringwald     return (RTC_C->BIN2BCD);
202*5fd0122aSMatthias Ringwald }
203*5fd0122aSMatthias Ringwald 
RTC_C_enableInterrupt(uint8_t interruptMask)204*5fd0122aSMatthias Ringwald void RTC_C_enableInterrupt(uint8_t interruptMask)
205*5fd0122aSMatthias Ringwald {
206*5fd0122aSMatthias Ringwald     if (interruptMask
207*5fd0122aSMatthias Ringwald             & (RTC_C_CTL0_OFIE + RTC_C_CTL0_TEVIE + RTC_C_CTL0_AIE
208*5fd0122aSMatthias Ringwald                     + RTC_C_CTL0_RDYIE))
209*5fd0122aSMatthias Ringwald     {
210*5fd0122aSMatthias Ringwald         RTC_C->CTL0 = (RTC_C->CTL0 & ~RTC_C_CTL0_KEY_MASK)
211*5fd0122aSMatthias Ringwald                 | (RTC_C_KEY
212*5fd0122aSMatthias Ringwald                         | (interruptMask
213*5fd0122aSMatthias Ringwald                                 & (RTC_C_CTL0_OFIE + RTC_C_CTL0_TEVIE
214*5fd0122aSMatthias Ringwald                                         + RTC_C_CTL0_AIE + RTC_C_CTL0_RDYIE)));
215*5fd0122aSMatthias Ringwald         BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_KEY_OFS) = 0;
216*5fd0122aSMatthias Ringwald     }
217*5fd0122aSMatthias Ringwald 
218*5fd0122aSMatthias Ringwald     if (interruptMask & RTC_C_PRESCALE_TIMER0_INTERRUPT)
219*5fd0122aSMatthias Ringwald     {
220*5fd0122aSMatthias Ringwald         BITBAND_PERI(RTC_C->PS0CTL, RTC_C_PS0CTL_RT0PSIE_OFS) = 1;
221*5fd0122aSMatthias Ringwald     }
222*5fd0122aSMatthias Ringwald 
223*5fd0122aSMatthias Ringwald     if (interruptMask & RTC_C_PRESCALE_TIMER1_INTERRUPT)
224*5fd0122aSMatthias Ringwald     {
225*5fd0122aSMatthias Ringwald         BITBAND_PERI(RTC_C->PS1CTL,RTC_C_PS1CTL_RT1PSIE_OFS) = 1;
226*5fd0122aSMatthias Ringwald     }
227*5fd0122aSMatthias Ringwald }
228*5fd0122aSMatthias Ringwald 
RTC_C_disableInterrupt(uint8_t interruptMask)229*5fd0122aSMatthias Ringwald void RTC_C_disableInterrupt(uint8_t interruptMask)
230*5fd0122aSMatthias Ringwald {
231*5fd0122aSMatthias Ringwald     uint16_t allIntMask = (RTC_C_CTL0_OFIE + RTC_C_CTL0_TEVIE + RTC_C_CTL0_AIE
232*5fd0122aSMatthias Ringwald             + RTC_C_CTL0_RDYIE);
233*5fd0122aSMatthias Ringwald 
234*5fd0122aSMatthias Ringwald     if (interruptMask & allIntMask)
235*5fd0122aSMatthias Ringwald     {
236*5fd0122aSMatthias Ringwald         RTC_C->CTL0 = (RTC_C->CTL0
237*5fd0122aSMatthias Ringwald                 & ~((interruptMask & allIntMask) | RTC_C_CTL0_KEY_MASK))
238*5fd0122aSMatthias Ringwald                 | RTC_C_KEY;
239*5fd0122aSMatthias Ringwald 
240*5fd0122aSMatthias Ringwald         BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_KEY_OFS) = 0;
241*5fd0122aSMatthias Ringwald     }
242*5fd0122aSMatthias Ringwald 
243*5fd0122aSMatthias Ringwald     if (interruptMask & RTC_C_PRESCALE_TIMER0_INTERRUPT)
244*5fd0122aSMatthias Ringwald     {
245*5fd0122aSMatthias Ringwald         BITBAND_PERI(RTC_C->PS0CTL, RTC_C_PS0CTL_RT0PSIE_OFS) = 0;
246*5fd0122aSMatthias Ringwald     }
247*5fd0122aSMatthias Ringwald 
248*5fd0122aSMatthias Ringwald     if (interruptMask & RTC_C_PRESCALE_TIMER1_INTERRUPT)
249*5fd0122aSMatthias Ringwald     {
250*5fd0122aSMatthias Ringwald         BITBAND_PERI(RTC_C->PS1CTL, RTC_C_PS1CTL_RT1PSIE_OFS) = 0;
251*5fd0122aSMatthias Ringwald     }
252*5fd0122aSMatthias Ringwald }
253*5fd0122aSMatthias Ringwald 
RTC_C_getInterruptStatus(void)254*5fd0122aSMatthias Ringwald uint_fast8_t RTC_C_getInterruptStatus(void)
255*5fd0122aSMatthias Ringwald {
256*5fd0122aSMatthias Ringwald     uint_fast8_t tempInterruptFlagMask = 0x00;
257*5fd0122aSMatthias Ringwald     uint_fast8_t interruptFlagMask = RTC_C_TIME_EVENT_INTERRUPT
258*5fd0122aSMatthias Ringwald             | RTC_C_CLOCK_ALARM_INTERRUPT | RTC_C_CLOCK_READ_READY_INTERRUPT
259*5fd0122aSMatthias Ringwald             | RTC_C_PRESCALE_TIMER0_INTERRUPT | RTC_C_PRESCALE_TIMER1_INTERRUPT
260*5fd0122aSMatthias Ringwald             | RTC_C_OSCILLATOR_FAULT_INTERRUPT;
261*5fd0122aSMatthias Ringwald 
262*5fd0122aSMatthias Ringwald     tempInterruptFlagMask |= (RTC_C->CTL0 & (interruptFlagMask >> 4));
263*5fd0122aSMatthias Ringwald 
264*5fd0122aSMatthias Ringwald     tempInterruptFlagMask = tempInterruptFlagMask << 4;
265*5fd0122aSMatthias Ringwald 
266*5fd0122aSMatthias Ringwald     if (interruptFlagMask & RTC_C_PRESCALE_TIMER0_INTERRUPT)
267*5fd0122aSMatthias Ringwald     {
268*5fd0122aSMatthias Ringwald         if (BITBAND_PERI(RTC_C->PS0CTL, RTC_C_PS0CTL_RT0PSIFG_OFS))
269*5fd0122aSMatthias Ringwald         {
270*5fd0122aSMatthias Ringwald             tempInterruptFlagMask |= RTC_C_PRESCALE_TIMER0_INTERRUPT;
271*5fd0122aSMatthias Ringwald         }
272*5fd0122aSMatthias Ringwald     }
273*5fd0122aSMatthias Ringwald 
274*5fd0122aSMatthias Ringwald     if (interruptFlagMask & RTC_C_PRESCALE_TIMER1_INTERRUPT)
275*5fd0122aSMatthias Ringwald     {
276*5fd0122aSMatthias Ringwald         if (BITBAND_PERI(RTC_C->PS1CTL, RTC_C_PS1CTL_RT1PSIFG_OFS))
277*5fd0122aSMatthias Ringwald         {
278*5fd0122aSMatthias Ringwald             tempInterruptFlagMask |= RTC_C_PRESCALE_TIMER1_INTERRUPT;
279*5fd0122aSMatthias Ringwald         }
280*5fd0122aSMatthias Ringwald     }
281*5fd0122aSMatthias Ringwald 
282*5fd0122aSMatthias Ringwald     return (tempInterruptFlagMask);
283*5fd0122aSMatthias Ringwald }
284*5fd0122aSMatthias Ringwald 
RTC_C_getEnabledInterruptStatus(void)285*5fd0122aSMatthias Ringwald uint_fast8_t RTC_C_getEnabledInterruptStatus(void)
286*5fd0122aSMatthias Ringwald {
287*5fd0122aSMatthias Ringwald 
288*5fd0122aSMatthias Ringwald     uint16_t intStatus = RTC_C_getInterruptStatus();
289*5fd0122aSMatthias Ringwald 
290*5fd0122aSMatthias Ringwald     if (!BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_OFIE_OFS))
291*5fd0122aSMatthias Ringwald     {
292*5fd0122aSMatthias Ringwald         intStatus &= ~RTC_C_OSCILLATOR_FAULT_INTERRUPT;
293*5fd0122aSMatthias Ringwald     }
294*5fd0122aSMatthias Ringwald 
295*5fd0122aSMatthias Ringwald     if (!BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_TEVIE_OFS))
296*5fd0122aSMatthias Ringwald     {
297*5fd0122aSMatthias Ringwald         intStatus &= ~RTC_C_TIME_EVENT_INTERRUPT;
298*5fd0122aSMatthias Ringwald     }
299*5fd0122aSMatthias Ringwald 
300*5fd0122aSMatthias Ringwald     if (!BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_AIE_OFS))
301*5fd0122aSMatthias Ringwald     {
302*5fd0122aSMatthias Ringwald         intStatus &= ~RTC_C_CLOCK_ALARM_INTERRUPT;
303*5fd0122aSMatthias Ringwald     }
304*5fd0122aSMatthias Ringwald 
305*5fd0122aSMatthias Ringwald     if (!BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_RDYIE_OFS))
306*5fd0122aSMatthias Ringwald     {
307*5fd0122aSMatthias Ringwald         intStatus &= ~RTC_C_CLOCK_READ_READY_INTERRUPT;
308*5fd0122aSMatthias Ringwald     }
309*5fd0122aSMatthias Ringwald 
310*5fd0122aSMatthias Ringwald     if (!BITBAND_PERI(RTC_C->PS0CTL, RTC_C_PS0CTL_RT0PSIE_OFS))
311*5fd0122aSMatthias Ringwald     {
312*5fd0122aSMatthias Ringwald         intStatus &= ~RTC_C_PRESCALE_TIMER0_INTERRUPT;
313*5fd0122aSMatthias Ringwald     }
314*5fd0122aSMatthias Ringwald 
315*5fd0122aSMatthias Ringwald     if (!BITBAND_PERI(RTC_C->PS1CTL, RTC_C_PS1CTL_RT1PSIE_OFS))
316*5fd0122aSMatthias Ringwald     {
317*5fd0122aSMatthias Ringwald         intStatus &= ~RTC_C_PRESCALE_TIMER1_INTERRUPT;
318*5fd0122aSMatthias Ringwald     }
319*5fd0122aSMatthias Ringwald 
320*5fd0122aSMatthias Ringwald     return intStatus;
321*5fd0122aSMatthias Ringwald }
322*5fd0122aSMatthias Ringwald 
RTC_C_clearInterruptFlag(uint_fast8_t interruptFlagMask)323*5fd0122aSMatthias Ringwald void RTC_C_clearInterruptFlag(uint_fast8_t interruptFlagMask)
324*5fd0122aSMatthias Ringwald {
325*5fd0122aSMatthias Ringwald     if (interruptFlagMask
326*5fd0122aSMatthias Ringwald             & (RTC_C_TIME_EVENT_INTERRUPT + RTC_C_CLOCK_ALARM_INTERRUPT
327*5fd0122aSMatthias Ringwald                     + RTC_C_CLOCK_READ_READY_INTERRUPT
328*5fd0122aSMatthias Ringwald                     + RTC_C_OSCILLATOR_FAULT_INTERRUPT))
329*5fd0122aSMatthias Ringwald     {
330*5fd0122aSMatthias Ringwald         RTC_C->CTL0 = RTC_C_KEY
331*5fd0122aSMatthias Ringwald                 | (RTC_C->CTL0 & ~((interruptFlagMask >> 4) | RTC_C_CTL0_KEY_MASK));
332*5fd0122aSMatthias Ringwald         BITBAND_PERI(RTC_C->CTL0, RTC_C_CTL0_KEY_OFS) = 0;
333*5fd0122aSMatthias Ringwald     }
334*5fd0122aSMatthias Ringwald 
335*5fd0122aSMatthias Ringwald     if (interruptFlagMask & RTC_C_PRESCALE_TIMER0_INTERRUPT)
336*5fd0122aSMatthias Ringwald     {
337*5fd0122aSMatthias Ringwald         BITBAND_PERI(RTC_C->PS0CTL, RTC_C_PS0CTL_RT0PSIFG_OFS) = 0;
338*5fd0122aSMatthias Ringwald     }
339*5fd0122aSMatthias Ringwald 
340*5fd0122aSMatthias Ringwald     if (interruptFlagMask & RTC_C_PRESCALE_TIMER1_INTERRUPT)
341*5fd0122aSMatthias Ringwald     {
342*5fd0122aSMatthias Ringwald         BITBAND_PERI(RTC_C->PS1CTL, RTC_C_PS1CTL_RT1PSIFG_OFS) = 0;
343*5fd0122aSMatthias Ringwald     }
344*5fd0122aSMatthias Ringwald }
345*5fd0122aSMatthias Ringwald 
RTC_C_registerInterrupt(void (* intHandler)(void))346*5fd0122aSMatthias Ringwald void RTC_C_registerInterrupt(void (*intHandler)(void))
347*5fd0122aSMatthias Ringwald {
348*5fd0122aSMatthias Ringwald     Interrupt_registerInterrupt(INT_RTC_C, intHandler);
349*5fd0122aSMatthias Ringwald     Interrupt_enableInterrupt(INT_RTC_C);
350*5fd0122aSMatthias Ringwald }
351*5fd0122aSMatthias Ringwald 
RTC_C_unregisterInterrupt(void)352*5fd0122aSMatthias Ringwald void RTC_C_unregisterInterrupt(void)
353*5fd0122aSMatthias Ringwald {
354*5fd0122aSMatthias Ringwald     Interrupt_disableInterrupt(INT_RTC_C);
355*5fd0122aSMatthias Ringwald     Interrupt_unregisterInterrupt(INT_RTC_C);
356*5fd0122aSMatthias Ringwald }
357*5fd0122aSMatthias Ringwald 
358