16 #ifdef __MSP430_HAS_RTC__
21 void RTC_A_startClock (uint16_t baseAddress)
23 HWREG8(baseAddress + OFS_RTCCTL01_H) &= ~(RTCHOLD_H);
26 void RTC_A_holdClock (uint16_t baseAddress)
28 HWREG8(baseAddress + OFS_RTCCTL01_H) |= RTCHOLD_H;
31 void RTC_A_setCalibrationFrequency (uint16_t baseAddress,
32 uint16_t frequencySelect)
34 HWREG16(baseAddress + OFS_RTCCTL23) &= ~(RTCCALF_3);
35 HWREG16(baseAddress + OFS_RTCCTL23) |= frequencySelect;
38 void RTC_A_setCalibrationData (uint16_t baseAddress,
39 uint8_t offsetDirection,
42 HWREG8(baseAddress + OFS_RTCCTL23_L) = offsetValue + offsetDirection;
45 void RTC_A_initCounter (uint16_t baseAddress,
47 uint16_t counterSizeSelect)
49 HWREG8(baseAddress + OFS_RTCCTL01_H) |= RTCHOLD_H;
50 HWREG8(baseAddress + OFS_RTCCTL01_H) &= ~(RTCMODE_H);
52 HWREG16(baseAddress + OFS_RTCCTL01) &= 0xF0FF;
53 HWREG16(baseAddress + OFS_RTCCTL01) |= clockSelect + counterSizeSelect;
56 void RTC_A_initCalendar (uint16_t baseAddress,
57 Calendar *CalendarTime,
58 uint16_t formatSelect)
60 HWREG8(baseAddress + OFS_RTCCTL01_H) |= RTCMODE_H + RTCHOLD_H;
62 HWREG16(baseAddress + OFS_RTCCTL01) &= ~(RTCBCD);
63 HWREG16(baseAddress + OFS_RTCCTL01) |= formatSelect;
65 HWREG8(baseAddress + OFS_RTCTIM0_L) = CalendarTime->Seconds;
66 HWREG8(baseAddress + OFS_RTCTIM0_H) = CalendarTime->Minutes;
67 HWREG8(baseAddress + OFS_RTCTIM1_L) = CalendarTime->Hours;
68 HWREG8(baseAddress + OFS_RTCTIM1_H) = CalendarTime->DayOfWeek;
69 HWREG8(baseAddress + OFS_RTCDATE_L) = CalendarTime->DayOfMonth;
70 HWREG8(baseAddress + OFS_RTCDATE_H) = CalendarTime->Month;
71 HWREG16(baseAddress + OFS_RTCYEAR) = CalendarTime->Year;
74 Calendar RTC_A_getCalendarTime (uint16_t baseAddress)
78 while ( !(
HWREG16(baseAddress + OFS_RTCCTL01) & RTCRDY) ) ;
80 tempCal.Seconds =
HWREG8(baseAddress + OFS_RTCTIM0_L);
81 tempCal.Minutes =
HWREG8(baseAddress + OFS_RTCTIM0_H);
82 tempCal.Hours =
HWREG8(baseAddress + OFS_RTCTIM1_L);
83 tempCal.DayOfWeek =
HWREG8(baseAddress + OFS_RTCTIM1_H);
84 tempCal.DayOfMonth =
HWREG8(baseAddress + OFS_RTCDATE_L);
85 tempCal.Month =
HWREG8(baseAddress + OFS_RTCDATE_H);
86 tempCal.Year =
HWREG16(baseAddress + OFS_RTCYEAR);
91 void RTC_A_configureCalendarAlarm(uint16_t baseAddress,
92 RTC_A_configureCalendarAlarmParam *
param)
96 HWREG8(baseAddress + OFS_RTCAMINHR_L) = (
param->minutesAlarm ^ 0x80);
97 HWREG8(baseAddress + OFS_RTCAMINHR_H) = (
param->hoursAlarm ^ 0x80);
98 HWREG8(baseAddress + OFS_RTCADOWDAY_L) = (
param->dayOfWeekAlarm ^ 0x80);
99 HWREG8(baseAddress + OFS_RTCADOWDAY_H) = (
param->dayOfMonthAlarm ^ 0x80);
101 void RTC_A_setCalendarEvent (uint16_t baseAddress,
102 uint16_t eventSelect)
104 HWREG16(baseAddress + OFS_RTCCTL01) &= ~(RTCTEV_3);
105 HWREG16(baseAddress + OFS_RTCCTL01) |= eventSelect;
108 uint32_t RTC_A_getCounterValue (uint16_t baseAddress)
110 if ( (
HWREG8(baseAddress + OFS_RTCCTL01_H) & RTCHOLD_H)
111 || (
HWREG8(baseAddress + OFS_RTCPS1CTL) & RT1PSHOLD) ){
115 uint32_t counterValue_L =
HWREG16(baseAddress + OFS_RTCTIM0);
116 uint32_t counterValue_H =
HWREG16(baseAddress + OFS_RTCTIM1);
117 return ( (counterValue_H << 16) + counterValue_L );
120 void RTC_A_setCounterValue (uint16_t baseAddress,
121 uint32_t counterValue)
123 HWREG16(baseAddress + OFS_RTCTIM0) = counterValue;
124 HWREG16(baseAddress + OFS_RTCTIM1) = ( counterValue >> 16 );
127 void RTC_A_initCounterPrescale (uint16_t baseAddress,
128 uint8_t prescaleSelect,
129 uint16_t prescaleClockSelect,
130 uint16_t prescaleDivider)
133 HWREG16(baseAddress + OFS_RTCPS0CTL + prescaleSelect) =
134 prescaleClockSelect + prescaleDivider;
137 void RTC_A_holdCounterPrescale (uint16_t baseAddress,
138 uint8_t prescaleSelect)
140 HWREG8(baseAddress + OFS_RTCPS0CTL_H + prescaleSelect) |= RT0PSHOLD_H;
143 void RTC_A_startCounterPrescale (uint16_t baseAddress,
144 uint8_t prescaleSelect)
146 HWREG8(baseAddress + OFS_RTCPS0CTL_H + prescaleSelect) &= ~(RT0PSHOLD_H);
149 void RTC_A_definePrescaleEvent (uint16_t baseAddress,
150 uint8_t prescaleSelect,
151 uint8_t prescaleEventDivider)
153 HWREG8(baseAddress + OFS_RTCPS0CTL_L + prescaleSelect) &= ~(RT0IP_7);
154 HWREG8(baseAddress + OFS_RTCPS0CTL_L +
155 prescaleSelect) |= prescaleEventDivider;
158 uint8_t RTC_A_getPrescaleValue (uint16_t baseAddress,
159 uint8_t prescaleSelect)
161 if (
HWREG8(baseAddress + OFS_RTCPS0CTL_H + prescaleSelect) & RT0PSHOLD_H){
165 if (RTC_A_PRESCALE_0 == prescaleSelect){
166 return (
HWREG8(baseAddress + OFS_RTCPS_L) );
167 }
else if (RTC_A_PRESCALE_1 == prescaleSelect){
168 return (
HWREG8(baseAddress + OFS_RTCPS_H) );
174 void RTC_A_setPrescaleValue (uint16_t baseAddress,
175 uint8_t prescaleSelect,
176 uint8_t prescaleCounterValue)
178 if (RTC_A_PRESCALE_0 == prescaleSelect){
179 HWREG8(baseAddress + OFS_RTCPS_L) = prescaleCounterValue;
180 }
else if (RTC_A_PRESCALE_1 == prescaleSelect){
181 HWREG8(baseAddress + OFS_RTCPS_H) = prescaleCounterValue;
185 void RTC_A_enableInterrupt (uint16_t baseAddress,
186 uint8_t interruptMask)
188 if ( interruptMask & (RTCTEVIE + RTCAIE + RTCRDYIE) ){
189 HWREG8(baseAddress + OFS_RTCCTL01_L) |=
190 (interruptMask & (RTCTEVIE + RTCAIE + RTCRDYIE));
193 if (interruptMask & RTC_A_PRESCALE_TIMER0_INTERRUPT){
194 HWREG8(baseAddress + OFS_RTCPS0CTL) |= RT0PSIE;
197 if (interruptMask & RTC_A_PRESCALE_TIMER1_INTERRUPT){
198 HWREG8(baseAddress + OFS_RTCPS1CTL) |= RT1PSIE;
202 void RTC_A_disableInterrupt (uint16_t baseAddress,
203 uint8_t interruptMask)
205 if ( interruptMask & ( RTCTEVIE + RTCAIE + RTCRDYIE) ){
206 HWREG8(baseAddress + OFS_RTCCTL01_L) &=
207 ~(interruptMask & (RTCTEVIE + RTCAIE + RTCRDYIE));
210 if (interruptMask & RTC_A_PRESCALE_TIMER0_INTERRUPT){
211 HWREG8(baseAddress + OFS_RTCPS0CTL) &= ~(RT0PSIE);
214 if (interruptMask & RTC_A_PRESCALE_TIMER1_INTERRUPT){
215 HWREG8(baseAddress + OFS_RTCPS1CTL) &= ~(RT1PSIE);
219 uint8_t RTC_A_getInterruptStatus (uint16_t baseAddress,
220 uint8_t interruptFlagMask)
222 uint8_t tempInterruptFlagMask = 0x0000;
224 tempInterruptFlagMask |= (
HWREG8(baseAddress + OFS_RTCCTL01_L)
225 & ((interruptFlagMask >> 4)
231 tempInterruptFlagMask = tempInterruptFlagMask << 4;
233 if (interruptFlagMask & RTC_A_PRESCALE_TIMER0_INTERRUPT){
234 if (
HWREG8(baseAddress + OFS_RTCPS0CTL) & RT0PSIFG){
235 tempInterruptFlagMask |= RTC_A_PRESCALE_TIMER0_INTERRUPT;
239 if (interruptFlagMask & RTC_A_PRESCALE_TIMER1_INTERRUPT){
240 if (
HWREG8(baseAddress + OFS_RTCPS1CTL) & RT1PSIFG){
241 tempInterruptFlagMask |= RTC_A_PRESCALE_TIMER1_INTERRUPT;
245 return ( tempInterruptFlagMask) ;
248 void RTC_A_clearInterrupt (uint16_t baseAddress,
249 uint8_t interruptFlagMask)
251 if ( interruptFlagMask & (RTC_A_TIME_EVENT_INTERRUPT +
252 RTC_A_CLOCK_ALARM_INTERRUPT +
253 RTC_A_CLOCK_READ_READY_INTERRUPT
256 HWREG8(baseAddress + OFS_RTCCTL01_L) &=
257 ~((interruptFlagMask>>4) & (RTCTEVIFG +
262 if (interruptFlagMask & RTC_A_PRESCALE_TIMER0_INTERRUPT){
263 HWREG8(baseAddress + OFS_RTCPS0CTL) &= ~(RT0PSIFG);
266 if (interruptFlagMask & RTC_A_PRESCALE_TIMER1_INTERRUPT){
267 HWREG8(baseAddress + OFS_RTCPS1CTL) &= ~(RT1PSIFG);
MPU_initThreeSegmentsParam param