2 * -------------------------------------------
3 * MSP432 DriverLib - v3_10_00_09
4 * -------------------------------------------
6 * --COPYRIGHT--,BSD,BSD
7 * Copyright (c) 2014, Texas Instruments Incorporated
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
14 * * Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
17 * * Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
21 * * Neither the name of Texas Instruments Incorporated nor the names of
22 * its contributors may be used to endorse or promote products derived
23 * from this software without specific prior written permission.
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
27 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
29 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
32 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
33 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
34 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
35 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 #include <interrupt.h>
41 static uint16_t __getRegisterSettingForInput(uint32_t input)
46 return COMP_E_CTL0_IPSEL_0;
48 return COMP_E_CTL0_IPSEL_1;
50 return COMP_E_CTL0_IPSEL_2;
52 return COMP_E_CTL0_IPSEL_3;
54 return COMP_E_CTL0_IPSEL_4;
56 return COMP_E_CTL0_IPSEL_5;
58 return COMP_E_CTL0_IPSEL_6;
60 return COMP_E_CTL0_IPSEL_7;
62 return COMP_E_CTL0_IPSEL_8;
64 return COMP_E_CTL0_IPSEL_9;
66 return COMP_E_CTL0_IPSEL_10;
68 return COMP_E_CTL0_IPSEL_11;
70 return COMP_E_CTL0_IPSEL_12;
72 return COMP_E_CTL0_IPSEL_13;
74 return COMP_E_CTL0_IPSEL_14;
76 return COMP_E_CTL0_IPSEL_15;
86 bool COMP_E_initModule(uint32_t comparator, const COMP_E_Config *config)
88 uint_fast8_t positiveTerminalInput = __getRegisterSettingForInput(
89 config->positiveTerminalInput);
90 uint_fast8_t negativeTerminalInput = __getRegisterSettingForInput(
91 config->negativeTerminalInput);
94 ASSERT(positiveTerminalInput < 0x10); ASSERT(negativeTerminalInput < 0x10);
95 ASSERT(positiveTerminalInput != negativeTerminalInput);
97 config->outputFilterEnableAndDelayLevel
98 <= COMP_E_FILTEROUTPUT_DLYLVL4);
100 /* Reset COMPE Control 1 & Interrupt Registers for initialization */
101 COMP_E_CMSIS(comparator)->CTL0 = 0;
102 COMP_E_CMSIS(comparator)->INT = 0;
104 // Set the Positive Terminal
105 if (COMP_E_VREF != positiveTerminalInput)
107 // Enable Positive Terminal Input Mux and Set to the appropriate input
108 COMP_E_CMSIS(comparator)->CTL0 |= COMP_E_CTL0_IPEN
109 + positiveTerminalInput;
111 // Disable the input buffer
112 COMP_E_CMSIS(comparator)->CTL3 |= (1 << positiveTerminalInput);
115 // Reset and Set COMPE Control 2 Register
116 BITBAND_PERI(COMP_E_CMSIS(comparator)->CTL2,COMP_E_CTL2_RSEL_OFS) = 0;
119 // Set the Negative Terminal
120 if (COMP_E_VREF != negativeTerminalInput)
122 // Enable Negative Terminal Input Mux and Set to the appropriate input
123 COMP_E_CMSIS(comparator)->CTL0 |= COMP_E_CTL0_IMEN
124 + (negativeTerminalInput << 8);
126 // Disable the input buffer
127 COMP_E_CMSIS(comparator)->CTL3 |= (1 << negativeTerminalInput);
130 // Reset and Set COMPE Control 2 Register
131 BITBAND_PERI(COMP_E_CMSIS(comparator)->CTL2, COMP_E_CTL2_RSEL_OFS) = 1;
134 // Reset and Set COMPE Control 1 Register
135 COMP_E_CMSIS(comparator)->CTL1 = config->powerMode
136 + config->outputFilterEnableAndDelayLevel
137 + config->invertedOutputPolarity;
142 void COMP_E_setReferenceVoltage(uint32_t comparator,
143 uint_fast16_t supplyVoltageReferenceBase,
144 uint_fast16_t lowerLimitSupplyVoltageFractionOf32,
145 uint_fast16_t upperLimitSupplyVoltageFractionOf32)
147 ASSERT(supplyVoltageReferenceBase <= COMP_E_VREFBASE2_5V);
148 ASSERT(upperLimitSupplyVoltageFractionOf32 <= 32);
149 ASSERT(lowerLimitSupplyVoltageFractionOf32 <= 32); ASSERT(
150 upperLimitSupplyVoltageFractionOf32
151 >= lowerLimitSupplyVoltageFractionOf32);
153 BITBAND_PERI(COMP_E_CMSIS(comparator)->CTL1, COMP_E_CTL1_MRVS_OFS) = 0;
154 COMP_E_CMSIS(comparator)->CTL2 &= COMP_E_CTL2_RSEL;
156 // Set Voltage Source(Vcc | Vref, resistor ladder or not)
157 if (COMP_E_REFERENCE_AMPLIFIER_DISABLED == supplyVoltageReferenceBase)
159 COMP_E_CMSIS(comparator)->CTL2 |= COMP_E_CTL2_RS_1;
160 } else if (lowerLimitSupplyVoltageFractionOf32 == 32)
162 COMP_E_CMSIS(comparator)->CTL2 |= COMP_E_CTL2_RS_3;
165 COMP_E_CMSIS(comparator)->CTL2 |= COMP_E_CTL2_RS_2;
168 // Set COMPE Control 2 Register
169 COMP_E_CMSIS(comparator)->CTL2 |= supplyVoltageReferenceBase
170 + ((upperLimitSupplyVoltageFractionOf32 - 1) << 8)
171 + (lowerLimitSupplyVoltageFractionOf32 - 1);
174 void COMP_E_setReferenceAccuracy(uint32_t comparator,
175 uint_fast16_t referenceAccuracy)
178 (referenceAccuracy == COMP_E_ACCURACY_STATIC)
179 || (referenceAccuracy == COMP_E_ACCURACY_CLOCKED));
181 if (referenceAccuracy)
182 BITBAND_PERI(COMP_E_CMSIS(comparator)->CTL2, COMP_E_CTL2_REFACC_OFS) = 1;
184 BITBAND_PERI(COMP_E_CMSIS(comparator)->CTL2, COMP_E_CTL2_REFACC_OFS) = 0;
188 void COMP_E_setPowerMode(uint32_t comparator, uint_fast16_t powerMode)
190 COMP_E_CMSIS(comparator)->CTL1 = (COMP_E_CMSIS(comparator)->CTL1
191 & ~(COMP_E_CTL1_PWRMD_MASK)) | powerMode;
194 void COMP_E_enableModule(uint32_t comparator)
196 BITBAND_PERI(COMP_E_CMSIS(comparator)->CTL1, COMP_E_CTL1_ON_OFS) = 1;
199 void COMP_E_disableModule(uint32_t comparator)
201 BITBAND_PERI(COMP_E_CMSIS(comparator)->CTL1, COMP_E_CTL1_ON_OFS) = 0;
204 void COMP_E_shortInputs(uint32_t comparator)
206 BITBAND_PERI(COMP_E_CMSIS(comparator)->CTL1, COMP_E_CTL1_SHORT_OFS) = 1;
209 void COMP_E_unshortInputs(uint32_t comparator)
211 BITBAND_PERI(COMP_E_CMSIS(comparator)->CTL1, COMP_E_CTL1_SHORT_OFS) = 0;
214 void COMP_E_disableInputBuffer(uint32_t comparator, uint_fast16_t inputPort)
216 ASSERT(inputPort <= COMP_E_INPUT15);
218 COMP_E_CMSIS(comparator)->CTL3 |= (inputPort);
221 void COMP_E_enableInputBuffer(uint32_t comparator, uint_fast16_t inputPort)
223 ASSERT(inputPort <= COMP_E_INPUT15);
225 COMP_E_CMSIS(comparator)->CTL3 &= ~(inputPort);
228 void COMP_E_swapIO(uint32_t comparator)
230 COMP_E_CMSIS(comparator)->CTL1 ^= COMP_E_CTL1_EX; // Toggle CEEX bit
233 uint8_t COMP_E_outputValue(uint32_t comparator)
235 return COMP_E_CMSIS(comparator)->CTL1 & COMP_E_CTL1_OUT;
238 void COMP_E_enableInterrupt(uint32_t comparator, uint_fast16_t mask)
240 // Set the Interrupt enable bit
241 COMP_E_CMSIS(comparator)->INT |= mask;
244 uint_fast16_t COMP_E_getEnabledInterruptStatus(uint32_t comparator)
246 return COMP_E_getInterruptStatus(comparator) &
247 COMP_E_CMSIS(comparator)->INT;
250 void COMP_E_disableInterrupt(uint32_t comparator, uint_fast16_t mask)
252 COMP_E_CMSIS(comparator)->INT &= ~(mask);
255 void COMP_E_clearInterruptFlag(uint32_t comparator, uint_fast16_t mask)
257 COMP_E_CMSIS(comparator)->INT &= ~(mask);
260 uint_fast16_t COMP_E_getInterruptStatus(uint32_t comparator)
262 return (COMP_E_CMSIS(comparator)->INT & (COMP_E_OUTPUT_INTERRUPT_FLAG |
263 COMP_E_INTERRUPT_FLAG_INVERTED_POLARITY |
264 COMP_E_INTERRUPT_FLAG_READY));
267 void COMP_E_setInterruptEdgeDirection(uint32_t comparator,
268 uint_fast8_t edgeDirection)
270 ASSERT(edgeDirection <= COMP_E_RISINGEDGE);
272 // Set the edge direction that will trigger an interrupt
273 if (COMP_E_RISINGEDGE == edgeDirection)
274 BITBAND_PERI(COMP_E_CMSIS(comparator)->CTL1, COMP_E_CTL1_IES_OFS) = 1;
275 else if (COMP_E_FALLINGEDGE == edgeDirection)
276 BITBAND_PERI(COMP_E_CMSIS(comparator)->CTL1, COMP_E_CTL1_IES_OFS) = 0;
279 void COMP_E_toggleInterruptEdgeDirection(uint32_t comparator)
281 COMP_E_CMSIS(comparator)->CTL1 ^= COMP_E_CTL1_IES;
284 void COMP_E_registerInterrupt(uint32_t comparator, void (*intHandler)(void))
289 Interrupt_registerInterrupt(INT_COMP_E0, intHandler);
290 Interrupt_enableInterrupt(INT_COMP_E0);
293 Interrupt_registerInterrupt(INT_COMP_E1, intHandler);
294 Interrupt_enableInterrupt(INT_COMP_E1);
301 void COMP_E_unregisterInterrupt(uint32_t comparator)
306 Interrupt_disableInterrupt(INT_COMP_E0);
307 Interrupt_unregisterInterrupt(INT_COMP_E0);
310 Interrupt_disableInterrupt(INT_COMP_E1);
311 Interrupt_unregisterInterrupt(INT_COMP_E1);