xref: /btstack/port/msp432p401lp-cc256x/ti/devices/msp432p4xx/driverlib/interrupt.h (revision 5fd0122a3e19d95e11e1f3eb8a08a2b2acb2557e)
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 #ifndef __INTERRUPT_H__
33*5fd0122aSMatthias Ringwald #define __INTERRUPT_H__
34*5fd0122aSMatthias Ringwald 
35*5fd0122aSMatthias Ringwald //*****************************************************************************
36*5fd0122aSMatthias Ringwald //
37*5fd0122aSMatthias Ringwald //! \addtogroup interrupt_api
38*5fd0122aSMatthias Ringwald //! @{
39*5fd0122aSMatthias Ringwald //
40*5fd0122aSMatthias Ringwald //*****************************************************************************
41*5fd0122aSMatthias Ringwald 
42*5fd0122aSMatthias Ringwald 
43*5fd0122aSMatthias Ringwald //*****************************************************************************
44*5fd0122aSMatthias Ringwald //
45*5fd0122aSMatthias Ringwald // If building with a C++ compiler, make all of the definitions in this header
46*5fd0122aSMatthias Ringwald // have a C binding.
47*5fd0122aSMatthias Ringwald //
48*5fd0122aSMatthias Ringwald //*****************************************************************************
49*5fd0122aSMatthias Ringwald #ifdef __cplusplus
50*5fd0122aSMatthias Ringwald extern "C"
51*5fd0122aSMatthias Ringwald {
52*5fd0122aSMatthias Ringwald #endif
53*5fd0122aSMatthias Ringwald 
54*5fd0122aSMatthias Ringwald #include <stdint.h>
55*5fd0122aSMatthias Ringwald #include <stdbool.h>
56*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/inc/msp.h>
57*5fd0122aSMatthias Ringwald 
58*5fd0122aSMatthias Ringwald /******************************************************************************
59*5fd0122aSMatthias Ringwald * NVIC interrupts                                                             *
60*5fd0122aSMatthias Ringwald ******************************************************************************/
61*5fd0122aSMatthias Ringwald /* System exceptions */
62*5fd0122aSMatthias Ringwald #define FAULT_NMI                                       ( 2) /* NMI fault */
63*5fd0122aSMatthias Ringwald #define FAULT_HARD                                      ( 3) /* Hard fault */
64*5fd0122aSMatthias Ringwald #define FAULT_MPU                                       ( 4) /* MPU fault */
65*5fd0122aSMatthias Ringwald #define FAULT_BUS                                       ( 5) /* Bus fault */
66*5fd0122aSMatthias Ringwald #define FAULT_USAGE                                     ( 6) /* Usage fault */
67*5fd0122aSMatthias Ringwald #define FAULT_SVCALL                                    (11) /* SVCall */
68*5fd0122aSMatthias Ringwald #define FAULT_DEBUG                                     (12) /* Debug monitor */
69*5fd0122aSMatthias Ringwald #define FAULT_PENDSV                                    (14) /* PendSV */
70*5fd0122aSMatthias Ringwald #define FAULT_SYSTICK                                   (15) /* System Tick */
71*5fd0122aSMatthias Ringwald 
72*5fd0122aSMatthias Ringwald /* External interrupts */
73*5fd0122aSMatthias Ringwald #define INT_PSS                                         (16) /* PSS IRQ */
74*5fd0122aSMatthias Ringwald #define INT_CS                                          (17) /* CS IRQ */
75*5fd0122aSMatthias Ringwald #define INT_PCM                                         (18) /* PCM IRQ */
76*5fd0122aSMatthias Ringwald #define INT_WDT_A                                       (19) /* WDT_A IRQ */
77*5fd0122aSMatthias Ringwald #define INT_FPU                                         (20) /* FPU IRQ */
78*5fd0122aSMatthias Ringwald #define INT_FLCTL                                       (21) /* FLCTL IRQ */
79*5fd0122aSMatthias Ringwald #define INT_COMP_E0                                     (22) /* COMP_E0 IRQ */
80*5fd0122aSMatthias Ringwald #define INT_COMP_E1                                     (23) /* COMP_E1 IRQ */
81*5fd0122aSMatthias Ringwald #define INT_TA0_0                                       (24) /* TA0_0 IRQ */
82*5fd0122aSMatthias Ringwald #define INT_TA0_N                                       (25) /* TA0_N IRQ */
83*5fd0122aSMatthias Ringwald #define INT_TA1_0                                       (26) /* TA1_0 IRQ */
84*5fd0122aSMatthias Ringwald #define INT_TA1_N                                       (27) /* TA1_N IRQ */
85*5fd0122aSMatthias Ringwald #define INT_TA2_0                                       (28) /* TA2_0 IRQ */
86*5fd0122aSMatthias Ringwald #define INT_TA2_N                                       (29) /* TA2_N IRQ */
87*5fd0122aSMatthias Ringwald #define INT_TA3_0                                       (30) /* TA3_0 IRQ */
88*5fd0122aSMatthias Ringwald #define INT_TA3_N                                       (31) /* TA3_N IRQ */
89*5fd0122aSMatthias Ringwald #define INT_EUSCIA0                                     (32) /* EUSCIA0 IRQ */
90*5fd0122aSMatthias Ringwald #define INT_EUSCIA1                                     (33) /* EUSCIA1 IRQ */
91*5fd0122aSMatthias Ringwald #define INT_EUSCIA2                                     (34) /* EUSCIA2 IRQ */
92*5fd0122aSMatthias Ringwald #define INT_EUSCIA3                                     (35) /* EUSCIA3 IRQ */
93*5fd0122aSMatthias Ringwald #define INT_EUSCIB0                                     (36) /* EUSCIB0 IRQ */
94*5fd0122aSMatthias Ringwald #define INT_EUSCIB1                                     (37) /* EUSCIB1 IRQ */
95*5fd0122aSMatthias Ringwald #define INT_EUSCIB2                                     (38) /* EUSCIB2 IRQ */
96*5fd0122aSMatthias Ringwald #define INT_EUSCIB3                                     (39) /* EUSCIB3 IRQ */
97*5fd0122aSMatthias Ringwald #define INT_ADC14                                       (40) /* ADC14 IRQ */
98*5fd0122aSMatthias Ringwald #define INT_T32_INT1                                    (41) /* T32_INT1 IRQ */
99*5fd0122aSMatthias Ringwald #define INT_T32_INT2                                    (42) /* T32_INT2 IRQ */
100*5fd0122aSMatthias Ringwald #define INT_T32_INTC                                    (43) /* T32_INTC IRQ */
101*5fd0122aSMatthias Ringwald #define INT_AES256                                      (44) /* AES256 IRQ */
102*5fd0122aSMatthias Ringwald #define INT_RTC_C                                       (45) /* RTC_C IRQ */
103*5fd0122aSMatthias Ringwald #define INT_DMA_ERR                                     (46) /* DMA_ERR IRQ */
104*5fd0122aSMatthias Ringwald #define INT_DMA_INT3                                    (47) /* DMA_INT3 IRQ */
105*5fd0122aSMatthias Ringwald #define INT_DMA_INT2                                    (48) /* DMA_INT2 IRQ */
106*5fd0122aSMatthias Ringwald #define INT_DMA_INT1                                    (49) /* DMA_INT1 IRQ */
107*5fd0122aSMatthias Ringwald #define INT_DMA_INT0                                    (50) /* DMA_INT0 IRQ */
108*5fd0122aSMatthias Ringwald #define INT_PORT1                                       (51) /* PORT1 IRQ */
109*5fd0122aSMatthias Ringwald #define INT_PORT2                                       (52) /* PORT2 IRQ */
110*5fd0122aSMatthias Ringwald #define INT_PORT3                                       (53) /* PORT3 IRQ */
111*5fd0122aSMatthias Ringwald #define INT_PORT4                                       (54) /* PORT4 IRQ */
112*5fd0122aSMatthias Ringwald #define INT_PORT5                                       (55) /* PORT5 IRQ */
113*5fd0122aSMatthias Ringwald #define INT_PORT6                                       (56) /* PORT6 IRQ */
114*5fd0122aSMatthias Ringwald #define INT_LCD_F                                       (57) /* PORT6 IRQ */
115*5fd0122aSMatthias Ringwald 
116*5fd0122aSMatthias Ringwald #define NUM_INTERRUPTS                                  (57)
117*5fd0122aSMatthias Ringwald //*****************************************************************************
118*5fd0122aSMatthias Ringwald //
119*5fd0122aSMatthias Ringwald // Macro to generate an interrupt priority mask based on the number of bits
120*5fd0122aSMatthias Ringwald // of priority supported by the hardware.
121*5fd0122aSMatthias Ringwald //
122*5fd0122aSMatthias Ringwald //*****************************************************************************
123*5fd0122aSMatthias Ringwald #define INT_PRIORITY_MASK       ((0xFF << (8 - NUM_PRIORITY_BITS)) & 0xFF)
124*5fd0122aSMatthias Ringwald #define NUM_PRIORITY            8
125*5fd0122aSMatthias Ringwald 
126*5fd0122aSMatthias Ringwald #define NVIC_APINT_PRIGROUP_M   0x00000700  // Interrupt Priority Grouping
127*5fd0122aSMatthias Ringwald #define NVIC_APINT_PRIGROUP_7_1 0x00000000  // Priority group 7.1 split
128*5fd0122aSMatthias Ringwald #define NVIC_APINT_PRIGROUP_6_2 0x00000100  // Priority group 6.2 split
129*5fd0122aSMatthias Ringwald #define NVIC_APINT_PRIGROUP_5_3 0x00000200  // Priority group 5.3 split
130*5fd0122aSMatthias Ringwald #define NVIC_APINT_PRIGROUP_4_4 0x00000300  // Priority group 4.4 split
131*5fd0122aSMatthias Ringwald #define NVIC_APINT_PRIGROUP_3_5 0x00000400  // Priority group 3.5 split
132*5fd0122aSMatthias Ringwald #define NVIC_APINT_PRIGROUP_2_6 0x00000500  // Priority group 2.6 split
133*5fd0122aSMatthias Ringwald #define NVIC_APINT_PRIGROUP_1_7 0x00000600  // Priority group 1.7 split
134*5fd0122aSMatthias Ringwald #define NVIC_APINT_PRIGROUP_0_8 0x00000700  // Priority group 0.8 split
135*5fd0122aSMatthias Ringwald #define NVIC_SYS_PRI1_R         0xE000ED18  // System Handler Priority 1
136*5fd0122aSMatthias Ringwald #define NVIC_SYS_PRI2_R         0xE000ED1C  // System Handler Priority 2
137*5fd0122aSMatthias Ringwald #define NVIC_SYS_PRI3_R         0xE000ED20  // System Handler Priority 3
138*5fd0122aSMatthias Ringwald #define NVIC_PRI0_R             0xE000E400  // Interrupt 0-3 Priority
139*5fd0122aSMatthias Ringwald #define NVIC_PRI1_R             0xE000E404  // Interrupt 4-7 Priority
140*5fd0122aSMatthias Ringwald #define NVIC_PRI2_R             0xE000E408  // Interrupt 8-11 Priority
141*5fd0122aSMatthias Ringwald #define NVIC_PRI3_R             0xE000E40C  // Interrupt 12-15 Priority
142*5fd0122aSMatthias Ringwald #define NVIC_PRI4_R             0xE000E410  // Interrupt 16-19 Priority
143*5fd0122aSMatthias Ringwald #define NVIC_PRI5_R             0xE000E414  // Interrupt 20-23 Priority
144*5fd0122aSMatthias Ringwald #define NVIC_PRI6_R             0xE000E418  // Interrupt 24-27 Priority
145*5fd0122aSMatthias Ringwald #define NVIC_PRI7_R             0xE000E41C  // Interrupt 28-31 Priority
146*5fd0122aSMatthias Ringwald #define NVIC_PRI8_R             0xE000E420  // Interrupt 32-35 Priority
147*5fd0122aSMatthias Ringwald #define NVIC_PRI9_R             0xE000E424  // Interrupt 36-39 Priority
148*5fd0122aSMatthias Ringwald #define NVIC_PRI10_R            0xE000E428  // Interrupt 40-43 Priority
149*5fd0122aSMatthias Ringwald #define NVIC_PRI11_R            0xE000E42C  // Interrupt 44-47 Priority
150*5fd0122aSMatthias Ringwald #define NVIC_PRI12_R            0xE000E430  // Interrupt 48-51 Priority
151*5fd0122aSMatthias Ringwald #define NVIC_PRI13_R            0xE000E434  // Interrupt 52-55 Priority
152*5fd0122aSMatthias Ringwald #define NVIC_PRI14_R            0xE000E438  // Interrupt 56-59 Priority
153*5fd0122aSMatthias Ringwald #define NVIC_PRI15_R            0xE000E43C  // Interrupt 60-63 Priority
154*5fd0122aSMatthias Ringwald #define NVIC_EN0_R              0xE000E100  // Interrupt 0-31 Set Enable
155*5fd0122aSMatthias Ringwald #define NVIC_EN1_R              0xE000E104  // Interrupt 32-54 Set Enable
156*5fd0122aSMatthias Ringwald #define NVIC_DIS0_R             0xE000E180  // Interrupt 0-31 Clear Enable
157*5fd0122aSMatthias Ringwald #define NVIC_DIS1_R             0xE000E184  // Interrupt 32-54 Clear Enable
158*5fd0122aSMatthias Ringwald #define NVIC_PEND0_R            0xE000E200  // Interrupt 0-31 Set Pending
159*5fd0122aSMatthias Ringwald #define NVIC_PEND1_R            0xE000E204  // Interrupt 32-54 Set Pending
160*5fd0122aSMatthias Ringwald #define NVIC_UNPEND0_R          0xE000E280  // Interrupt 0-31 Clear Pending
161*5fd0122aSMatthias Ringwald #define NVIC_UNPEND1_R          0xE000E284  // Interrupt 32-54 Clear Pending
162*5fd0122aSMatthias Ringwald //*****************************************************************************
163*5fd0122aSMatthias Ringwald //
164*5fd0122aSMatthias Ringwald // Prototypes for the APIs.
165*5fd0122aSMatthias Ringwald //
166*5fd0122aSMatthias Ringwald //*****************************************************************************
167*5fd0122aSMatthias Ringwald 
168*5fd0122aSMatthias Ringwald //*****************************************************************************
169*5fd0122aSMatthias Ringwald //
170*5fd0122aSMatthias Ringwald //! Enables the processor interrupt.
171*5fd0122aSMatthias Ringwald //!
172*5fd0122aSMatthias Ringwald //! This function allows the processor to respond to interrupts.  This function
173*5fd0122aSMatthias Ringwald //! does not affect the set of interrupts enabled in the interrupt controller;
174*5fd0122aSMatthias Ringwald //! it just gates the single interrupt from the controller to the processor.
175*5fd0122aSMatthias Ringwald //!
176*5fd0122aSMatthias Ringwald //! \return Returns \b true if interrupts were disabled when the function was
177*5fd0122aSMatthias Ringwald //! called or \b false if they were initially enabled.
178*5fd0122aSMatthias Ringwald //
179*5fd0122aSMatthias Ringwald //*****************************************************************************
180*5fd0122aSMatthias Ringwald extern bool Interrupt_enableMaster(void);
181*5fd0122aSMatthias Ringwald 
182*5fd0122aSMatthias Ringwald //*****************************************************************************
183*5fd0122aSMatthias Ringwald //
184*5fd0122aSMatthias Ringwald //! Disables the processor interrupt.
185*5fd0122aSMatthias Ringwald //!
186*5fd0122aSMatthias Ringwald //! This function prevents the processor from receiving interrupts.  This
187*5fd0122aSMatthias Ringwald //! function does not affect the set of interrupts enabled in the interrupt
188*5fd0122aSMatthias Ringwald //! controller; it just gates the single interrupt from the controller to the
189*5fd0122aSMatthias Ringwald //! processor.
190*5fd0122aSMatthias Ringwald //!
191*5fd0122aSMatthias Ringwald //! \return Returns \b true if interrupts were already disabled when the
192*5fd0122aSMatthias Ringwald //! function was called or \b false if they were initially enabled.
193*5fd0122aSMatthias Ringwald //
194*5fd0122aSMatthias Ringwald //*****************************************************************************
195*5fd0122aSMatthias Ringwald extern bool Interrupt_disableMaster(void);
196*5fd0122aSMatthias Ringwald 
197*5fd0122aSMatthias Ringwald //*****************************************************************************
198*5fd0122aSMatthias Ringwald //
199*5fd0122aSMatthias Ringwald //! Registers a function to be called when an interrupt occurs.
200*5fd0122aSMatthias Ringwald //!
201*5fd0122aSMatthias Ringwald //! \param interruptNumber specifies the interrupt in question.
202*5fd0122aSMatthias Ringwald //! \param intHandler is a pointer to the function to be called.
203*5fd0122aSMatthias Ringwald //!
204*5fd0122aSMatthias Ringwald //! \note The use of this function (directly or indirectly via a peripheral
205*5fd0122aSMatthias Ringwald //! driver interrupt register function) moves the interrupt vector table from
206*5fd0122aSMatthias Ringwald //! flash to SRAM.  Therefore, care must be taken when linking the application
207*5fd0122aSMatthias Ringwald //! to ensure that the SRAM vector table is located at the beginning of SRAM;
208*5fd0122aSMatthias Ringwald //! otherwise the NVIC does not look in the correct portion of memory for the
209*5fd0122aSMatthias Ringwald //! vector table (it requires the vector table be on a 1 kB memory alignment).
210*5fd0122aSMatthias Ringwald //! Normally, the SRAM vector table is so placed via the use of linker scripts.
211*5fd0122aSMatthias Ringwald //! See the discussion of compile-time versus run-time interrupt handler
212*5fd0122aSMatthias Ringwald //! registration in the introduction to this chapter.
213*5fd0122aSMatthias Ringwald //!
214*5fd0122aSMatthias Ringwald //! \note This function is only used if the customer wants to specify the
215*5fd0122aSMatthias Ringwald //!  interrupt handler at run time. In most cases, this is done through means
216*5fd0122aSMatthias Ringwald //!  of the user setting the ISR function pointer in the startup file. Refer
217*5fd0122aSMatthias Ringwald //!  Refer to the Module Operation section for more details.
218*5fd0122aSMatthias Ringwald //!
219*5fd0122aSMatthias Ringwald //! See \link Interrupt_enableInterrupt \endlink for details about the interrupt
220*5fd0122aSMatthias Ringwald //! parameter
221*5fd0122aSMatthias Ringwald //!
222*5fd0122aSMatthias Ringwald //! \return None.
223*5fd0122aSMatthias Ringwald //
224*5fd0122aSMatthias Ringwald //*****************************************************************************
225*5fd0122aSMatthias Ringwald extern void Interrupt_registerInterrupt(uint32_t interruptNumber,
226*5fd0122aSMatthias Ringwald         void (*intHandler)(void));
227*5fd0122aSMatthias Ringwald 
228*5fd0122aSMatthias Ringwald //*****************************************************************************
229*5fd0122aSMatthias Ringwald //
230*5fd0122aSMatthias Ringwald //! Unregisters the function to be called when an interrupt occurs.
231*5fd0122aSMatthias Ringwald //!
232*5fd0122aSMatthias Ringwald //! \param interruptNumber specifies the interrupt in question.
233*5fd0122aSMatthias Ringwald //!
234*5fd0122aSMatthias Ringwald //! This function is used to indicate that no handler should be called when the
235*5fd0122aSMatthias Ringwald //! given interrupt is asserted to the processor.  The interrupt source is
236*5fd0122aSMatthias Ringwald //! automatically disabled (via Interrupt_disableInterrupt()) if necessary.
237*5fd0122aSMatthias Ringwald //!
238*5fd0122aSMatthias Ringwald //! \sa Interrupt_registerInterrupt() for important information about
239*5fd0122aSMatthias Ringwald //! registering interrupt handlers.
240*5fd0122aSMatthias Ringwald //!
241*5fd0122aSMatthias Ringwald //! See \link Interrupt_enableInterrupt \endlink for details about the interrupt
242*5fd0122aSMatthias Ringwald //! parameter
243*5fd0122aSMatthias Ringwald //!
244*5fd0122aSMatthias Ringwald //! \return None.
245*5fd0122aSMatthias Ringwald //
246*5fd0122aSMatthias Ringwald //*****************************************************************************
247*5fd0122aSMatthias Ringwald extern void Interrupt_unregisterInterrupt(uint32_t interruptNumber);
248*5fd0122aSMatthias Ringwald 
249*5fd0122aSMatthias Ringwald //*****************************************************************************
250*5fd0122aSMatthias Ringwald //
251*5fd0122aSMatthias Ringwald //! Sets the priority grouping of the interrupt controller.
252*5fd0122aSMatthias Ringwald //!
253*5fd0122aSMatthias Ringwald //! \param bits specifies the number of bits of preemptable priority.
254*5fd0122aSMatthias Ringwald //!
255*5fd0122aSMatthias Ringwald //! This function specifies the split between preemptable priority levels and
256*5fd0122aSMatthias Ringwald //! sub-priority levels in the interrupt priority specification.  The range of
257*5fd0122aSMatthias Ringwald //! the grouping values are dependent upon the hardware implementation; on
258*5fd0122aSMatthias Ringwald //! the MSP432 family, three bits are available for hardware interrupt
259*5fd0122aSMatthias Ringwald //! prioritization and therefore priority grouping values of three through
260*5fd0122aSMatthias Ringwald //! seven have the same effect.
261*5fd0122aSMatthias Ringwald //!
262*5fd0122aSMatthias Ringwald //! \return None.
263*5fd0122aSMatthias Ringwald //
264*5fd0122aSMatthias Ringwald //*****************************************************************************
265*5fd0122aSMatthias Ringwald extern void Interrupt_setPriorityGrouping(uint32_t bits);
266*5fd0122aSMatthias Ringwald 
267*5fd0122aSMatthias Ringwald //*****************************************************************************
268*5fd0122aSMatthias Ringwald //
269*5fd0122aSMatthias Ringwald //! Gets the priority grouping of the interrupt controller.
270*5fd0122aSMatthias Ringwald //!
271*5fd0122aSMatthias Ringwald //! This function returns the split between preemptable priority levels and
272*5fd0122aSMatthias Ringwald //! sub-priority levels in the interrupt priority specification.
273*5fd0122aSMatthias Ringwald //!
274*5fd0122aSMatthias Ringwald //! \return The number of bits of preemptable priority.
275*5fd0122aSMatthias Ringwald //
276*5fd0122aSMatthias Ringwald //*****************************************************************************
277*5fd0122aSMatthias Ringwald extern uint32_t Interrupt_getPriorityGrouping(void);
278*5fd0122aSMatthias Ringwald 
279*5fd0122aSMatthias Ringwald //*****************************************************************************
280*5fd0122aSMatthias Ringwald //
281*5fd0122aSMatthias Ringwald //! Sets the priority of an interrupt.
282*5fd0122aSMatthias Ringwald //!
283*5fd0122aSMatthias Ringwald //! \param interruptNumber specifies the interrupt in question.
284*5fd0122aSMatthias Ringwald //! \param priority specifies the priority of the interrupt.
285*5fd0122aSMatthias Ringwald //!
286*5fd0122aSMatthias Ringwald //! This function is used to set the priority of an interrupt.  When multiple
287*5fd0122aSMatthias Ringwald //! interrupts are asserted simultaneously, the ones with the highest priority
288*5fd0122aSMatthias Ringwald //! are processed before the lower priority interrupts.  Smaller numbers
289*5fd0122aSMatthias Ringwald //! correspond to higher interrupt priorities; priority 0 is the highest
290*5fd0122aSMatthias Ringwald //! interrupt priority.
291*5fd0122aSMatthias Ringwald //!
292*5fd0122aSMatthias Ringwald //! The hardware priority mechanism only looks at the upper N bits of the
293*5fd0122aSMatthias Ringwald //! priority level (where N is 3 for the MSP432 family), so any
294*5fd0122aSMatthias Ringwald //! prioritization must be performed in those bits.
295*5fd0122aSMatthias Ringwald //!
296*5fd0122aSMatthias Ringwald //! See \link Interrupt_enableInterrupt \endlink for details about the interrupt
297*5fd0122aSMatthias Ringwald //! parameter
298*5fd0122aSMatthias Ringwald //!
299*5fd0122aSMatthias Ringwald //! \return None.
300*5fd0122aSMatthias Ringwald //
301*5fd0122aSMatthias Ringwald //*****************************************************************************
302*5fd0122aSMatthias Ringwald extern void Interrupt_setPriority(uint32_t interruptNumber, uint8_t priority);
303*5fd0122aSMatthias Ringwald 
304*5fd0122aSMatthias Ringwald //*****************************************************************************
305*5fd0122aSMatthias Ringwald //
306*5fd0122aSMatthias Ringwald //! Gets the priority of an interrupt.
307*5fd0122aSMatthias Ringwald //!
308*5fd0122aSMatthias Ringwald //! \param interruptNumber specifies the interrupt in question.
309*5fd0122aSMatthias Ringwald //!
310*5fd0122aSMatthias Ringwald //! This function gets the priority of an interrupt.  See
311*5fd0122aSMatthias Ringwald //! Interrupt_setPriority() for a definition of the priority value.
312*5fd0122aSMatthias Ringwald //!
313*5fd0122aSMatthias Ringwald //! See \link Interrupt_enableInterrupt \endlink for details about the interrupt
314*5fd0122aSMatthias Ringwald //! parameter
315*5fd0122aSMatthias Ringwald //!
316*5fd0122aSMatthias Ringwald //! \return Returns the interrupt priority, or -1 if an invalid interrupt was
317*5fd0122aSMatthias Ringwald //! specified.
318*5fd0122aSMatthias Ringwald //
319*5fd0122aSMatthias Ringwald //*****************************************************************************
320*5fd0122aSMatthias Ringwald extern uint8_t Interrupt_getPriority(uint32_t interruptNumber);
321*5fd0122aSMatthias Ringwald 
322*5fd0122aSMatthias Ringwald //*****************************************************************************
323*5fd0122aSMatthias Ringwald //
324*5fd0122aSMatthias Ringwald //! Enables an interrupt.
325*5fd0122aSMatthias Ringwald //!
326*5fd0122aSMatthias Ringwald //! \param interruptNumber specifies the interrupt to be enabled.
327*5fd0122aSMatthias Ringwald //!
328*5fd0122aSMatthias Ringwald //! The specified interrupt is enabled in the interrupt controller.  Other
329*5fd0122aSMatthias Ringwald //! enables for the interrupt (such as at the peripheral level) are unaffected
330*5fd0122aSMatthias Ringwald //! by this function.
331*5fd0122aSMatthias Ringwald //!
332*5fd0122aSMatthias Ringwald //! Valid values will vary from part to part, so it is important to check the
333*5fd0122aSMatthias Ringwald //! device specific datasheet, however for MSP432 101 the following values can
334*5fd0122aSMatthias Ringwald //! be provided:
335*5fd0122aSMatthias Ringwald //!     - \b FAULT_NMI
336*5fd0122aSMatthias Ringwald //!     - \b FAULT_HARD
337*5fd0122aSMatthias Ringwald //!     - \b FAULT_MPU
338*5fd0122aSMatthias Ringwald //!     - \b FAULT_BUS
339*5fd0122aSMatthias Ringwald //!     - \b FAULT_USAGE
340*5fd0122aSMatthias Ringwald //!     - \b FAULT_SVCALL
341*5fd0122aSMatthias Ringwald //!     - \b FAULT_DEBUG
342*5fd0122aSMatthias Ringwald //!     - \b FAULT_PENDSV
343*5fd0122aSMatthias Ringwald //!     - \b FAULT_SYSTICK
344*5fd0122aSMatthias Ringwald //!     - \b INT_PSS
345*5fd0122aSMatthias Ringwald //!     - \b INT_CS
346*5fd0122aSMatthias Ringwald //!     - \b INT_PCM
347*5fd0122aSMatthias Ringwald //!     - \b INT_WDT_A
348*5fd0122aSMatthias Ringwald //!     - \b INT_FPU
349*5fd0122aSMatthias Ringwald //!     - \b INT_FLCTL
350*5fd0122aSMatthias Ringwald //!     - \b INT_COMP0
351*5fd0122aSMatthias Ringwald //!     - \b INT_COMP1
352*5fd0122aSMatthias Ringwald //!     - \b INT_TA0_0
353*5fd0122aSMatthias Ringwald //!     - \b INT_TA0_N
354*5fd0122aSMatthias Ringwald //!     - \b INT_TA1_0
355*5fd0122aSMatthias Ringwald //!     - \b INT_TA1_N
356*5fd0122aSMatthias Ringwald //!     - \b INT_TA2_0
357*5fd0122aSMatthias Ringwald //!     - \b INT_TA2_N
358*5fd0122aSMatthias Ringwald //!     - \b INT_TA3_0
359*5fd0122aSMatthias Ringwald //!     - \b INT_TA3_N
360*5fd0122aSMatthias Ringwald //!     - \b INT_EUSCIA0
361*5fd0122aSMatthias Ringwald //!     - \b INT_EUSCIA1
362*5fd0122aSMatthias Ringwald //!     - \b INT_EUSCIA2
363*5fd0122aSMatthias Ringwald //!     - \b INT_EUSCIA3
364*5fd0122aSMatthias Ringwald //!     - \b INT_EUSCIB0
365*5fd0122aSMatthias Ringwald //!     - \b INT_EUSCIB1
366*5fd0122aSMatthias Ringwald //!     - \b INT_EUSCIB2
367*5fd0122aSMatthias Ringwald //!     - \b INT_EUSCIB3
368*5fd0122aSMatthias Ringwald //!     - \b INT_ADC14
369*5fd0122aSMatthias Ringwald //!     - \b INT_T32_INT1
370*5fd0122aSMatthias Ringwald //!     - \b INT_T32_INT2
371*5fd0122aSMatthias Ringwald //!     - \b INT_T32_INTC
372*5fd0122aSMatthias Ringwald //!     - \b INT_AES
373*5fd0122aSMatthias Ringwald //!     - \b INT_RTCC
374*5fd0122aSMatthias Ringwald //!     - \b INT_DMA_ERR
375*5fd0122aSMatthias Ringwald //!     - \b INT_DMA_INT3
376*5fd0122aSMatthias Ringwald //!     - \b INT_DMA_INT2
377*5fd0122aSMatthias Ringwald //!     - \b INT_DMA_INT1
378*5fd0122aSMatthias Ringwald //!     - \b INT_DMA_INT0
379*5fd0122aSMatthias Ringwald //!     - \b INT_PORT1
380*5fd0122aSMatthias Ringwald //!     - \b INT_PORT2
381*5fd0122aSMatthias Ringwald //!     - \b INT_PORT3
382*5fd0122aSMatthias Ringwald //!     - \b INT_PORT4
383*5fd0122aSMatthias Ringwald //!     - \b INT_PORT5
384*5fd0122aSMatthias Ringwald //!     - \b INT_PORT6
385*5fd0122aSMatthias Ringwald //!
386*5fd0122aSMatthias Ringwald //! \return None.
387*5fd0122aSMatthias Ringwald //
388*5fd0122aSMatthias Ringwald //*****************************************************************************
389*5fd0122aSMatthias Ringwald extern void Interrupt_enableInterrupt(uint32_t interruptNumber);
390*5fd0122aSMatthias Ringwald 
391*5fd0122aSMatthias Ringwald //*****************************************************************************
392*5fd0122aSMatthias Ringwald //
393*5fd0122aSMatthias Ringwald //! Disables an interrupt.
394*5fd0122aSMatthias Ringwald //!
395*5fd0122aSMatthias Ringwald //! \param interruptNumber specifies the interrupt to be disabled.
396*5fd0122aSMatthias Ringwald //!
397*5fd0122aSMatthias Ringwald //! The specified interrupt is disabled in the interrupt controller.  Other
398*5fd0122aSMatthias Ringwald //! enables for the interrupt (such as at the peripheral level) are unaffected
399*5fd0122aSMatthias Ringwald //! by this function.
400*5fd0122aSMatthias Ringwald //!
401*5fd0122aSMatthias Ringwald //! See \link Interrupt_enableInterrupt \endlink for details about the interrupt
402*5fd0122aSMatthias Ringwald //! parameter
403*5fd0122aSMatthias Ringwald //!
404*5fd0122aSMatthias Ringwald //! \return None.
405*5fd0122aSMatthias Ringwald //
406*5fd0122aSMatthias Ringwald //*****************************************************************************
407*5fd0122aSMatthias Ringwald extern void Interrupt_disableInterrupt(uint32_t interruptNumber);
408*5fd0122aSMatthias Ringwald 
409*5fd0122aSMatthias Ringwald //*****************************************************************************
410*5fd0122aSMatthias Ringwald //
411*5fd0122aSMatthias Ringwald //! Returns if a peripheral interrupt is enabled.
412*5fd0122aSMatthias Ringwald //!
413*5fd0122aSMatthias Ringwald //! \param interruptNumber specifies the interrupt to check.
414*5fd0122aSMatthias Ringwald //!
415*5fd0122aSMatthias Ringwald //! This function checks if the specified interrupt is enabled in the interrupt
416*5fd0122aSMatthias Ringwald //! controller.
417*5fd0122aSMatthias Ringwald //!
418*5fd0122aSMatthias Ringwald //! See \link Interrupt_enableInterrupt \endlink for details about the interrupt
419*5fd0122aSMatthias Ringwald //! parameter
420*5fd0122aSMatthias Ringwald //!
421*5fd0122aSMatthias Ringwald //! \return A non-zero value if the interrupt is enabled.
422*5fd0122aSMatthias Ringwald //
423*5fd0122aSMatthias Ringwald //*****************************************************************************
424*5fd0122aSMatthias Ringwald extern bool Interrupt_isEnabled(uint32_t interruptNumber);
425*5fd0122aSMatthias Ringwald 
426*5fd0122aSMatthias Ringwald //*****************************************************************************
427*5fd0122aSMatthias Ringwald //
428*5fd0122aSMatthias Ringwald //! Pends an interrupt.
429*5fd0122aSMatthias Ringwald //!
430*5fd0122aSMatthias Ringwald //! \param interruptNumber specifies the interrupt to be pended.
431*5fd0122aSMatthias Ringwald //!
432*5fd0122aSMatthias Ringwald //! The specified interrupt is pended in the interrupt controller.  Pending an
433*5fd0122aSMatthias Ringwald //! interrupt causes the interrupt controller to execute the corresponding
434*5fd0122aSMatthias Ringwald //! interrupt handler at the next available time, based on the current
435*5fd0122aSMatthias Ringwald //! interrupt state priorities. For example, if called by a higher priority
436*5fd0122aSMatthias Ringwald //! interrupt handler, the specified interrupt handler is not called until
437*5fd0122aSMatthias Ringwald //! after the current interrupt handler has completed execution.  The interrupt
438*5fd0122aSMatthias Ringwald //! must have been enabled for it to be called.
439*5fd0122aSMatthias Ringwald //!
440*5fd0122aSMatthias Ringwald //! See \link Interrupt_enableInterrupt \endlink for details about the interrupt
441*5fd0122aSMatthias Ringwald //! parameter
442*5fd0122aSMatthias Ringwald //!
443*5fd0122aSMatthias Ringwald //! \return None.
444*5fd0122aSMatthias Ringwald //
445*5fd0122aSMatthias Ringwald //*****************************************************************************
446*5fd0122aSMatthias Ringwald extern void Interrupt_pendInterrupt(uint32_t interruptNumber);
447*5fd0122aSMatthias Ringwald 
448*5fd0122aSMatthias Ringwald //*****************************************************************************
449*5fd0122aSMatthias Ringwald //
450*5fd0122aSMatthias Ringwald //! Un-pends an interrupt.
451*5fd0122aSMatthias Ringwald //!
452*5fd0122aSMatthias Ringwald //! \param interruptNumber specifies the interrupt to be un-pended.
453*5fd0122aSMatthias Ringwald //!
454*5fd0122aSMatthias Ringwald //! The specified interrupt is un-pended in the interrupt controller.  This
455*5fd0122aSMatthias Ringwald //! will cause any previously generated interrupts that have not been handled
456*5fd0122aSMatthias Ringwald //! yet (due to higher priority interrupts or the interrupt no having been
457*5fd0122aSMatthias Ringwald //! enabled yet) to be discarded.
458*5fd0122aSMatthias Ringwald //!
459*5fd0122aSMatthias Ringwald //! See \link Interrupt_enableInterrupt \endlink for details about the interrupt
460*5fd0122aSMatthias Ringwald //! parameter
461*5fd0122aSMatthias Ringwald //!
462*5fd0122aSMatthias Ringwald //! \return None.
463*5fd0122aSMatthias Ringwald //
464*5fd0122aSMatthias Ringwald //*****************************************************************************
465*5fd0122aSMatthias Ringwald extern void Interrupt_unpendInterrupt(uint32_t interruptNumber);
466*5fd0122aSMatthias Ringwald 
467*5fd0122aSMatthias Ringwald //*****************************************************************************
468*5fd0122aSMatthias Ringwald //
469*5fd0122aSMatthias Ringwald //! Sets the priority masking level
470*5fd0122aSMatthias Ringwald //!
471*5fd0122aSMatthias Ringwald //! \param priorityMask is the priority level that is masked.
472*5fd0122aSMatthias Ringwald //!
473*5fd0122aSMatthias Ringwald //! This function sets the interrupt priority masking level so that all
474*5fd0122aSMatthias Ringwald //! interrupts at the specified or lesser priority level are masked.  Masking
475*5fd0122aSMatthias Ringwald //! interrupts can be used to globally disable a set of interrupts with
476*5fd0122aSMatthias Ringwald //! priority below a predetermined threshold.  A value of 0 disables priority
477*5fd0122aSMatthias Ringwald //! masking.
478*5fd0122aSMatthias Ringwald //!
479*5fd0122aSMatthias Ringwald //! Smaller numbers correspond to higher interrupt priorities.  So for example
480*5fd0122aSMatthias Ringwald //! a priority level mask of 4 allows interrupts of priority level 0-3,
481*5fd0122aSMatthias Ringwald //! and interrupts with a numerical priority of 4 and greater are blocked.
482*5fd0122aSMatthias Ringwald //!
483*5fd0122aSMatthias Ringwald //! The hardware priority mechanism only looks at the upper N bits of the
484*5fd0122aSMatthias Ringwald //! priority level (where N is 3 for the MSP432 family), so any
485*5fd0122aSMatthias Ringwald //! prioritization must be performed in those bits.
486*5fd0122aSMatthias Ringwald //!
487*5fd0122aSMatthias Ringwald //! \return None.
488*5fd0122aSMatthias Ringwald //
489*5fd0122aSMatthias Ringwald //*****************************************************************************
490*5fd0122aSMatthias Ringwald extern void Interrupt_setPriorityMask(uint8_t priorityMask);
491*5fd0122aSMatthias Ringwald 
492*5fd0122aSMatthias Ringwald //*****************************************************************************
493*5fd0122aSMatthias Ringwald //
494*5fd0122aSMatthias Ringwald //! Gets the priority masking level
495*5fd0122aSMatthias Ringwald //!
496*5fd0122aSMatthias Ringwald //! This function gets the current setting of the interrupt priority masking
497*5fd0122aSMatthias Ringwald //! level.  The value returned is the priority level such that all interrupts
498*5fd0122aSMatthias Ringwald //! of that and lesser priority are masked.  A value of 0 means that priority
499*5fd0122aSMatthias Ringwald //! masking is disabled.
500*5fd0122aSMatthias Ringwald //!
501*5fd0122aSMatthias Ringwald //! Smaller numbers correspond to higher interrupt priorities.  So for example
502*5fd0122aSMatthias Ringwald //! a priority level mask of 4 allows interrupts of priority level 0-3,
503*5fd0122aSMatthias Ringwald //! and interrupts with a numerical priority of 4 and greater are blocked.
504*5fd0122aSMatthias Ringwald //!
505*5fd0122aSMatthias Ringwald //! The hardware priority mechanism only looks at the upper N bits of the
506*5fd0122aSMatthias Ringwald //! priority level (where N is 3 for the MSP432 family), so any
507*5fd0122aSMatthias Ringwald //! prioritization must be performed in those bits.
508*5fd0122aSMatthias Ringwald //!
509*5fd0122aSMatthias Ringwald //! \return Returns the value of the interrupt priority level mask.
510*5fd0122aSMatthias Ringwald //
511*5fd0122aSMatthias Ringwald //*****************************************************************************
512*5fd0122aSMatthias Ringwald extern uint8_t Interrupt_getPriorityMask(void);
513*5fd0122aSMatthias Ringwald 
514*5fd0122aSMatthias Ringwald //*****************************************************************************
515*5fd0122aSMatthias Ringwald //
516*5fd0122aSMatthias Ringwald //! Sets the address of the vector table. This function is for advanced users
517*5fd0122aSMatthias Ringwald //! who might want to switch between multiple instances of vector tables
518*5fd0122aSMatthias Ringwald //! (perhaps between flash/ram).
519*5fd0122aSMatthias Ringwald //!
520*5fd0122aSMatthias Ringwald //! \param addr is the new address of the vector table.
521*5fd0122aSMatthias Ringwald //!
522*5fd0122aSMatthias Ringwald //! \return None.
523*5fd0122aSMatthias Ringwald //
524*5fd0122aSMatthias Ringwald //*****************************************************************************
525*5fd0122aSMatthias Ringwald extern void Interrupt_setVectorTableAddress(uint32_t addr);
526*5fd0122aSMatthias Ringwald 
527*5fd0122aSMatthias Ringwald //*****************************************************************************
528*5fd0122aSMatthias Ringwald //
529*5fd0122aSMatthias Ringwald //! Returns the address of the interrupt vector table.
530*5fd0122aSMatthias Ringwald //!
531*5fd0122aSMatthias Ringwald //! \return Address of the vector table.
532*5fd0122aSMatthias Ringwald //
533*5fd0122aSMatthias Ringwald //*****************************************************************************
534*5fd0122aSMatthias Ringwald extern uint32_t Interrupt_getVectorTableAddress(void);
535*5fd0122aSMatthias Ringwald 
536*5fd0122aSMatthias Ringwald //*****************************************************************************
537*5fd0122aSMatthias Ringwald //
538*5fd0122aSMatthias Ringwald //! Enables the processor to sleep when exiting an ISR. For low power operation,
539*5fd0122aSMatthias Ringwald //! this is ideal as power cycles are not wasted with the processing required
540*5fd0122aSMatthias Ringwald //! for waking up from an ISR and going back to sleep.
541*5fd0122aSMatthias Ringwald //!
542*5fd0122aSMatthias Ringwald //! \return None
543*5fd0122aSMatthias Ringwald //
544*5fd0122aSMatthias Ringwald //*****************************************************************************
545*5fd0122aSMatthias Ringwald extern void Interrupt_enableSleepOnIsrExit(void);
546*5fd0122aSMatthias Ringwald 
547*5fd0122aSMatthias Ringwald //*****************************************************************************
548*5fd0122aSMatthias Ringwald //
549*5fd0122aSMatthias Ringwald //! Disables the processor to sleep when exiting an ISR.
550*5fd0122aSMatthias Ringwald //!
551*5fd0122aSMatthias Ringwald //! \return None
552*5fd0122aSMatthias Ringwald //
553*5fd0122aSMatthias Ringwald //*****************************************************************************
554*5fd0122aSMatthias Ringwald extern void Interrupt_disableSleepOnIsrExit(void);
555*5fd0122aSMatthias Ringwald 
556*5fd0122aSMatthias Ringwald //*****************************************************************************
557*5fd0122aSMatthias Ringwald //
558*5fd0122aSMatthias Ringwald // Mark the end of the C bindings section for C++ compilers.
559*5fd0122aSMatthias Ringwald //
560*5fd0122aSMatthias Ringwald //*****************************************************************************
561*5fd0122aSMatthias Ringwald #ifdef __cplusplus
562*5fd0122aSMatthias Ringwald }
563*5fd0122aSMatthias Ringwald #endif
564*5fd0122aSMatthias Ringwald 
565*5fd0122aSMatthias Ringwald //*****************************************************************************
566*5fd0122aSMatthias Ringwald //
567*5fd0122aSMatthias Ringwald // Close the Doxygen group.
568*5fd0122aSMatthias Ringwald //! @}
569*5fd0122aSMatthias Ringwald //
570*5fd0122aSMatthias Ringwald //*****************************************************************************
571*5fd0122aSMatthias Ringwald 
572*5fd0122aSMatthias Ringwald #endif // __INTERRUPT_H__
573