2020-2021 Sunseeker Telemetry and Lighting System
timer_a.c
Go to the documentation of this file.
1 //*****************************************************************************
2 //
3 // timer_a.c - Driver for the timer_a Module.
4 //
5 //*****************************************************************************
6 
7 //*****************************************************************************
8 //
11 //
12 //*****************************************************************************
13 
14 #include "inc/hw_memmap.h"
15 
16 #ifdef __MSP430_HAS_TxA7__
17 #include "timer_a.h"
18 
19 #include <assert.h>
20 
21 void Timer_A_startCounter ( uint16_t baseAddress,
22  uint16_t timerMode
23  )
24 {
25  HWREG16(baseAddress + OFS_TAxCTL) &= ~MC_3;
26  HWREG16(baseAddress + OFS_TAxCTL) |= timerMode;
27 }
28 
29 void Timer_A_initContinuousMode (uint16_t baseAddress,
30  Timer_A_initContinuousModeParam *param)
31 {
32 
33  HWREG16(baseAddress +
34  OFS_TAxCTL) &= ~(TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK +
35  TIMER_A_UPDOWN_MODE +
36  TIMER_A_DO_CLEAR +
37  TIMER_A_TAIE_INTERRUPT_ENABLE +
38  ID__8
39  );
40  HWREG16(baseAddress + OFS_TAxEX0) &= ~TAIDEX_7;
41 
42  HWREG16(baseAddress + OFS_TAxEX0) |= param->clockSourceDivider&0x7;
43  HWREG16(baseAddress + OFS_TAxCTL) |= (param->clockSource +
44  param->timerClear +
45  param->timerInterruptEnable_TAIE +
46  ((param->clockSourceDivider>>3)<<6));
47 
48  if(param->startTimer) {
49  HWREG16(baseAddress + OFS_TAxCTL) |= TIMER_A_CONTINUOUS_MODE;
50  }
51 }
52 
53 void Timer_A_initUpMode (uint16_t baseAddress,
54  Timer_A_initUpModeParam *param)
55 {
56 
57  HWREG16(baseAddress + OFS_TAxCTL) &=
58  ~(TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK +
59  TIMER_A_UPDOWN_MODE +
60  TIMER_A_DO_CLEAR +
61  TIMER_A_TAIE_INTERRUPT_ENABLE +
62  ID__8
63  );
64  HWREG16(baseAddress + OFS_TAxEX0) &= ~TAIDEX_7;
65 
66  HWREG16(baseAddress + OFS_TAxEX0) |= param->clockSourceDivider&0x7;
67  HWREG16(baseAddress + OFS_TAxCTL) |= (param->clockSource +
68  param->timerClear +
69  param->timerInterruptEnable_TAIE +
70  ((param->clockSourceDivider>>3)<<6));
71 
72  if (param->startTimer) {
73  HWREG16(baseAddress + OFS_TAxCTL) |= TIMER_A_UP_MODE;
74  }
75 
76  if (TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE ==
77  param->captureCompareInterruptEnable_CCR0_CCIE){
78  HWREG16(baseAddress + OFS_TAxCCTL0) |= TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;
79  } else {
80  HWREG16(baseAddress + OFS_TAxCCTL0) &= ~TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;
81  }
82 
83  HWREG16(baseAddress + OFS_TAxCCR0) = param->timerPeriod;
84 }
85 
86 void Timer_A_initUpDownMode(uint16_t baseAddress,
87  Timer_A_initUpDownModeParam *param)
88 {
89  HWREG16(baseAddress + OFS_TAxCTL) &=
90  ~(TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK +
91  TIMER_A_UPDOWN_MODE +
92  TIMER_A_DO_CLEAR +
93  TIMER_A_TAIE_INTERRUPT_ENABLE +
94  ID__8
95  );
96  HWREG16(baseAddress + OFS_TAxEX0) &= ~TAIDEX_7;
97 
98  HWREG16(baseAddress + OFS_TAxEX0) |= param->clockSourceDivider&0x7;
99  HWREG16(baseAddress + OFS_TAxCTL) |= (param->clockSource +
100  param->timerClear +
101  param->timerInterruptEnable_TAIE +
102  ((param->clockSourceDivider>>3)<<6));
103 
104  if (param->startTimer) {
105  HWREG16(baseAddress + OFS_TAxCTL) |= TIMER_A_UPDOWN_MODE;
106  }
107 
108  if (TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE ==
109  param->captureCompareInterruptEnable_CCR0_CCIE){
110  HWREG16(baseAddress + OFS_TAxCCTL0) |= TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;
111  } else {
112  HWREG16(baseAddress + OFS_TAxCCTL0) &= ~TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;
113  }
114 
115  HWREG16(baseAddress + OFS_TAxCCR0) = param->timerPeriod;
116 }
117 
118 void Timer_A_initCaptureMode(uint16_t baseAddress,
119  Timer_A_initCaptureModeParam *param)
120 {
121  HWREG16(baseAddress + param->captureRegister ) |= CAP;
122 
123  HWREG16(baseAddress + param->captureRegister) &=
124  ~(TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE +
125  TIMER_A_CAPTURE_INPUTSELECT_Vcc +
126  TIMER_A_CAPTURE_SYNCHRONOUS +
127  TIMER_A_DO_CLEAR +
128  TIMER_A_TAIE_INTERRUPT_ENABLE +
129  CM_3
130  );
131 
132  HWREG16(baseAddress + param->captureRegister) |= (param->captureMode +
133  param->captureInputSelect +
134  param->synchronizeCaptureSource +
135  param->captureInterruptEnable +
136  param->captureOutputMode
137  );
138 }
139 
140 void Timer_A_initCompareMode(uint16_t baseAddress,
141  Timer_A_initCompareModeParam *param)
142 {
143  HWREG16(baseAddress + param->compareRegister ) &= ~CAP;
144 
145  HWREG16(baseAddress + param->compareRegister) &=
146  ~(TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE +
147  TIMER_A_OUTPUTMODE_RESET_SET
148  );
149 
150  HWREG16(baseAddress + param->compareRegister) |= (param->compareInterruptEnable +
151  param->compareOutputMode
152  );
153 
154  HWREG16(baseAddress + param->compareRegister + OFS_TAxR) = param->compareValue;
155 }
156 
157 void Timer_A_enableInterrupt (uint16_t baseAddress)
158 {
159  HWREG16(baseAddress + OFS_TAxCTL) |= TAIE;
160 }
161 
162 void Timer_A_disableInterrupt (uint16_t baseAddress)
163 {
164  HWREG16(baseAddress + OFS_TAxCTL) &= ~TAIE;
165 }
166 
167 uint32_t Timer_A_getInterruptStatus (uint16_t baseAddress)
168 {
169  return ( HWREG16(baseAddress + OFS_TAxCTL) & TAIFG );
170 }
171 
172 void Timer_A_enableCaptureCompareInterrupt (uint16_t baseAddress,
173  uint16_t captureCompareRegister
174  )
175 {
176  HWREG16(baseAddress + captureCompareRegister) |= CCIE;
177 }
178 
179 void Timer_A_disableCaptureCompareInterrupt (uint16_t baseAddress,
180  uint16_t captureCompareRegister
181  )
182 {
183  HWREG16(baseAddress + captureCompareRegister) &= ~CCIE;
184 }
185 
186 uint32_t Timer_A_getCaptureCompareInterruptStatus (uint16_t baseAddress,
187  uint16_t captureCompareRegister,
188  uint16_t mask
189  )
190 {
191  return ( HWREG16(baseAddress + captureCompareRegister) & mask );
192 }
193 
194 void Timer_A_clear (uint16_t baseAddress)
195 {
196  HWREG16(baseAddress + OFS_TAxCTL) |= TACLR;
197 }
198 
199 uint8_t Timer_A_getSynchronizedCaptureCompareInput
200  (uint16_t baseAddress,
201  uint16_t captureCompareRegister,
202  uint16_t synchronized
203  )
204 {
205  if (HWREG16(baseAddress + captureCompareRegister) & synchronized){
206  return ( TIMER_A_CAPTURECOMPARE_INPUT_HIGH) ;
207  } else {
208  return ( TIMER_A_CAPTURECOMPARE_INPUT_LOW) ;
209  }
210 }
211 
212 uint8_t Timer_A_getOutputForOutputModeOutBitValue
213  (uint16_t baseAddress,
214  uint16_t captureCompareRegister
215  )
216 {
217  if (HWREG16(baseAddress + captureCompareRegister) & OUT){
218  return ( TIMER_A_OUTPUTMODE_OUTBITVALUE_HIGH) ;
219  } else {
220  return ( TIMER_A_OUTPUTMODE_OUTBITVALUE_LOW) ;
221  }
222 }
223 
224 uint16_t Timer_A_getCaptureCompareCount
225  (uint16_t baseAddress,
226  uint16_t captureCompareRegister
227  )
228 {
229  return (HWREG16(baseAddress + OFS_TAxR + captureCompareRegister));
230 }
231 
232 void Timer_A_setOutputForOutputModeOutBitValue
233  (uint16_t baseAddress,
234  uint16_t captureCompareRegister,
235  uint8_t outputModeOutBitValue
236  )
237 {
238 
239  HWREG16(baseAddress + captureCompareRegister) &= ~OUT;
240  HWREG16(baseAddress + captureCompareRegister) |= outputModeOutBitValue;
241 }
242 
243 void Timer_A_outputPWM(uint16_t baseAddress, Timer_A_outputPWMParam *param)
244 {
245  HWREG16(baseAddress + OFS_TAxCTL) &=
246  ~( TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK +
247  TIMER_A_UPDOWN_MODE + TIMER_A_DO_CLEAR +
248  TIMER_A_TAIE_INTERRUPT_ENABLE +
249  ID__8
250  );
251  HWREG16(baseAddress + OFS_TAxEX0) &= ~TAIDEX_7;
252 
253  HWREG16(baseAddress + OFS_TAxEX0) |= param->clockSourceDivider&0x7;
254  HWREG16(baseAddress + OFS_TAxCTL) |= (param->clockSource +
255  TIMER_A_UP_MODE +
256  TIMER_A_DO_CLEAR +
257  ((param->clockSourceDivider>>3)<<6));
258 
259  HWREG16(baseAddress + OFS_TAxCCR0) = param->timerPeriod;
260 
261  HWREG16(baseAddress + OFS_TAxCCTL0) &=
262  ~(TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE +
263  TIMER_A_OUTPUTMODE_RESET_SET);
264 
265  HWREG16(baseAddress + param->compareRegister) |= param->compareOutputMode;
266 
267  HWREG16(baseAddress + param->compareRegister + OFS_TAxR) = param->dutyCycle;
268 }
269 
270 void Timer_A_stop ( uint16_t baseAddress )
271 {
272  HWREG16(baseAddress + OFS_TAxCTL) &= ~MC_3;
273 }
274 
275 void Timer_A_setCompareValue ( uint16_t baseAddress,
276  uint16_t compareRegister,
277  uint16_t compareValue
278  )
279 {
280  HWREG16(baseAddress + compareRegister + OFS_TAxR) = compareValue;
281 }
282 
283 void Timer_A_setOutputMode(uint16_t baseAddress,
284  uint16_t compareRegister,
285  uint16_t compareOutputMode)
286 {
287  uint16_t temp = HWREG16(baseAddress + compareRegister);
288  HWREG16(baseAddress + compareRegister) = temp & ~(OUTMOD_7) | compareOutputMode;
289 }
290 void Timer_A_clearTimerInterrupt (uint16_t baseAddress)
291 {
292  HWREG16(baseAddress + OFS_TAxCTL) &= ~TAIFG;
293 }
294 
295 void Timer_A_clearCaptureCompareInterrupt (uint16_t baseAddress,
296  uint16_t captureCompareRegister
297  )
298 {
299  HWREG16(baseAddress + captureCompareRegister) &= ~CCIFG;
300 }
301 
302 uint16_t Timer_A_getCounterValue (uint16_t baseAddress)
303 {
304  uint16_t voteOne, voteTwo, res;
305 
306  voteTwo = HWREG16(baseAddress + OFS_TAxR);
307 
308  do
309  {
310  voteOne = voteTwo;
311  voteTwo = HWREG16(baseAddress + OFS_TAxR);
312 
313  if(voteTwo > voteOne) {
314  res = voteTwo - voteOne;
315  } else if(voteOne > voteTwo) {
316  res = voteOne - voteTwo;
317  } else{
318  res = 0;
319  }
320 
321  } while ( res > TIMER_A_THRESHOLD);
322 
323  return voteTwo;
324 }
325 
326 
327 #endif
328 //*****************************************************************************
329 //
332 //
333 //*****************************************************************************
MPU_initThreeSegmentsParam param
long temp
#define HWREG16(x)
Definition: hw_memmap.h:39