ESP32 - GPIO中断触发与事件回调

2022-10-17,,,,

 最近为项目增加了gpio外部触发中断功能,原理是为gpio32注册了上升沿触发事件,事件触发后,会向rtos队列写入数据。在rtos事件中检测到该队列中有新加入的事件,就读出,并执行相应代码。

#define gpio_input_io_wakeup 32
#define gpio_input_pin_sel (1ull<<gpio_input_io_wakeup)
#define esp_intr_flag_default 0

static void iram_attr gpio_isr_handler(void* arg)
{
    uint32_t gpio_num = (uint32_t) arg;
    xqueuesendfromisr(gpio_evt_queue, &gpio_num, null);
}

static void gpio_task_example(void* arg)
{
    uint32_t io_num;
    for(;;) {
        if(xqueuereceive(gpio_evt_queue, &io_num, portmax_delay))
     { printf("gpio[%d] intr, val: %d\n", io_num, gpio_get_level(io_num)); } } } void app_main() { gpio_config_t io_conf; io_conf.intr_type = gpio_pin_intr_posedge;//interrupt of rising edge io_conf.pin_bit_mask = gpio_input_pin_sel;//bit mask of the pins, use gpio32 here io_conf.mode = gpio_mode_input;//set as input mode io_conf.pull_up_en = 0;//enable pull-up mode gpio_config(&io_conf); //install gpio isr service gpio_install_isr_service(esp_intr_flag_default); //hook isr handler for specific gpio pin gpio_isr_handler_add(gpio_input_io_wakeup, gpio_isr_handler, (void*) gpio_input_io_wakeup);   xtaskcreate(gpio_task_example, "gpio_task_example", 2048, null, 10, null);   while(1)   {        } }

 

《ESP32 - GPIO中断触发与事件回调.doc》

下载本文的Word格式文档,以方便收藏与打印。