欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-01 16:33:27
最近为项目增加了GPIO外部触发中断功能,原理是为GPIO32注册了上升沿触发事件,事件触发后,会向RTOS队列写入数据。在RTOS事件中检测到该队列中有新加入的事件,就读出,并执行相应代码。 ......

 最近为项目增加了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)   {        } }