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/uart.h>
33*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/interrupt.h>
34*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/debug.h>
35*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/eusci.h>
36*5fd0122aSMatthias Ringwald
UART_initModule(uint32_t moduleInstance,const eUSCI_UART_ConfigV1 * config)37*5fd0122aSMatthias Ringwald bool UART_initModule(uint32_t moduleInstance, const eUSCI_UART_ConfigV1 *config)
38*5fd0122aSMatthias Ringwald {
39*5fd0122aSMatthias Ringwald bool retVal = true;
40*5fd0122aSMatthias Ringwald
41*5fd0122aSMatthias Ringwald ASSERT(
42*5fd0122aSMatthias Ringwald (EUSCI_A_UART_MODE == config->uartMode)
43*5fd0122aSMatthias Ringwald || (EUSCI_A_UART_IDLE_LINE_MULTI_PROCESSOR_MODE
44*5fd0122aSMatthias Ringwald == config->uartMode)
45*5fd0122aSMatthias Ringwald || (EUSCI_A_UART_ADDRESS_BIT_MULTI_PROCESSOR_MODE
46*5fd0122aSMatthias Ringwald == config->uartMode)
47*5fd0122aSMatthias Ringwald || (EUSCI_A_UART_AUTOMATIC_BAUDRATE_DETECTION_MODE
48*5fd0122aSMatthias Ringwald == config->uartMode));
49*5fd0122aSMatthias Ringwald
50*5fd0122aSMatthias Ringwald ASSERT(
51*5fd0122aSMatthias Ringwald (EUSCI_A_UART_CLOCKSOURCE_ACLK == config->selectClockSource)
52*5fd0122aSMatthias Ringwald || (EUSCI_A_UART_CLOCKSOURCE_SMCLK
53*5fd0122aSMatthias Ringwald == config->selectClockSource));
54*5fd0122aSMatthias Ringwald
55*5fd0122aSMatthias Ringwald ASSERT(
56*5fd0122aSMatthias Ringwald (EUSCI_A_UART_MSB_FIRST == config->msborLsbFirst)
57*5fd0122aSMatthias Ringwald || (EUSCI_A_UART_LSB_FIRST == config->msborLsbFirst));
58*5fd0122aSMatthias Ringwald
59*5fd0122aSMatthias Ringwald ASSERT(
60*5fd0122aSMatthias Ringwald (EUSCI_A_UART_ONE_STOP_BIT == config->numberofStopBits)
61*5fd0122aSMatthias Ringwald || (EUSCI_A_UART_TWO_STOP_BITS == config->numberofStopBits));
62*5fd0122aSMatthias Ringwald
63*5fd0122aSMatthias Ringwald ASSERT(
64*5fd0122aSMatthias Ringwald (EUSCI_A_UART_NO_PARITY == config->parity)
65*5fd0122aSMatthias Ringwald || (EUSCI_A_UART_ODD_PARITY == config->parity)
66*5fd0122aSMatthias Ringwald || (EUSCI_A_UART_EVEN_PARITY == config->parity));
67*5fd0122aSMatthias Ringwald ASSERT(
68*5fd0122aSMatthias Ringwald (EUSCI_A_UART_8_BIT_LEN == config->dataLength)
69*5fd0122aSMatthias Ringwald || (EUSCI_A_UART_7_BIT_LEN == config->dataLength));
70*5fd0122aSMatthias Ringwald
71*5fd0122aSMatthias Ringwald /* Disable the USCI Module */
72*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
73*5fd0122aSMatthias Ringwald
74*5fd0122aSMatthias Ringwald /* Clock source select */
75*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->CTLW0 =
76*5fd0122aSMatthias Ringwald (EUSCI_A_CMSIS(moduleInstance)->CTLW0 & ~EUSCI_A_CTLW0_SSEL_MASK)
77*5fd0122aSMatthias Ringwald | config->selectClockSource;
78*5fd0122aSMatthias Ringwald
79*5fd0122aSMatthias Ringwald /* MSB, LSB select */
80*5fd0122aSMatthias Ringwald if (config->msborLsbFirst)
81*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_MSB_OFS) = 1;
82*5fd0122aSMatthias Ringwald else
83*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_MSB_OFS) = 0;
84*5fd0122aSMatthias Ringwald
85*5fd0122aSMatthias Ringwald /* UCSPB = 0(1 stop bit) OR 1(2 stop bits) */
86*5fd0122aSMatthias Ringwald if (config->numberofStopBits)
87*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_SPB_OFS) = 1;
88*5fd0122aSMatthias Ringwald else
89*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_SPB_OFS) = 0;
90*5fd0122aSMatthias Ringwald
91*5fd0122aSMatthias Ringwald /* Parity */
92*5fd0122aSMatthias Ringwald switch (config->parity)
93*5fd0122aSMatthias Ringwald {
94*5fd0122aSMatthias Ringwald case EUSCI_A_UART_NO_PARITY:
95*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_PEN_OFS) = 0;
96*5fd0122aSMatthias Ringwald break;
97*5fd0122aSMatthias Ringwald case EUSCI_A_UART_ODD_PARITY:
98*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_PEN_OFS) = 1;
99*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_PAR_OFS) = 0;
100*5fd0122aSMatthias Ringwald break;
101*5fd0122aSMatthias Ringwald case EUSCI_A_UART_EVEN_PARITY:
102*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_PEN_OFS) = 1;
103*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_PAR_OFS) = 1;
104*5fd0122aSMatthias Ringwald break;
105*5fd0122aSMatthias Ringwald }
106*5fd0122aSMatthias Ringwald
107*5fd0122aSMatthias Ringwald /* UC7BIT = 0(8 bit) OR 1(7 bit) */
108*5fd0122aSMatthias Ringwald if (config->dataLength)
109*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_SEVENBIT_OFS) = 1;
110*5fd0122aSMatthias Ringwald else
111*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_SEVENBIT_OFS) = 0;
112*5fd0122aSMatthias Ringwald
113*5fd0122aSMatthias Ringwald /* BaudRate Control Register */
114*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->BRW = config->clockPrescalar;
115*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->MCTLW = ((config->secondModReg << 8)
116*5fd0122aSMatthias Ringwald + (config->firstModReg << 4) + config->overSampling);
117*5fd0122aSMatthias Ringwald
118*5fd0122aSMatthias Ringwald /* Asynchronous mode & 8 bit character select & clear mode */
119*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->CTLW0 =
120*5fd0122aSMatthias Ringwald (EUSCI_A_CMSIS(moduleInstance)->CTLW0
121*5fd0122aSMatthias Ringwald & ~(EUSCI_A_CTLW0_SYNC | EUSCI_A_CTLW0_MODE_3 | EUSCI_A_CTLW0_RXEIE | EUSCI_A_CTLW0_BRKIE | EUSCI_A_CTLW0_DORM
122*5fd0122aSMatthias Ringwald | EUSCI_A_CTLW0_TXADDR | EUSCI_A_CTLW0_TXBRK)) | config->uartMode;
123*5fd0122aSMatthias Ringwald
124*5fd0122aSMatthias Ringwald return retVal;
125*5fd0122aSMatthias Ringwald }
126*5fd0122aSMatthias Ringwald
UART_transmitData(uint32_t moduleInstance,uint_fast8_t transmitData)127*5fd0122aSMatthias Ringwald void UART_transmitData(uint32_t moduleInstance, uint_fast8_t transmitData)
128*5fd0122aSMatthias Ringwald {
129*5fd0122aSMatthias Ringwald /* If interrupts are not used, poll for flags */
130*5fd0122aSMatthias Ringwald if (!BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->IE, EUSCI_A_IE_TXIE_OFS))
131*5fd0122aSMatthias Ringwald while (!BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->IFG, EUSCI_A_IFG_TXIFG_OFS))
132*5fd0122aSMatthias Ringwald ;
133*5fd0122aSMatthias Ringwald
134*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->TXBUF = transmitData;
135*5fd0122aSMatthias Ringwald }
136*5fd0122aSMatthias Ringwald
UART_receiveData(uint32_t moduleInstance)137*5fd0122aSMatthias Ringwald uint8_t UART_receiveData(uint32_t moduleInstance)
138*5fd0122aSMatthias Ringwald {
139*5fd0122aSMatthias Ringwald /* If interrupts are not used, poll for flags */
140*5fd0122aSMatthias Ringwald if (!BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->IE, EUSCI_A_IE_RXIE_OFS))
141*5fd0122aSMatthias Ringwald while (!BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->IFG, EUSCI_A_IFG_RXIFG_OFS))
142*5fd0122aSMatthias Ringwald ;
143*5fd0122aSMatthias Ringwald
144*5fd0122aSMatthias Ringwald return EUSCI_A_CMSIS(moduleInstance)->RXBUF;
145*5fd0122aSMatthias Ringwald }
146*5fd0122aSMatthias Ringwald
UART_enableModule(uint32_t moduleInstance)147*5fd0122aSMatthias Ringwald void UART_enableModule(uint32_t moduleInstance)
148*5fd0122aSMatthias Ringwald {
149*5fd0122aSMatthias Ringwald /* Reset the UCSWRST bit to enable the USCI Module */
150*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 0;
151*5fd0122aSMatthias Ringwald }
152*5fd0122aSMatthias Ringwald
UART_disableModule(uint32_t moduleInstance)153*5fd0122aSMatthias Ringwald void UART_disableModule(uint32_t moduleInstance)
154*5fd0122aSMatthias Ringwald {
155*5fd0122aSMatthias Ringwald /* Set the UCSWRST bit to disable the USCI Module */
156*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
157*5fd0122aSMatthias Ringwald }
158*5fd0122aSMatthias Ringwald
UART_queryStatusFlags(uint32_t moduleInstance,uint_fast8_t mask)159*5fd0122aSMatthias Ringwald uint_fast8_t UART_queryStatusFlags(uint32_t moduleInstance, uint_fast8_t mask)
160*5fd0122aSMatthias Ringwald {
161*5fd0122aSMatthias Ringwald ASSERT(
162*5fd0122aSMatthias Ringwald 0x00 != mask
163*5fd0122aSMatthias Ringwald && (EUSCI_A_UART_LISTEN_ENABLE + EUSCI_A_UART_FRAMING_ERROR
164*5fd0122aSMatthias Ringwald + EUSCI_A_UART_OVERRUN_ERROR
165*5fd0122aSMatthias Ringwald + EUSCI_A_UART_PARITY_ERROR
166*5fd0122aSMatthias Ringwald + EUSCI_A_UART_BREAK_DETECT
167*5fd0122aSMatthias Ringwald + EUSCI_A_UART_RECEIVE_ERROR
168*5fd0122aSMatthias Ringwald + EUSCI_A_UART_ADDRESS_RECEIVED
169*5fd0122aSMatthias Ringwald + EUSCI_A_UART_IDLELINE + EUSCI_A_UART_BUSY));
170*5fd0122aSMatthias Ringwald
171*5fd0122aSMatthias Ringwald return EUSCI_A_CMSIS(moduleInstance)->STATW & mask;
172*5fd0122aSMatthias Ringwald }
173*5fd0122aSMatthias Ringwald
UART_setDormant(uint32_t moduleInstance)174*5fd0122aSMatthias Ringwald void UART_setDormant(uint32_t moduleInstance)
175*5fd0122aSMatthias Ringwald {
176*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_DORM_OFS) = 1;
177*5fd0122aSMatthias Ringwald }
178*5fd0122aSMatthias Ringwald
UART_resetDormant(uint32_t moduleInstance)179*5fd0122aSMatthias Ringwald void UART_resetDormant(uint32_t moduleInstance)
180*5fd0122aSMatthias Ringwald {
181*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_DORM_OFS) = 0;
182*5fd0122aSMatthias Ringwald }
183*5fd0122aSMatthias Ringwald
UART_transmitAddress(uint32_t moduleInstance,uint_fast8_t transmitAddress)184*5fd0122aSMatthias Ringwald void UART_transmitAddress(uint32_t moduleInstance, uint_fast8_t transmitAddress)
185*5fd0122aSMatthias Ringwald {
186*5fd0122aSMatthias Ringwald /* Set UCTXADDR bit */
187*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_TXADDR_OFS) = 1;
188*5fd0122aSMatthias Ringwald
189*5fd0122aSMatthias Ringwald /* Place next byte to be sent into the transmit buffer */
190*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->TXBUF = transmitAddress;
191*5fd0122aSMatthias Ringwald }
192*5fd0122aSMatthias Ringwald
UART_transmitBreak(uint32_t moduleInstance)193*5fd0122aSMatthias Ringwald void UART_transmitBreak(uint32_t moduleInstance)
194*5fd0122aSMatthias Ringwald {
195*5fd0122aSMatthias Ringwald /* Set UCTXADDR bit */
196*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_TXBRK_OFS) = 1;
197*5fd0122aSMatthias Ringwald
198*5fd0122aSMatthias Ringwald /* If current mode is automatic baud-rate detection */
199*5fd0122aSMatthias Ringwald if (EUSCI_A_UART_AUTOMATIC_BAUDRATE_DETECTION_MODE
200*5fd0122aSMatthias Ringwald == (EUSCI_A_CMSIS(moduleInstance)->CTLW0
201*5fd0122aSMatthias Ringwald & EUSCI_A_UART_AUTOMATIC_BAUDRATE_DETECTION_MODE))
202*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->TXBUF =
203*5fd0122aSMatthias Ringwald EUSCI_A_UART_AUTOMATICBAUDRATE_SYNC;
204*5fd0122aSMatthias Ringwald else
205*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->TXBUF = DEFAULT_SYNC;
206*5fd0122aSMatthias Ringwald
207*5fd0122aSMatthias Ringwald /* If interrupts are not used, poll for flags */
208*5fd0122aSMatthias Ringwald if (!BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->IE, EUSCI_A_IE_TXIE_OFS))
209*5fd0122aSMatthias Ringwald while (!BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->IFG, EUSCI_A_IFG_TXIFG_OFS))
210*5fd0122aSMatthias Ringwald ;
211*5fd0122aSMatthias Ringwald }
212*5fd0122aSMatthias Ringwald
UART_getReceiveBufferAddressForDMA(uint32_t moduleInstance)213*5fd0122aSMatthias Ringwald uint32_t UART_getReceiveBufferAddressForDMA(uint32_t moduleInstance)
214*5fd0122aSMatthias Ringwald {
215*5fd0122aSMatthias Ringwald return (uint32_t)&EUSCI_A_CMSIS(moduleInstance)->RXBUF;
216*5fd0122aSMatthias Ringwald }
217*5fd0122aSMatthias Ringwald
UART_getTransmitBufferAddressForDMA(uint32_t moduleInstance)218*5fd0122aSMatthias Ringwald uint32_t UART_getTransmitBufferAddressForDMA(uint32_t moduleInstance)
219*5fd0122aSMatthias Ringwald {
220*5fd0122aSMatthias Ringwald return (uint32_t)&EUSCI_B_CMSIS(moduleInstance)->TXBUF;
221*5fd0122aSMatthias Ringwald }
222*5fd0122aSMatthias Ringwald
UART_selectDeglitchTime(uint32_t moduleInstance,uint32_t deglitchTime)223*5fd0122aSMatthias Ringwald void UART_selectDeglitchTime(uint32_t moduleInstance, uint32_t deglitchTime)
224*5fd0122aSMatthias Ringwald {
225*5fd0122aSMatthias Ringwald ASSERT(
226*5fd0122aSMatthias Ringwald (EUSCI_A_UART_DEGLITCH_TIME_2ns == deglitchTime)
227*5fd0122aSMatthias Ringwald || (EUSCI_A_UART_DEGLITCH_TIME_50ns == deglitchTime)
228*5fd0122aSMatthias Ringwald || (EUSCI_A_UART_DEGLITCH_TIME_100ns == deglitchTime)
229*5fd0122aSMatthias Ringwald || (EUSCI_A_UART_DEGLITCH_TIME_200ns == deglitchTime));
230*5fd0122aSMatthias Ringwald
231*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->CTLW1 =
232*5fd0122aSMatthias Ringwald (EUSCI_A_CMSIS(moduleInstance)->CTLW1 & ~(EUSCI_A_CTLW1_GLIT_MASK))
233*5fd0122aSMatthias Ringwald | deglitchTime;
234*5fd0122aSMatthias Ringwald
235*5fd0122aSMatthias Ringwald }
236*5fd0122aSMatthias Ringwald
UART_enableInterrupt(uint32_t moduleInstance,uint_fast8_t mask)237*5fd0122aSMatthias Ringwald void UART_enableInterrupt(uint32_t moduleInstance, uint_fast8_t mask)
238*5fd0122aSMatthias Ringwald {
239*5fd0122aSMatthias Ringwald uint_fast8_t locMask;
240*5fd0122aSMatthias Ringwald
241*5fd0122aSMatthias Ringwald ASSERT(
242*5fd0122aSMatthias Ringwald !(mask
243*5fd0122aSMatthias Ringwald & ~(EUSCI_A_UART_RECEIVE_INTERRUPT
244*5fd0122aSMatthias Ringwald | EUSCI_A_UART_TRANSMIT_INTERRUPT
245*5fd0122aSMatthias Ringwald | EUSCI_A_UART_RECEIVE_ERRONEOUSCHAR_INTERRUPT
246*5fd0122aSMatthias Ringwald | EUSCI_A_UART_BREAKCHAR_INTERRUPT
247*5fd0122aSMatthias Ringwald | EUSCI_A_UART_STARTBIT_INTERRUPT
248*5fd0122aSMatthias Ringwald | EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT)));
249*5fd0122aSMatthias Ringwald
250*5fd0122aSMatthias Ringwald locMask = (mask
251*5fd0122aSMatthias Ringwald & (EUSCI_A_UART_RECEIVE_INTERRUPT | EUSCI_A_UART_TRANSMIT_INTERRUPT
252*5fd0122aSMatthias Ringwald | EUSCI_A_UART_STARTBIT_INTERRUPT
253*5fd0122aSMatthias Ringwald | EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT));
254*5fd0122aSMatthias Ringwald
255*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->IE |= locMask;
256*5fd0122aSMatthias Ringwald
257*5fd0122aSMatthias Ringwald locMask = (mask
258*5fd0122aSMatthias Ringwald & (EUSCI_A_UART_RECEIVE_ERRONEOUSCHAR_INTERRUPT
259*5fd0122aSMatthias Ringwald | EUSCI_A_UART_BREAKCHAR_INTERRUPT));
260*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->CTLW0 |= locMask;
261*5fd0122aSMatthias Ringwald }
262*5fd0122aSMatthias Ringwald
UART_disableInterrupt(uint32_t moduleInstance,uint_fast8_t mask)263*5fd0122aSMatthias Ringwald void UART_disableInterrupt(uint32_t moduleInstance, uint_fast8_t mask)
264*5fd0122aSMatthias Ringwald {
265*5fd0122aSMatthias Ringwald uint_fast8_t locMask;
266*5fd0122aSMatthias Ringwald
267*5fd0122aSMatthias Ringwald ASSERT(
268*5fd0122aSMatthias Ringwald !(mask
269*5fd0122aSMatthias Ringwald & ~(EUSCI_A_UART_RECEIVE_INTERRUPT
270*5fd0122aSMatthias Ringwald | EUSCI_A_UART_TRANSMIT_INTERRUPT
271*5fd0122aSMatthias Ringwald | EUSCI_A_UART_RECEIVE_ERRONEOUSCHAR_INTERRUPT
272*5fd0122aSMatthias Ringwald | EUSCI_A_UART_BREAKCHAR_INTERRUPT
273*5fd0122aSMatthias Ringwald | EUSCI_A_UART_STARTBIT_INTERRUPT
274*5fd0122aSMatthias Ringwald | EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT)));
275*5fd0122aSMatthias Ringwald
276*5fd0122aSMatthias Ringwald locMask = (mask
277*5fd0122aSMatthias Ringwald & (EUSCI_A_UART_RECEIVE_INTERRUPT | EUSCI_A_UART_TRANSMIT_INTERRUPT
278*5fd0122aSMatthias Ringwald | EUSCI_A_UART_STARTBIT_INTERRUPT
279*5fd0122aSMatthias Ringwald | EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT));
280*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->IE &= ~locMask;
281*5fd0122aSMatthias Ringwald
282*5fd0122aSMatthias Ringwald locMask = (mask
283*5fd0122aSMatthias Ringwald & (EUSCI_A_UART_RECEIVE_ERRONEOUSCHAR_INTERRUPT
284*5fd0122aSMatthias Ringwald | EUSCI_A_UART_BREAKCHAR_INTERRUPT));
285*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->CTLW0 &= ~locMask;
286*5fd0122aSMatthias Ringwald }
287*5fd0122aSMatthias Ringwald
UART_getInterruptStatus(uint32_t moduleInstance,uint8_t mask)288*5fd0122aSMatthias Ringwald uint_fast8_t UART_getInterruptStatus(uint32_t moduleInstance, uint8_t mask)
289*5fd0122aSMatthias Ringwald {
290*5fd0122aSMatthias Ringwald ASSERT(
291*5fd0122aSMatthias Ringwald !(mask
292*5fd0122aSMatthias Ringwald & ~(EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG
293*5fd0122aSMatthias Ringwald | EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG
294*5fd0122aSMatthias Ringwald | EUSCI_A_UART_STARTBIT_INTERRUPT_FLAG
295*5fd0122aSMatthias Ringwald | EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT_FLAG)));
296*5fd0122aSMatthias Ringwald
297*5fd0122aSMatthias Ringwald return EUSCI_A_CMSIS(moduleInstance)->IFG & mask;
298*5fd0122aSMatthias Ringwald }
299*5fd0122aSMatthias Ringwald
UART_getEnabledInterruptStatus(uint32_t moduleInstance)300*5fd0122aSMatthias Ringwald uint_fast8_t UART_getEnabledInterruptStatus(uint32_t moduleInstance)
301*5fd0122aSMatthias Ringwald {
302*5fd0122aSMatthias Ringwald uint_fast8_t intStatus = UART_getInterruptStatus(moduleInstance,
303*5fd0122aSMatthias Ringwald EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG | EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG | EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT_FLAG);
304*5fd0122aSMatthias Ringwald uint_fast8_t intEnabled = EUSCI_A_CMSIS(moduleInstance)->IE;
305*5fd0122aSMatthias Ringwald
306*5fd0122aSMatthias Ringwald if (!(intEnabled & EUSCI_A_UART_RECEIVE_INTERRUPT))
307*5fd0122aSMatthias Ringwald {
308*5fd0122aSMatthias Ringwald intStatus &= ((uint_fast8_t)~EUSCI_A_UART_RECEIVE_INTERRUPT);
309*5fd0122aSMatthias Ringwald }
310*5fd0122aSMatthias Ringwald
311*5fd0122aSMatthias Ringwald if (!(intEnabled & EUSCI_A_UART_TRANSMIT_INTERRUPT))
312*5fd0122aSMatthias Ringwald {
313*5fd0122aSMatthias Ringwald intStatus &= ((uint_fast8_t)~EUSCI_A_UART_TRANSMIT_INTERRUPT);
314*5fd0122aSMatthias Ringwald }
315*5fd0122aSMatthias Ringwald if(!(intEnabled & EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT))
316*5fd0122aSMatthias Ringwald {
317*5fd0122aSMatthias Ringwald intStatus &= ((uint_fast8_t)~EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT);
318*5fd0122aSMatthias Ringwald }
319*5fd0122aSMatthias Ringwald
320*5fd0122aSMatthias Ringwald intEnabled = EUSCI_A_CMSIS(moduleInstance)->CTLW0;
321*5fd0122aSMatthias Ringwald
322*5fd0122aSMatthias Ringwald if (!(intEnabled & EUSCI_A_UART_RECEIVE_ERRONEOUSCHAR_INTERRUPT))
323*5fd0122aSMatthias Ringwald {
324*5fd0122aSMatthias Ringwald intStatus &= ((uint_fast8_t)~EUSCI_A_UART_RECEIVE_ERRONEOUSCHAR_INTERRUPT);
325*5fd0122aSMatthias Ringwald }
326*5fd0122aSMatthias Ringwald
327*5fd0122aSMatthias Ringwald if (!(intEnabled & EUSCI_A_UART_BREAKCHAR_INTERRUPT))
328*5fd0122aSMatthias Ringwald {
329*5fd0122aSMatthias Ringwald intStatus &= ((uint_fast8_t)~EUSCI_A_UART_BREAKCHAR_INTERRUPT);
330*5fd0122aSMatthias Ringwald }
331*5fd0122aSMatthias Ringwald
332*5fd0122aSMatthias Ringwald return intStatus;
333*5fd0122aSMatthias Ringwald }
334*5fd0122aSMatthias Ringwald
UART_clearInterruptFlag(uint32_t moduleInstance,uint_fast8_t mask)335*5fd0122aSMatthias Ringwald void UART_clearInterruptFlag(uint32_t moduleInstance, uint_fast8_t mask)
336*5fd0122aSMatthias Ringwald {
337*5fd0122aSMatthias Ringwald ASSERT(
338*5fd0122aSMatthias Ringwald !(mask
339*5fd0122aSMatthias Ringwald & ~(EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG
340*5fd0122aSMatthias Ringwald | EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG
341*5fd0122aSMatthias Ringwald | EUSCI_A_UART_STARTBIT_INTERRUPT_FLAG
342*5fd0122aSMatthias Ringwald | EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT_FLAG)));
343*5fd0122aSMatthias Ringwald
344*5fd0122aSMatthias Ringwald //Clear the UART interrupt source.
345*5fd0122aSMatthias Ringwald EUSCI_A_CMSIS(moduleInstance)->IFG &= ~(mask);
346*5fd0122aSMatthias Ringwald }
347*5fd0122aSMatthias Ringwald
UART_registerInterrupt(uint32_t moduleInstance,void (* intHandler)(void))348*5fd0122aSMatthias Ringwald void UART_registerInterrupt(uint32_t moduleInstance, void (*intHandler)(void))
349*5fd0122aSMatthias Ringwald {
350*5fd0122aSMatthias Ringwald switch (moduleInstance)
351*5fd0122aSMatthias Ringwald {
352*5fd0122aSMatthias Ringwald case EUSCI_A0_BASE:
353*5fd0122aSMatthias Ringwald Interrupt_registerInterrupt(INT_EUSCIA0, intHandler);
354*5fd0122aSMatthias Ringwald Interrupt_enableInterrupt(INT_EUSCIA0);
355*5fd0122aSMatthias Ringwald break;
356*5fd0122aSMatthias Ringwald case EUSCI_A1_BASE:
357*5fd0122aSMatthias Ringwald Interrupt_registerInterrupt(INT_EUSCIA1, intHandler);
358*5fd0122aSMatthias Ringwald Interrupt_enableInterrupt(INT_EUSCIA1);
359*5fd0122aSMatthias Ringwald break;
360*5fd0122aSMatthias Ringwald #ifdef EUSCI_A2_BASE
361*5fd0122aSMatthias Ringwald case EUSCI_A2_BASE:
362*5fd0122aSMatthias Ringwald Interrupt_registerInterrupt(INT_EUSCIA2, intHandler);
363*5fd0122aSMatthias Ringwald Interrupt_enableInterrupt(INT_EUSCIA2);
364*5fd0122aSMatthias Ringwald break;
365*5fd0122aSMatthias Ringwald #endif
366*5fd0122aSMatthias Ringwald #ifdef EUSCI_A3_BASE
367*5fd0122aSMatthias Ringwald case EUSCI_A3_BASE:
368*5fd0122aSMatthias Ringwald Interrupt_registerInterrupt(INT_EUSCIA3, intHandler);
369*5fd0122aSMatthias Ringwald Interrupt_enableInterrupt(INT_EUSCIA3);
370*5fd0122aSMatthias Ringwald break;
371*5fd0122aSMatthias Ringwald #endif
372*5fd0122aSMatthias Ringwald default:
373*5fd0122aSMatthias Ringwald ASSERT(false);
374*5fd0122aSMatthias Ringwald }
375*5fd0122aSMatthias Ringwald }
376*5fd0122aSMatthias Ringwald
UART_unregisterInterrupt(uint32_t moduleInstance)377*5fd0122aSMatthias Ringwald void UART_unregisterInterrupt(uint32_t moduleInstance)
378*5fd0122aSMatthias Ringwald {
379*5fd0122aSMatthias Ringwald switch (moduleInstance)
380*5fd0122aSMatthias Ringwald {
381*5fd0122aSMatthias Ringwald case EUSCI_A0_BASE:
382*5fd0122aSMatthias Ringwald Interrupt_disableInterrupt(INT_EUSCIA0);
383*5fd0122aSMatthias Ringwald Interrupt_unregisterInterrupt(INT_EUSCIA0);
384*5fd0122aSMatthias Ringwald break;
385*5fd0122aSMatthias Ringwald case EUSCI_A1_BASE:
386*5fd0122aSMatthias Ringwald Interrupt_disableInterrupt(INT_EUSCIA1);
387*5fd0122aSMatthias Ringwald Interrupt_unregisterInterrupt(INT_EUSCIA1);
388*5fd0122aSMatthias Ringwald break;
389*5fd0122aSMatthias Ringwald #ifdef EUSCI_A2_BASE
390*5fd0122aSMatthias Ringwald case EUSCI_A2_BASE:
391*5fd0122aSMatthias Ringwald Interrupt_disableInterrupt(INT_EUSCIA2);
392*5fd0122aSMatthias Ringwald Interrupt_unregisterInterrupt(INT_EUSCIA2);
393*5fd0122aSMatthias Ringwald break;
394*5fd0122aSMatthias Ringwald #endif
395*5fd0122aSMatthias Ringwald #ifdef EUSCI_A3_BASE
396*5fd0122aSMatthias Ringwald case EUSCI_A3_BASE:
397*5fd0122aSMatthias Ringwald Interrupt_disableInterrupt(INT_EUSCIA3);
398*5fd0122aSMatthias Ringwald Interrupt_unregisterInterrupt(INT_EUSCIA3);
399*5fd0122aSMatthias Ringwald break;
400*5fd0122aSMatthias Ringwald #endif
401*5fd0122aSMatthias Ringwald default:
402*5fd0122aSMatthias Ringwald ASSERT(false);
403*5fd0122aSMatthias Ringwald }
404*5fd0122aSMatthias Ringwald }
405