@@ -62,57 +62,86 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
62
62
#else
63
63
EExt_Interrupts in = digitalPinToInterrupt (pin );
64
64
#endif
65
- if (in == NOT_AN_INTERRUPT || in == EXTERNAL_INT_NMI )
66
- return ;
65
+ if (in == NOT_AN_INTERRUPT ) return ;
67
66
68
67
if (!enabled ) {
69
68
__initialize ();
70
69
enabled = 1 ;
71
70
}
72
71
73
- // Enable wakeup capability on pin in case being used during sleep
74
- EIC -> WAKEUP .reg |= (1 << in );
72
+ if (in == EXTERNAL_INT_NMI ) {
73
+ EIC -> NMIFLAG .bit .NMI = 1 ; // Clear flag
74
+ switch (mode ) {
75
+ case LOW :
76
+ EIC -> NMICTRL .bit .NMISENSE = EIC_NMICTRL_NMISENSE_LOW ;
77
+ break ;
75
78
76
- // Assign pin to EIC
77
- pinPeripheral (pin , PIO_EXTINT );
79
+ case HIGH :
80
+ EIC -> NMICTRL .bit .NMISENSE = EIC_NMICTRL_NMISENSE_HIGH ;
81
+ break ;
78
82
79
- // Assign callback to interrupt
80
- callbacksInt [in ] = callback ;
83
+ case CHANGE :
84
+ EIC -> NMICTRL .bit .NMISENSE = EIC_NMICTRL_NMISENSE_BOTH ;
85
+ break ;
81
86
82
- // Look for right CONFIG register to be addressed
83
- if (in > EXTERNAL_INT_7 ) {
84
- config = 1 ;
85
- } else {
86
- config = 0 ;
87
- }
87
+ case FALLING :
88
+ EIC -> NMICTRL .bit .NMISENSE = EIC_NMICTRL_NMISENSE_FALL ;
89
+ break ;
88
90
89
- // Configure the interrupt mode
90
- pos = (in - (8 * config )) << 2 ;
91
- switch (mode )
92
- {
93
- case LOW :
94
- EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_LOW_Val << pos ;
95
- break ;
91
+ case RISING :
92
+ EIC -> NMICTRL .bit .NMISENSE = EIC_NMICTRL_NMISENSE_RISE ;
93
+ break ;
94
+ }
96
95
97
- case HIGH :
98
- EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_HIGH_Val << pos ;
99
- break ;
96
+ // Assign callback to interrupt
97
+ callbacksInt [EXTERNAL_INT_NMI ] = callback ;
100
98
101
- case CHANGE :
102
- EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_BOTH_Val << pos ;
103
- break ;
99
+ } else { // Not NMI, is external interrupt
104
100
105
- case FALLING :
106
- EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_FALL_Val << pos ;
107
- break ;
101
+ // Enable wakeup capability on pin in case being used during sleep
102
+ EIC -> WAKEUP .reg |= (1 << in );
108
103
109
- case RISING :
110
- EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_RISE_Val << pos ;
111
- break ;
112
- }
104
+ // Assign pin to EIC
105
+ pinPeripheral (pin , PIO_EXTINT );
106
+
107
+ // Look for right CONFIG register to be addressed
108
+ if (in > EXTERNAL_INT_7 ) {
109
+ config = 1 ;
110
+ } else {
111
+ config = 0 ;
112
+ }
113
+
114
+ // Configure the interrupt mode
115
+ pos = (in - (8 * config )) << 2 ;
116
+ switch (mode )
117
+ {
118
+ case LOW :
119
+ EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_LOW_Val << pos ;
120
+ break ;
121
+
122
+ case HIGH :
123
+ EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_HIGH_Val << pos ;
124
+ break ;
125
+
126
+ case CHANGE :
127
+ EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_BOTH_Val << pos ;
128
+ break ;
129
+
130
+ case FALLING :
131
+ EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_FALL_Val << pos ;
132
+ break ;
113
133
114
- // Enable the interrupt
115
- EIC -> INTENSET .reg = EIC_INTENSET_EXTINT (1 << in );
134
+ case RISING :
135
+ EIC -> CONFIG [config ].reg |= EIC_CONFIG_SENSE0_RISE_Val << pos ;
136
+ break ;
137
+ }
138
+
139
+ // Enable the interrupt
140
+ EIC -> INTENSET .reg = EIC_INTENSET_EXTINT (1 << in );
141
+
142
+ // Assign callback to interrupt
143
+ callbacksInt [in ] = callback ;
144
+ }
116
145
}
117
146
118
147
/*
@@ -125,13 +154,16 @@ void detachInterrupt(uint32_t pin)
125
154
#else
126
155
EExt_Interrupts in = digitalPinToInterrupt (pin );
127
156
#endif
128
- if (in == NOT_AN_INTERRUPT || in == EXTERNAL_INT_NMI )
129
- return ;
157
+ if (in == NOT_AN_INTERRUPT ) return ;
130
158
131
- EIC -> INTENCLR .reg = EIC_INTENCLR_EXTINT (1 << in );
159
+ if (in == EXTERNAL_INT_NMI ) {
160
+ EIC -> NMICTRL .bit .NMISENSE = 0 ; // Turn off detection
161
+ } else {
162
+ EIC -> INTENCLR .reg = EIC_INTENCLR_EXTINT (1 << in );
132
163
133
- // Disable wakeup capability on pin during sleep
134
- EIC -> WAKEUP .reg &= ~(1 << in );
164
+ // Disable wakeup capability on pin during sleep
165
+ EIC -> WAKEUP .reg &= ~(1 << in );
166
+ }
135
167
}
136
168
137
169
/*
@@ -154,3 +186,12 @@ void EIC_Handler(void)
154
186
}
155
187
}
156
188
}
189
+
190
+ /*
191
+ * NMI Interrupt Handler
192
+ */
193
+ void NMI_Handler (void )
194
+ {
195
+ if (callbacksInt [EXTERNAL_INT_NMI ]) callbacksInt [EXTERNAL_INT_NMI ]();
196
+ EIC -> NMIFLAG .bit .NMI = 1 ; // Clear interrupt
197
+ }
0 commit comments