@@ -28,16 +28,18 @@ static void __initialize()
28
28
{
29
29
memset (callbacksInt , 0 , sizeof (callbacksInt ));
30
30
31
- #if defined(__SAMD51__ ) //TODO: verify the correct interrupts
32
-
33
- ///EIC MCLK is enabled by default
34
-
35
- NVIC_DisableIRQ (EIC_0_IRQn );
36
- NVIC_ClearPendingIRQ (EIC_0_IRQn );
37
- NVIC_SetPriority (EIC_0_IRQn , 0 );
38
- NVIC_EnableIRQ (EIC_0_IRQn );
39
-
40
- GCLK -> PCHCTRL [EIC_GCLK_ID ].reg = GCLK_PCHCTRL_GEN_GCLK2_Val | (1 << GCLK_PCHCTRL_CHEN_Pos );
31
+ #if defined(__SAMD51__ )
32
+ ///EIC MCLK is enabled by default
33
+ for (uint32_t i = 0 ; i <= 15 ; i ++ ) // EIC_0_IRQn = 12 ... EIC_15_IRQn = 27
34
+ {
35
+ uint8_t irqn = EIC_0_IRQn + i ;
36
+ NVIC_DisableIRQ (irqn );
37
+ NVIC_ClearPendingIRQ (irqn );
38
+ NVIC_SetPriority (irqn , 0 );
39
+ NVIC_EnableIRQ (irqn );
40
+ }
41
+
42
+ GCLK -> PCHCTRL [EIC_GCLK_ID ].reg = GCLK_PCHCTRL_GEN_GCLK2_Val | (1 << GCLK_PCHCTRL_CHEN_Pos );
41
43
#else
42
44
NVIC_DisableIRQ (EIC_IRQn );
43
45
NVIC_ClearPendingIRQ (EIC_IRQn );
@@ -56,8 +58,8 @@ static void __initialize()
56
58
57
59
// Enable EIC
58
60
#if defined(__SAMD51__ )
59
- EIC -> CTRLA .bit .ENABLE = 1 ;
60
- while (EIC -> SYNCBUSY .bit .ENABLE == 1 ) { }
61
+ EIC -> CTRLA .bit .ENABLE = 1 ;
62
+ while (EIC -> SYNCBUSY .bit .ENABLE == 1 ) { }
61
63
#else
62
64
EIC -> CTRL .bit .ENABLE = 1 ;
63
65
while (EIC -> STATUS .bit .SYNCBUSY == 1 ) { }
@@ -79,6 +81,7 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
79
81
#else
80
82
EExt_Interrupts in = digitalPinToInterrupt (pin );
81
83
#endif
84
+
82
85
if (in == NOT_AN_INTERRUPT || in == EXTERNAL_INT_NMI )
83
86
return ;
84
87
@@ -89,7 +92,7 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
89
92
90
93
// Enable wakeup capability on pin in case being used during sleep
91
94
#if defined(__SAMD51__ )
92
- //TODO: find how to do
95
+ //I believe this is done automatically
93
96
#else
94
97
EIC -> WAKEUP .reg |= (1 << in );
95
98
#endif
@@ -104,11 +107,17 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
104
107
if (in > EXTERNAL_INT_7 ) {
105
108
config = 1 ;
106
109
} else {
107
- config = 0 ;
110
+ config = 0 ;
108
111
}
109
112
110
113
// Configure the interrupt mode
111
114
pos = (in - (8 * config )) << 2 ;
115
+
116
+ #if defined (__SAMD51__ )
117
+ EIC -> CTRLA .bit .ENABLE = 0 ;
118
+ while (EIC -> SYNCBUSY .bit .ENABLE == 1 ) { }
119
+ #endif
120
+
112
121
switch (mode )
113
122
{
114
123
case LOW :
@@ -131,12 +140,12 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
131
140
EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_RISE_Val << pos ;
132
141
break ;
133
142
}
134
-
135
- #if defined(__SAMD51__ )
136
- //TODO: find how to do
137
- #else
138
143
// Enable the interrupt
139
144
EIC -> INTENSET .reg = EIC_INTENSET_EXTINT (1 << in );
145
+
146
+ #if defined (__SAMD51__ )
147
+ EIC -> CTRLA .bit .ENABLE = 1 ;
148
+ while (EIC -> SYNCBUSY .bit .ENABLE == 1 ) { }
140
149
#endif
141
150
}
142
151
@@ -157,7 +166,7 @@ void detachInterrupt(uint32_t pin)
157
166
158
167
// Disable wakeup capability on pin during sleep
159
168
#if defined(__SAMD51__ )
160
- //TODO: find how to do
169
+ //I believe this is done automatically
161
170
#else
162
171
EIC -> WAKEUP .reg &= ~(1 << in );
163
172
#endif
@@ -166,6 +175,102 @@ void detachInterrupt(uint32_t pin)
166
175
/*
167
176
* External Interrupt Controller NVIC Interrupt Handler
168
177
*/
178
+ #if defined(__SAMD51__ )
179
+ void InterruptHandler (uint32_t i )
180
+ {
181
+ if ((EIC -> INTFLAG .reg & (1 << i )) != 0 )
182
+ {
183
+ // Call the callback function if assigned
184
+ if (callbacksInt [i ]) {
185
+ callbacksInt [i ]();
186
+ }
187
+
188
+ // Clear the interrupt
189
+ EIC -> INTFLAG .reg = 1 << i ;
190
+ }
191
+ }
192
+
193
+ void EIC_0_Handler (void )
194
+ {
195
+ InterruptHandler (EXTERNAL_INT_0 );
196
+ }
197
+
198
+ void EIC_1_Handler (void )
199
+ {
200
+ InterruptHandler (EXTERNAL_INT_1 );
201
+ }
202
+
203
+ void EIC_2_Handler (void )
204
+ {
205
+ InterruptHandler (EXTERNAL_INT_2 );
206
+ }
207
+
208
+ void EIC_3_Handler (void )
209
+ {
210
+ InterruptHandler (EXTERNAL_INT_3 );
211
+ }
212
+
213
+ void EIC_4_Handler (void )
214
+ {
215
+ InterruptHandler (EXTERNAL_INT_4 );
216
+ }
217
+
218
+ void EIC_5_Handler (void )
219
+ {
220
+ InterruptHandler (EXTERNAL_INT_5 );
221
+ }
222
+
223
+ void EIC_6_Handler (void )
224
+ {
225
+ InterruptHandler (EXTERNAL_INT_6 );
226
+ }
227
+
228
+ void EIC_7_Handler (void )
229
+ {
230
+ InterruptHandler (EXTERNAL_INT_7 );
231
+ }
232
+
233
+ void EIC_8_Handler (void )
234
+ {
235
+ InterruptHandler (EXTERNAL_INT_8 );
236
+ }
237
+
238
+ void EIC_9_Handler (void )
239
+ {
240
+ InterruptHandler (EXTERNAL_INT_9 );
241
+ }
242
+
243
+ void EIC_10_Handler (void )
244
+ {
245
+ InterruptHandler (EXTERNAL_INT_10 );
246
+ }
247
+
248
+ void EIC_11_Handler (void )
249
+ {
250
+ InterruptHandler (EXTERNAL_INT_11 );
251
+ }
252
+
253
+ void EIC_12_Handler (void )
254
+ {
255
+ InterruptHandler (EXTERNAL_INT_12 );
256
+ }
257
+
258
+ void EIC_13_Handler (void )
259
+ {
260
+ InterruptHandler (EXTERNAL_INT_13 );
261
+ }
262
+
263
+ void EIC_14_Handler (void )
264
+ {
265
+ InterruptHandler (EXTERNAL_INT_14 );
266
+ }
267
+
268
+ void EIC_15_Handler (void )
269
+ {
270
+ InterruptHandler (EXTERNAL_INT_15 );
271
+ }
272
+ #else
273
+
169
274
void EIC_Handler (void )
170
275
{
171
276
// Test the 16 normal interrupts
@@ -183,3 +288,4 @@ void EIC_Handler(void)
183
288
}
184
289
}
185
290
}
291
+ #endif
0 commit comments