乐鑫技术交流
直播中

youyoulan

12年用户 1083经验值
私信 关注
[问答]

如何从ISR的上升沿读取GPIO?

我在 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_direction(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 吗?

               


                        

回帖(1)

哔哔哔-

2023-9-22 11:38:42
c void gpio_sda_handler(void* arg)
{
    uint32_t gpio_num = (uint32_t) arg;
    uint32_t level = gpio_get_level(gpio_num);

    if(level == 1) {
        // 上升沿
    } else {
        // 下降沿
    }
}

在 ISR 中使用 gpio_get_level() 函数读取 GPIO 状态,然后根据状态判断是上升沿还是下降沿。注意,在 ISR 中最好不要使用延迟等函数,以免影响系统响应能力。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分