ESP8266 Developer Zone The Official ESP8266 Forum 2015-12-01T21:09:16+08:00 https://bbs.espressif.com:443/feed.php?f=7&t=1461 2015-12-01T21:09:16+08:00 2015-12-01T21:09:16+08:00 https://bbs.espressif.com:443/viewtopic.php?t=1461&p=4855#p4855 <![CDATA[gpio_intr_handler_register cause wdt reset]]>

Code:

LOCAL void gpio_isr(void *arg)
{
  uint32 status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
  if (status & BIT(0))
  {
      ets_uart_printf("Pressed!\r\n");
      // Clear interrupt
      GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, status & BIT(0));
  }
}

void ICACHE_FLASH_ATTR user_init(void)
{
  uart_init(BIT_RATE_115200, BIT_RATE_115200);
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
  PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);
  GPIO_DIS_OUTPUT(GPIO_ID_PIN(0));
  ETS_GPIO_INTR_DISABLE();
  ETS_GPIO_INTR_ATTACH(gpio_isr, 0);
  gpio_pin_intr_state_set(GPIO_ID_PIN(0), GPIO_PIN_INTR_NEGEDGE);
  ETS_GPIO_INTR_ENABLE();
}


Recently I examined into gpio.h and decided to try the gpio_ functions, so I wrote this:

Code:

void new_gpio_isr(uint32 intr_mask, void *arg)
{
  ets_uart_printf("int %d\r\n", intr_mask);
  if (intr_mask & BIT(0))
  {
      ets_uart_printf("Pressed!\r\n");
      // Clear interrupt
      gpio_intr_ack(intr_mask);
  }
}

void ICACHE_FLASH_ATTR user_init(void)
{
  uart_init(BIT_RATE_115200, BIT_RATE_115200);
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
  PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);
  GPIO_DIS_OUTPUT(GPIO_ID_PIN(0));
  ETS_GPIO_INTR_DISABLE();
  gpio_intr_handler_register(new_gpio_isr, 0);
  gpio_pin_intr_state_set(GPIO_ID_PIN(0), GPIO_PIN_INTR_NEGEDGE);
  ETS_GPIO_INTR_ENABLE();
}


And the system enter into watch dog reset soon after I press the button. This is tested with 1.4 to 1.5 SDK

Is there any difference between ETS_GPIO_INTR_ATTACH and gpio_intr_handler_register?

Thanks

Baoshi

Statistics: Posted by baoshi — Tue Dec 01, 2015 9:09 pm


]]>