Skip to content

Commit e68e340

Browse files
authored
core: mask GPIO interrupts while attaching/detaching ISR handler (#3598)
Fixes #2916.
1 parent 99763f2 commit e68e340

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

cores/esp8266/core_esp8266_wiring_digital.c

+4
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ void ICACHE_RAM_ATTR interrupt_handler(void *arg) {
152152

153153
extern void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFunc, void *arg, int mode) {
154154
if(pin < 16) {
155+
ETS_GPIO_INTR_DISABLE();
155156
interrupt_handler_t *handler = &interrupt_handlers[pin];
156157
handler->mode = mode;
157158
handler->fn = userFunc;
@@ -160,6 +161,7 @@ extern void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFu
160161
GPC(pin) &= ~(0xF << GPCI);//INT mode disabled
161162
GPIEC = (1 << pin); //Clear Interrupt for this pin
162163
GPC(pin) |= ((mode & 0xF) << GPCI);//INT mode "mode"
164+
ETS_GPIO_INTR_ENABLE();
163165
}
164166
}
165167

@@ -170,13 +172,15 @@ extern void ICACHE_RAM_ATTR __attachInterrupt(uint8_t pin, voidFuncPtr userFunc,
170172

171173
extern void ICACHE_RAM_ATTR __detachInterrupt(uint8_t pin) {
172174
if(pin < 16) {
175+
ETS_GPIO_INTR_DISABLE();
173176
GPC(pin) &= ~(0xF << GPCI);//INT mode disabled
174177
GPIEC = (1 << pin); //Clear Interrupt for this pin
175178
interrupt_reg &= ~(1 << pin);
176179
interrupt_handler_t *handler = &interrupt_handlers[pin];
177180
handler->mode = 0;
178181
handler->fn = 0;
179182
handler->arg = 0;
183+
ETS_GPIO_INTR_ENABLE();
180184
}
181185
}
182186

0 commit comments

Comments
 (0)