#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <driver/gpio.h>
#include <esp_log.h>
#define CONFIG_LOG_MAXIMUM_LEVEL 5
#define BUTTON_PIN GPIO_NUM_35
static const char *TAG = "IRAM_ISR";
static DRAM_ATTR volatile bool intr_trig = false;
static DRAM_ATTR volatile uint32_t intr_count = 0;
static void IRAM_ATTR helper(void) {
intr_count++;
intr_trig = true;
}
static void IRAM_ATTR btn_isr(void *arg) {
helper();
}
void app_main(void) {
esp_log_level_set(TAG, ESP_LOG_VERBOSE);
gpio_config_t btn_cfg = {
.pin_bit_mask = 1ULL << BUTTON_PIN,
.mode = GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_ENABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_NEGEDGE,
};
gpio_config(&btn_cfg);
gpio_install_isr_service(ESP_INTR_FLAG_IRAM);
gpio_isr_handler_add(BUTTON_PIN, btn_isr, NULL);
while (true) {
if (intr_trig) {
gpio_intr_disable(BUTTON_PIN);
uint32_t count = intr_count;
intr_trig = false;
gpio_intr_enable(BUTTON_PIN);
ESP_LOGI(TAG, "按鍵中斷次數:%" PRIu32, count);
}
vTaskDelay(pdMS_TO_TICKS(10));
}
}