ESP32开发--外设之GPIO的使用

ESP32基础系列


本文目录

一.ESP32的GPIO简介

要知道如何控制芯片的GPIO,必须由软件和硬件结合,也就是我们需要查看硬件手册和熟悉软件API。像ESP32这种系统级的SOC,一般我们不需要去关心底层的寄存器,官方都已经封装好了,我们只需要知道如何调用相应的API控制即可。以后我们学习其他的外设都是这个流程,看芯片手册和API,控制外设工作。

先来看看芯片手册上关于GPIO的介绍:

34个通用GPIO,足够我们使用了。其中还有一些管脚有特殊用法,在硬件连接时需要注意,具体的可以查看手册。

二.官方例程解析

官方例程一般存放在IDF安装目录里的examples里面。我们拷贝peripherals/gpio到我们自己的文件夹,这样可以保证对官方的原例程不做改动。

然后我们编译下载,查看现象:

对着源码,看看具体做了什么:

void app_main()
{
    gpio_config_t io_conf;
    //disable interrupt
    io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
    //set as output mode
    io_conf.mode = GPIO_MODE_OUTPUT;
    //bit mask of the pins that you want to set,e.g.GPIO18/19
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
    //disable pull-down mode
    io_conf.pull_down_en = 0;
    //disable pull-up mode
    io_conf.pull_up_en = 0;
    //configure GPIO with the given settings
    gpio_config(&io_conf);        #配置GPIO18 和GPIO19为输出模式

    //interrupt of rising edge
    io_conf.intr_type = GPIO_PIN_INTR_POSEDGE;
    //bit mask of the pins, use GPIO4/5 here
    io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
    //set as input mode    
    io_conf.mode = GPIO_MODE_INPUT;
    //enable pull-up mode
    io_conf.pull_up_en = 1;
    gpio_config(&io_conf);    #配置GPIO4 和GPIO5为输入中断模式

    //change gpio intrrupt type for one pin
    gpio_set_intr_type(GPIO_INPUT_IO_0, GPIO_INTR_ANYEDGE);

    //create a queue to handle gpio event from isr
    gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
    //创建了一个任务,任务主要是依次接收队列的内容并打印
    xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL);

    //下面这一段是配置GPIO中断带回调函数
    //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_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);
    //hook isr handler for specific gpio pin
    gpio_isr_handler_add(GPIO_INPUT_IO_1, gpio_isr_handler, (void*) GPIO_INPUT_IO_1);

    //remove isr handler for gpio number.
    gpio_isr_handler_remove(GPIO_INPUT_IO_0);
    //hook isr handler for specific gpio pin again
    gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);

    int cnt = 0;
    while(1) {
        printf("cnt: %d
", cnt++);
        vTaskDelay(1000 / portTICK_RATE_MS);
        gpio_set_level(GPIO_OUTPUT_IO_0, cnt % 2);
        gpio_set_level(GPIO_OUTPUT_IO_1, cnt % 2);
    }
}
总结以下就是:配置GPIO18和GPIO19为输出IO,并且作为两个输入IO的触发源,当IO中断触发后,回调函数会往队列里写对应的值,这时候gpio任务里就会接收并打印对应的信息。这个例程主要是向我们展示如何配置GPIO的输入输出以及中断等功能,学会控制GPIO。
总结以下就是:配置GPIO18和GPIO19为输出IO,并且作为两个输入IO的触发源,当IO中断触发后,回调函数会往队列里写对应的值,这时候gpio任务里就会接收并打印对应的信息。这个例程主要是向我们展示如何配置GPIO的输入输出以及中断等功能,学会控制GPIO。

我们把GPIO4与GPIO18或者19其中一个相连,看看会发生什么:可以看到和上面叙述的一样

我觉得核心就是GPIO的控制结构体,只要配置好了GIPIO,剩下的就是调用API去控制了,相应的API可以参考。

官方的示例比较简单,我们可以自己修改或屏蔽相应的代码,对照打印信息,看看会有什么不同的现象。毕竟研究一块芯片的外设还是需要我们自己多多动手。


经验分享 程序员 微信小程序 职场和发展