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