对于任何一款芯片,GPIO接口是其最基本的组成部分,也是一款芯片入门的最基本操作,下面论述下 关于esp32开发版的GPIO操作,本文中重点讲解下

关于如何创建eclipse工程,并通过eclipse下载到esp32中去(本文的工程文件在esp-idf/example/periheral文件夹中gpio工程),这里就不再详细论述了,可以看前面的文章,本文重点讲解工程源码,现在讲代码分块粘贴如下,并进行讲解。

本次操作比较简单,大致可以分为以下几个部分

PART1;

定义gpio口寄存器及一个空的xQueueHandle类型的返回信号量。

#define GPIO_OUTPUT_IO_0    18
#define GPIO_OUTPUT_IO_1 19
#define GPIO_OUTPUT_PIN_SEL ((1<<GPIO_OUTPUT_IO_0) | (1<<GPIO_OUTPUT_IO_1)//配置gpioout位寄存器 #define GPIO_INPUT_IO_0 4
#define GPIO_INPUT_IO_1 5
#define GPIO_INPUT_PIN_SEL ((1<<GPIO_INPUT_IO_0) | (1<<GPIO_INPUT_IO_1))
#define ESP_INTR_FLAG_DEFAULT 0  //定义默认的中断标志为0 static xQueueHandle gpio_evt_queue = NULL;     //定义一个队列返回变量

PART2:

编写中断处理函数及信号输出任务

static void IRAM_ATTR gpio_isr_handler(void* arg)
{
uint32_t gpio_num = (uint32_t) arg;
xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
//xQueueSendFromISR是发生消息插入到队列的后面,将gpio的io口数传递到队列中,关于xQueueSendFromISR函数的相关知识,可以自己查询API手册,本文最后也有相关讲解
} static void gpio_task_example(void* arg)
{
uint32_t io_num;
for(;;) {
if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {
//接受gpio队列,并在读取完后删除队列
printf("GPIO[%d] intr, val: %d\n", io_num, gpio_get_level(io_num));
//将GPIO的信息打印输出
}
}
}

PART3:

应用主程序

 void app_main()
{
gpio_config_t io_conf;
//定义一个gpio_config类型的结构体,下面的都算对其进行的配置
//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 = ;
//disable pull-up mode
io_conf.pull_up_en = ;
//configure GPIO with the given settings
gpio_config(&io_conf); //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 = ;
gpio_config(&io_conf); //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(, sizeof(uint32_t));
//start gpio task
xTaskCreate(gpio_task_example, "gpio_task_example", , NULL, , NULL);
//
//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 = ;
while() {
printf("cnt: %d\n", cnt++);
vTaskDelay( / portTICK_RATE_MS);
gpio_set_level(GPIO_OUTPUT_IO_0, cnt % );
gpio_set_level(GPIO_OUTPUT_IO_1, cnt % );
}
}

app_main中第三行申明gpio配置的结构体实例,然后在其后对gpio的结构体进行配置,然后开启一个gpio_task_example的任务处理GPIO4或者GPIO5中断发来的消息,这里用到FreeRTOS操作系统的消息队列功能实现中断函数与用户任务之间的消息传递。

在44,46行中调用函数给 GPIO4和GPIO5管脚添加中断处理函数,并在最后的while循环中每隔1s切换一次GPIO18、GPIO19的电平值,

实验现象:

    对于本例子的实验例子,实验操作是,将程序烧写到esp32中后,将GPIO18->GPIO4,GPIO19->GPIO5(—>表示连接),然后打开minicom(任意串口调试软件),可以看到每隔一秒gpio输出一次信息。由于app_main中第29行修改了GPIO_INPUT_IO_0为GPIO_INTR_ANYEDGE(即GPIO18的中断方式,所以,GPIO18的中断会比19多一次)。实验输出如下图所示:

小TIPS:

   对于不知道的变量,想要找到其定义,选中想要查询的变量,按下F3即可自动跳转到其定义处,同理,选中,按F4可以看到此变量或函数被谁调用了。

相关知识:

1、esp32函数API:gpio口的函数API

2、FreeRTOS函数API:

以下截图来自正点原子FreeRTOS开发手册

esp32的GPIO操作的更多相关文章

  1. linux 标准 GPIO 操作

    Linux 提供了GPIO 操作的 API,具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现.   #include    int gpio_request(unsigne ...

  2. STM32标准库GPIO操作

    STM32标准库GPIO操作 STM32任何外围设备的使用都分为两部分:初始化和使用.体现在代码上就是:(1)有一个初始化函数(2)main函数中的使用 1.初始化GPIO 初始化GPIO函数代码: ...

  3. RK3399/NanoPC-T4开发板使用/sys/class/gpio操作外接GPIO设备-【申嵌视频-RK3399篇】

    实验2:RK3399/NanoPC-T4开发板使用/sys/class/gpio操作外接GPIO设备,比如外接一个LED模块,通过GPIO1_A0管脚 1 介绍   LED模块   Matrix-LE ...

  4. 通过数组和枚举简化GPIO操作编码(转)

    源: 通过数组和枚举简化GPIO操作编码

  5. sys下gpio操作

    gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映射 * 控制GPIO的目录位于/sys/class/gpio * /sys/class/gpio/export文 ...

  6. 通过数组和枚举简化GPIO操作编码

    在工作中,经常遇到大量使用GPIO作为数字量输入输出来控制设备或采集状态,每次定义操作不同的GPIO针脚既麻烦又容易出错,于是就想要简化操作过程.对于数字量输入来说就是采集对应针脚的状态:而输出则是根 ...

  7. 树莓派高级GPIO库,wiringpi2 for python使用笔记(三)GPIO操作

    GPIO库的核心功能,当然就是操作GPIO了,GPIO就是"通用输入/输出"接口,比如点亮一个LED.继电器等,或者通过iic spi 1-wire等协议,读取.写入数据,这都是G ...

  8. S3C6410 GPIO操作接口

    在后面的驱动学习中,需要对GPIO进行一系列的操作,了解这些引脚操作有助于编码的效率. 一.配置GPIO S3C6410要使用其引脚时,需要对其进行配置,如配置为输入/输出/中断等功能,根据芯片手册来 ...

  9. 基于STM8的GPIO操作---STM8-第一章

    1. 综诉 也许单片机在你看来是一件不太容易的事,但据我所知,单片机,无非就是控制它的GPIO口,所以可以看出,学会如何操作控制GPIO口对使用单片机来说是很重要的一件事. 在装载STM8的单片机中, ...

随机推荐

  1. 单链表查找第i个节点

    #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct Node { char ...

  2. Android SDK + Appium 环境搭建

    一.JDK 安装 说明:JDK是包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具,所以必须最先安装. 链接: https://pan.baidu.com/s/1NfNK_K7vukF ...

  3. jquery中live is not a function的问题

    jquery中的live()方法在jquery1.9及以上的版本中已被废弃了,如果使用,会抛出TypeError: $(...).live is not a function错误. 解决方法: 之前的 ...

  4. QTP 学习 - 对象库

    QTP的关键字视图和专家视图 1.Keyword view(关键字视图) 在录制脚本的过程中,用户执行的每一个步骤,在关键字视图中记录为一行. 关键字视图直观有效,用户可以很清楚的看到被录制对象的录制 ...

  5. python基础数据篇

    1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ? 1 names = ['Alex',"Tenglan",' ...

  6. ES6原生Class

    es5 之前定义构造函数的方法 // 先定义一个函数,强行叫它构造函数,大写的P也不是必须的,只是约定俗成 function Point(x, y) { this.x = x; // 构造函数的属性都 ...

  7. MySQL中的sort_buffer_size参数大小的设置问题

    看到sort_buffer_size这个参数(connect级别的参数,MySQL5.7,默认值是1048576字节,也就是1MB)的默认值这么小,想着是不是可以调大一点,反正内存动不动几十个GB的, ...

  8. 2、订单填写页面 /items/write?skuId=10&orderNo=201903211033410001

    <template> <div class="write"> <div class="adr" v-if="addres ...

  9. Django+Vue.js框架快速搭建web项目

    一.vue环境搭建1.下载安装node.js.2.安装淘宝镜像cnpm,在命令窗口输入: npm install -g cnpm --registry=https://registry.npm.tao ...

  10. oracle数据库名称已被一现有约束条件占用

    使用oracle数据库出现名称已被一现有约束条件占用的错误,我的原因是在同一个库中有一个表使用了外键FK_SNO,自己新建的一个表中也使用了外键FK_SNO,导致出现了错误. 这时改变一下外键FK_S ...