EZR32 Wonder Gecko Software Documentation  ezr32wg-doc-4.2.1
gpiointerrupt.c
Go to the documentation of this file.
1 /***************************************************************************/
17 #include "em_gpio.h"
18 #include "em_int.h"
19 #include "gpiointerrupt.h"
20 #include "em_assert.h"
21 #include "em_common.h"
22 
23 /*******************************************************************************
24  ******************************** MACROS ***********************************
25  ******************************************************************************/
26 
27 /*******************************************************************************
28  ******************************* STRUCTS ***********************************
29  ******************************************************************************/
30 
33 typedef struct
34 {
35  /* Pin number in range of 0 to 15 */
36  uint32_t pin;
37 
38  /* Pointer to the callback function */
39  GPIOINT_IrqCallbackPtr_t callback;
40 
41 } GPIOINT_CallbackDesc_t;
42 
43 
44 /*******************************************************************************
45  ******************************** GLOBALS **********************************
46  ******************************************************************************/
47 
48 /* Array of user callbacks. One for each pin. */
49 static GPIOINT_IrqCallbackPtr_t gpioCallbacks[16] = {0};
50 
51 /*******************************************************************************
52  ****************************** PROTOTYPES *********************************
53  ******************************************************************************/
54 static void GPIOINT_IRQDispatcher(uint32_t iflags);
55 
58 /*******************************************************************************
59  *************************** GLOBAL FUNCTIONS ******************************
60  ******************************************************************************/
61 
62 /***************************************************************************/
67 void GPIOINT_Init(void)
68 {
69  NVIC_ClearPendingIRQ(GPIO_ODD_IRQn);
70  NVIC_EnableIRQ(GPIO_ODD_IRQn);
71  NVIC_ClearPendingIRQ(GPIO_EVEN_IRQn);
72  NVIC_EnableIRQ(GPIO_EVEN_IRQn);
73 }
74 
75 
76 /***************************************************************************/
91 void GPIOINT_CallbackRegister(uint8_t pin, GPIOINT_IrqCallbackPtr_t callbackPtr)
92 {
93  INT_Disable();
94 
95  /* Dispatcher is used */
96  gpioCallbacks[pin] = callbackPtr;
97 
98  INT_Enable();
99 }
100 
103 /***************************************************************************/
116 static void GPIOINT_IRQDispatcher(uint32_t iflags)
117 {
118  uint32_t irqIdx;
119  GPIOINT_IrqCallbackPtr_t callback;
120 
121  /* check for all flags set in IF register */
122  while(iflags)
123  {
124  irqIdx = EFM32_CTZ(iflags);
125 
126  /* clear flag*/
127  iflags &= ~(1 << irqIdx);
128 
129  callback = gpioCallbacks[irqIdx];
130  if (callback)
131  {
132  /* call user callback */
133  callback(irqIdx);
134  }
135  }
136 }
137 
138 /***************************************************************************/
144 void GPIO_EVEN_IRQHandler(void)
145 {
146  uint32_t iflags;
147 
148  /* Get all even interrupts. */
149  iflags = GPIO_IntGetEnabled() & 0x00005555;
150 
151  /* Clean only even interrupts. */
152  GPIO_IntClear(iflags);
153 
154  GPIOINT_IRQDispatcher(iflags);
155 }
156 
157 
158 /***************************************************************************/
164 void GPIO_ODD_IRQHandler(void)
165 {
166  uint32_t iflags;
167 
168  /* Get all odd interrupts. */
169  iflags = GPIO_IntGetEnabled() & 0x0000AAAA;
170 
171  /* Clean only even interrupts. */
172  GPIO_IntClear(iflags);
173 
174  GPIOINT_IRQDispatcher(iflags);
175 }
176 
183 /******** THE REST OF THE FILE IS DOCUMENTATION ONLY !**********************/
Emlib peripheral API "assert" implementation.
__STATIC_INLINE uint32_t GPIO_IntGetEnabled(void)
Get enabled and pending GPIO interrupt flags. Useful for handling more interrupt sources in the same ...
Definition: em_gpio.h:626
__STATIC_INLINE void GPIO_IntClear(uint32_t flags)
Clear one or more pending GPIO interrupts.
Definition: em_gpio.h:561
__STATIC_INLINE uint32_t INT_Enable(void)
Enable interrupts.
Definition: em_int.h:94
void GPIOINT_CallbackRegister(uint8_t pin, GPIOINT_IrqCallbackPtr_t callbackPtr)
Registers user callback for given pin number.
Definition: gpiointerrupt.c:91
Emlib general purpose utilities.
__STATIC_INLINE uint32_t EFM32_CTZ(uint32_t value)
Count trailing number of zero's.
Definition: em_common.h:121
Interrupt enable/disable unit API.
General Purpose IO (GPIO) peripheral API.
void(* GPIOINT_IrqCallbackPtr_t)(uint8_t pin)
GPIO interrupt callback function pointer.
Definition: gpiointerrupt.h:49
void GPIOINT_Init(void)
Initialization of GPIOINT module.
Definition: gpiointerrupt.c:67
GPIOINT API definition.
__STATIC_INLINE uint32_t INT_Disable(void)
Disable interrupts.
Definition: em_int.h:71