2 * Copyright (c) 2014, Texas Instruments Incorporated
\r
3 * All rights reserved.
\r
5 * Redistribution and use in source and binary forms, with or without
\r
6 * modification, are permitted provided that the following conditions
\r
9 * * Redistributions of source code must retain the above copyright
\r
10 * notice, this list of conditions and the following disclaimer.
\r
12 * * Redistributions in binary form must reproduce the above copyright
\r
13 * notice, this list of conditions and the following disclaimer in the
\r
14 * documentation and/or other materials provided with the distribution.
\r
16 * * Neither the name of Texas Instruments Incorporated nor the names of
\r
17 * its contributors may be used to endorse or promote products derived
\r
18 * from this software without specific prior written permission.
\r
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
\r
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
\r
22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
\r
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
\r
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
\r
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
\r
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
\r
27 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
\r
28 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
\r
29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
\r
30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
32 //*****************************************************************************
\r
34 // timer_a.c - Driver for the timer_a Module.
\r
36 //*****************************************************************************
\r
38 //*****************************************************************************
\r
40 //! \addtogroup timer_a_api timer_a
\r
43 //*****************************************************************************
\r
45 #include "inc/hw_regaccess.h"
\r
46 #include "inc/hw_memmap.h"
\r
48 #ifdef __MSP430_HAS_TxA7__
\r
49 #include "timer_a.h"
\r
53 void Timer_A_startCounter(uint16_t baseAddress,
\r
56 HWREG16(baseAddress + OFS_TAxCTL) |= timerMode;
\r
59 void Timer_A_initContinuousMode(uint16_t baseAddress,
\r
60 Timer_A_initContinuousModeParam *param)
\r
62 HWREG16(baseAddress +
\r
63 OFS_TAxCTL) &= ~(TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK +
\r
64 TIMER_A_UPDOWN_MODE +
\r
66 TIMER_A_TAIE_INTERRUPT_ENABLE +
\r
69 HWREG16(baseAddress + OFS_TAxEX0) &= ~TAIDEX_7;
\r
71 HWREG16(baseAddress + OFS_TAxEX0) |= param->clockSourceDivider & 0x7;
\r
72 HWREG16(baseAddress + OFS_TAxCTL) |= (param->clockSource +
\r
74 param->timerInterruptEnable_TAIE +
\r
75 ((param->clockSourceDivider >>
\r
78 if(param->startTimer)
\r
80 HWREG16(baseAddress + OFS_TAxCTL) |= TIMER_A_CONTINUOUS_MODE;
\r
84 void Timer_A_initUpMode(uint16_t baseAddress,
\r
85 Timer_A_initUpModeParam *param)
\r
87 HWREG16(baseAddress + OFS_TAxCTL) &=
\r
88 ~(TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK +
\r
89 TIMER_A_UPDOWN_MODE +
\r
91 TIMER_A_TAIE_INTERRUPT_ENABLE +
\r
94 HWREG16(baseAddress + OFS_TAxEX0) &= ~TAIDEX_7;
\r
96 HWREG16(baseAddress + OFS_TAxEX0) |= param->clockSourceDivider & 0x7;
\r
97 HWREG16(baseAddress + OFS_TAxCTL) |= (param->clockSource +
\r
99 param->timerInterruptEnable_TAIE +
\r
100 ((param->clockSourceDivider >>
\r
103 if(param->startTimer)
\r
105 HWREG16(baseAddress + OFS_TAxCTL) |= TIMER_A_UP_MODE;
\r
108 if(TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE ==
\r
109 param->captureCompareInterruptEnable_CCR0_CCIE)
\r
111 HWREG16(baseAddress +
\r
112 OFS_TAxCCTL0) |= TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;
\r
116 HWREG16(baseAddress +
\r
117 OFS_TAxCCTL0) &= ~TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;
\r
120 HWREG16(baseAddress + OFS_TAxCCR0) = param->timerPeriod;
\r
123 void Timer_A_initUpDownMode(uint16_t baseAddress,
\r
124 Timer_A_initUpDownModeParam *param)
\r
126 HWREG16(baseAddress + OFS_TAxCTL) &=
\r
127 ~(TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK +
\r
128 TIMER_A_UPDOWN_MODE +
\r
130 TIMER_A_TAIE_INTERRUPT_ENABLE +
\r
133 HWREG16(baseAddress + OFS_TAxEX0) &= ~TAIDEX_7;
\r
135 HWREG16(baseAddress + OFS_TAxEX0) |= param->clockSourceDivider & 0x7;
\r
136 HWREG16(baseAddress + OFS_TAxCTL) |= (param->clockSource +
\r
137 param->timerClear +
\r
138 param->timerInterruptEnable_TAIE +
\r
139 ((param->clockSourceDivider >>
\r
142 if(param->startTimer)
\r
144 HWREG16(baseAddress + OFS_TAxCTL) |= TIMER_A_UPDOWN_MODE;
\r
147 if(TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE ==
\r
148 param->captureCompareInterruptEnable_CCR0_CCIE)
\r
150 HWREG16(baseAddress +
\r
151 OFS_TAxCCTL0) |= TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;
\r
155 HWREG16(baseAddress +
\r
156 OFS_TAxCCTL0) &= ~TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;
\r
159 HWREG16(baseAddress + OFS_TAxCCR0) = param->timerPeriod;
\r
162 void Timer_A_initCaptureMode(uint16_t baseAddress,
\r
163 Timer_A_initCaptureModeParam *param)
\r
165 HWREG16(baseAddress + param->captureRegister) |= CAP;
\r
167 HWREG16(baseAddress + param->captureRegister) &=
\r
168 ~(TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE +
\r
169 TIMER_A_CAPTURE_INPUTSELECT_Vcc +
\r
170 TIMER_A_CAPTURE_SYNCHRONOUS +
\r
172 TIMER_A_TAIE_INTERRUPT_ENABLE +
\r
176 HWREG16(baseAddress + param->captureRegister) |= (param->captureMode +
\r
177 param->captureInputSelect
\r
180 synchronizeCaptureSource +
\r
182 captureInterruptEnable +
\r
183 param->captureOutputMode
\r
187 void Timer_A_initCompareMode(uint16_t baseAddress,
\r
188 Timer_A_initCompareModeParam *param)
\r
190 HWREG16(baseAddress + param->compareRegister) &= ~CAP;
\r
192 HWREG16(baseAddress + param->compareRegister) &=
\r
193 ~(TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE +
\r
194 TIMER_A_OUTPUTMODE_RESET_SET
\r
197 HWREG16(baseAddress +
\r
198 param->compareRegister) |= (param->compareInterruptEnable +
\r
199 param->compareOutputMode
\r
202 HWREG16(baseAddress + param->compareRegister +
\r
203 OFS_TAxR) = param->compareValue;
\r
206 void Timer_A_enableInterrupt(uint16_t baseAddress)
\r
208 HWREG16(baseAddress + OFS_TAxCTL) |= TAIE;
\r
211 void Timer_A_disableInterrupt(uint16_t baseAddress)
\r
213 HWREG16(baseAddress + OFS_TAxCTL) &= ~TAIE;
\r
216 uint32_t Timer_A_getInterruptStatus(uint16_t baseAddress)
\r
218 return (HWREG16(baseAddress + OFS_TAxCTL) & TAIFG);
\r
221 void Timer_A_enableCaptureCompareInterrupt(uint16_t baseAddress,
\r
222 uint16_t captureCompareRegister)
\r
224 HWREG16(baseAddress + captureCompareRegister) |= CCIE;
\r
227 void Timer_A_disableCaptureCompareInterrupt(uint16_t baseAddress,
\r
228 uint16_t captureCompareRegister)
\r
230 HWREG16(baseAddress + captureCompareRegister) &= ~CCIE;
\r
233 uint32_t Timer_A_getCaptureCompareInterruptStatus(uint16_t baseAddress,
\r
234 uint16_t captureCompareRegister,
\r
237 return (HWREG16(baseAddress + captureCompareRegister) & mask);
\r
240 void Timer_A_clear(uint16_t baseAddress)
\r
242 HWREG16(baseAddress + OFS_TAxCTL) |= TACLR;
\r
245 uint8_t Timer_A_getSynchronizedCaptureCompareInput(uint16_t baseAddress,
\r
246 uint16_t captureCompareRegister,
\r
247 uint16_t synchronized)
\r
249 if(HWREG16(baseAddress + captureCompareRegister) & synchronized)
\r
251 return (TIMER_A_CAPTURECOMPARE_INPUT_HIGH);
\r
255 return (TIMER_A_CAPTURECOMPARE_INPUT_LOW);
\r
259 uint8_t Timer_A_getOutputForOutputModeOutBitValue(uint16_t baseAddress,
\r
260 uint16_t captureCompareRegister)
\r
262 if(HWREG16(baseAddress + captureCompareRegister) & OUT)
\r
264 return (TIMER_A_OUTPUTMODE_OUTBITVALUE_HIGH);
\r
268 return (TIMER_A_OUTPUTMODE_OUTBITVALUE_LOW);
\r
272 uint16_t Timer_A_getCaptureCompareCount(uint16_t baseAddress,
\r
273 uint16_t captureCompareRegister)
\r
275 return (HWREG16(baseAddress + OFS_TAxR + captureCompareRegister));
\r
278 void Timer_A_setOutputForOutputModeOutBitValue(uint16_t baseAddress,
\r
279 uint16_t captureCompareRegister,
\r
280 uint8_t outputModeOutBitValue)
\r
282 HWREG16(baseAddress + captureCompareRegister) &= ~OUT;
\r
283 HWREG16(baseAddress + captureCompareRegister) |= outputModeOutBitValue;
\r
286 void Timer_A_outputPWM(uint16_t baseAddress,
\r
287 Timer_A_outputPWMParam *param)
\r
289 HWREG16(baseAddress + OFS_TAxCTL) &=
\r
290 ~(TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK +
\r
291 TIMER_A_UPDOWN_MODE + TIMER_A_DO_CLEAR +
\r
292 TIMER_A_TAIE_INTERRUPT_ENABLE +
\r
295 HWREG16(baseAddress + OFS_TAxEX0) &= ~TAIDEX_7;
\r
297 HWREG16(baseAddress + OFS_TAxEX0) |= param->clockSourceDivider & 0x7;
\r
298 HWREG16(baseAddress + OFS_TAxCTL) |= (param->clockSource +
\r
301 ((param->clockSourceDivider >>
\r
304 HWREG16(baseAddress + OFS_TAxCCR0) = param->timerPeriod;
\r
306 HWREG16(baseAddress + OFS_TAxCCTL0) &=
\r
307 ~(TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE +
\r
308 TIMER_A_OUTPUTMODE_RESET_SET);
\r
310 HWREG16(baseAddress + param->compareRegister) |= param->compareOutputMode;
\r
312 HWREG16(baseAddress + param->compareRegister + OFS_TAxR) = param->dutyCycle;
\r
315 void Timer_A_stop(uint16_t baseAddress)
\r
317 HWREG16(baseAddress + OFS_TAxCTL) &= ~MC_3;
\r
320 void Timer_A_setCompareValue(uint16_t baseAddress,
\r
321 uint16_t compareRegister,
\r
322 uint16_t compareValue)
\r
324 HWREG16(baseAddress + compareRegister + OFS_TAxR) = compareValue;
\r
327 void Timer_A_clearTimerInterrupt(uint16_t baseAddress)
\r
329 HWREG16(baseAddress + OFS_TAxCTL) &= ~TAIFG;
\r
332 void Timer_A_clearCaptureCompareInterrupt(uint16_t baseAddress,
\r
333 uint16_t captureCompareRegister)
\r
335 HWREG16(baseAddress + captureCompareRegister) &= ~CCIFG;
\r
338 uint16_t Timer_A_getCounterValue(uint16_t baseAddress)
\r
340 uint16_t voteOne, voteTwo, res;
\r
342 voteTwo = HWREG16(baseAddress + OFS_TAxR);
\r
347 voteTwo = HWREG16(baseAddress + OFS_TAxR);
\r
349 if(voteTwo > voteOne)
\r
351 res = voteTwo - voteOne;
\r
353 else if(voteOne > voteTwo)
\r
355 res = voteOne - voteTwo;
\r
362 while(res > TIMER_A_THRESHOLD);
\r
368 //*****************************************************************************
\r
370 //! Close the doxygen group for timer_a_api
\r
373 //*****************************************************************************
\r