@@ -76,6 +76,8 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
76
76
77
77
if (digitalPinToInterrupt (pin ) == NOT_AN_INTERRUPT )
78
78
return ;
79
+ if (digitalPinToInterrupt (pin ) == EXTERNAL_INT_NMI )
80
+ return ;
79
81
80
82
if (!enabled ) {
81
83
__initialize ();
@@ -89,91 +91,53 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
89
91
callbacksInt [digitalPinToInterrupt (pin )]._ulPin = pin ;
90
92
callbacksInt [digitalPinToInterrupt (pin )]._callback = callback ;
91
93
92
- // Check if normal interrupt or NMI
93
- if (pin != 2 )
94
- {
95
- // Look for right CONFIG register to be addressed
96
- if (digitalPinToInterrupt (pin ) > EXTERNAL_INT_7 ) {
97
- config = 1 ;
98
- } else {
99
- config = 0 ;
100
- }
101
-
102
- // Configure the interrupt mode
103
- pos = ((digitalPinToInterrupt (pin ) - (8 * config )) << 2 );
104
- switch (mode )
105
- {
106
- case LOW :
107
- EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_LOW_Val << pos ;
108
- break ;
109
-
110
- case HIGH :
111
- EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_HIGH_Val << pos ;
112
- break ;
113
-
114
- case CHANGE :
115
- EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_BOTH_Val << pos ;
116
- break ;
117
-
118
- case FALLING :
119
- EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_FALL_Val << pos ;
120
- break ;
121
-
122
- case RISING :
123
- EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_RISE_Val << pos ;
124
- break ;
125
- }
126
-
127
- // Enable the interrupt
128
- EIC -> INTENSET .reg = EIC_INTENSET_EXTINT (1 << digitalPinToInterrupt (pin ));
94
+ // Look for right CONFIG register to be addressed
95
+ if (digitalPinToInterrupt (pin ) > EXTERNAL_INT_7 ) {
96
+ config = 1 ;
97
+ } else {
98
+ config = 0 ;
129
99
}
130
- else // Handles NMI on pin 2
100
+
101
+ // Configure the interrupt mode
102
+ pos = ((digitalPinToInterrupt (pin ) - (8 * config )) << 2 );
103
+ switch (mode )
131
104
{
132
- // Configure the interrupt mode
133
- switch (mode )
134
- {
135
- case LOW :
136
- EIC -> NMICTRL .reg = EIC_NMICTRL_NMISENSE_LOW ;
137
- break ;
105
+ case LOW :
106
+ EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_LOW_Val << pos ;
107
+ break ;
138
108
139
- case HIGH :
140
- EIC -> NMICTRL .reg = EIC_NMICTRL_NMISENSE_HIGH ;
141
- break ;
109
+ case HIGH :
110
+ EIC -> CONFIG [ config ] .reg |= EIC_CONFIG_SENSE0_HIGH_Val << pos ;
111
+ break ;
142
112
143
- case CHANGE :
144
- EIC -> NMICTRL .reg = EIC_NMICTRL_NMISENSE_BOTH ;
145
- break ;
113
+ case CHANGE :
114
+ EIC -> CONFIG [ config ] .reg |= EIC_CONFIG_SENSE0_BOTH_Val << pos ;
115
+ break ;
146
116
147
- case FALLING :
148
- EIC -> NMICTRL .reg = EIC_NMICTRL_NMISENSE_FALL ;
149
- break ;
117
+ case FALLING :
118
+ EIC -> CONFIG [ config ] .reg |= EIC_CONFIG_SENSE0_FALL_Val << pos ;
119
+ break ;
150
120
151
- case RISING :
152
- EIC -> NMICTRL .reg = EIC_NMICTRL_NMISENSE_RISE ;
153
- break ;
154
- }
121
+ case RISING :
122
+ EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_RISE_Val << pos ;
123
+ break ;
155
124
}
125
+
126
+ // Enable the interrupt
127
+ EIC -> INTENSET .reg = EIC_INTENSET_EXTINT (1 << digitalPinToInterrupt (pin ));
156
128
}
157
129
158
130
/*
159
131
* \brief Turns off the given interrupt.
160
132
*/
161
- void detachInterrupt ( uint32_t ulPin )
133
+ void detachInterrupt (uint32_t pin )
162
134
{
163
- /*
164
- // Retrieve pin information
165
- Pio *pio = g_APinDescription[pin].pPort;
166
- uint32_t mask = g_APinDescription[pin].ulPin;
167
-
168
- // Disable interrupt
169
- pio->PIO_IDR = mask;
170
- */
171
- if ( digitalPinToInterrupt ( ulPin ) == NOT_AN_INTERRUPT )
172
- {
173
- return ;
174
- }
135
+ if (digitalPinToInterrupt (pin ) == NOT_AN_INTERRUPT )
136
+ return ;
137
+ if (digitalPinToInterrupt (pin ) == EXTERNAL_INT_NMI )
138
+ return ;
175
139
176
- EIC -> INTENCLR .reg = EIC_INTENCLR_EXTINT ( 1 << digitalPinToInterrupt ( ulPin ) ) ;
140
+ EIC -> INTENCLR .reg = EIC_INTENCLR_EXTINT (1 << digitalPinToInterrupt (pin )) ;
177
141
}
178
142
179
143
/*
@@ -200,21 +164,6 @@ void EIC_Handler( void )
200
164
}
201
165
}
202
166
203
- /*
204
- * External Non-Maskable Interrupt Controller NVIC Interrupt Handler
205
- */
206
- void NMI_Handler ( void )
207
- {
208
- // Call the callback function if assigned
209
- if ( callbacksInt [EXTERNAL_INT_NMI ]._callback != NULL )
210
- {
211
- callbacksInt [EXTERNAL_INT_NMI ]._callback () ;
212
- }
213
-
214
- // Clear the interrupt
215
- EIC -> NMIFLAG .reg = EIC_NMIFLAG_NMI ;
216
- }
217
-
218
167
#ifdef __cplusplus
219
168
}
220
169
#endif
0 commit comments