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