我在 GPIO_INTR_ANYEDGE 上配置了一个 GPIO ISR。
我想在 ISR 中知道它是上升沿还是下降沿。
怎么做?
如果我只是在 ISR 中读取 GPIO 状态,它几乎总是 0,即使在上升沿也是如此。
例子:
代码:
全选#define PIN GPIO_NUM_5
gpio_set_intr_type(PIN, GPIO_INTR_POSEDGE); // <<<< Rising edge only!
gpio_set_direc
tion(PIN, GPIO_MODE_INPUT);
gpio_pullup_en(PIN);
gpio_isr_handler_add(PIN, gpio_sda_handler, (void *) PIN);
static void gpio_handler(void *arg)
{
uint32_t x = gpio_get_level(PIN);
xQueueSendFromISR(gpio_evt_queue, &x, NULL);
}
static void gpio_task(void *arg)
{
uint32_t x;
for (;;) {
if (xQueueReceive(gpio_evt_queue, &x, portMAX_DELAY)) {
ESP_LOGI(TAG, "GPIO[%d] intr, val: %d\n", PIN, x & 1);
}
}
}
输出:
代码:
全选I (32183) i2c-tools: GPIO[5] intr, val: 0
I (32183) i2c-tools: GPIO[5] intr, val: 0
I (32193) i2c-tools: GPIO[5] intr, val: 1
I (32193) i2c-tools: GPIO[5] intr, val: 0
I (32203) i2c-tools: GPIO[5] intr, val: 0
我需要某种延迟吗?如果是这样,多少钱?可以延迟 ISR 吗?