对于任何一款芯片,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  //定义默认的中断标志为0static 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:

应用主程序

 1 void app_main()
 2 {
 3     gpio_config_t io_conf;
 4     //定义一个gpio_config类型的结构体,下面的都算对其进行的配置
 5     //disable interrupt
 6     io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
 7     //set as output mode
 8     io_conf.mode = GPIO_MODE_OUTPUT;
 9     //bit mask of the pins that you want to set,e.g.GPIO18/19
10     io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
11     //disable pull-down mode
12     io_conf.pull_down_en = 0;
13     //disable pull-up mode
14     io_conf.pull_up_en = 0;
15     //configure GPIO with the given settings
16     gpio_config(&io_conf);
17
18     //interrupt of rising edge
19     io_conf.intr_type = GPIO_PIN_INTR_POSEDGE;
20     //bit mask of the pins, use GPIO4/5 here
21     io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
22     //set as input mode
23     io_conf.mode = GPIO_MODE_INPUT;
24     //enable pull-up mode
25     io_conf.pull_up_en = 1;
26     gpio_config(&io_conf);
27
28     //change gpio intrrupt type for one pin
29     gpio_set_intr_type(GPIO_INPUT_IO_0, GPIO_INTR_ANYEDGE);
30
31     //create a queue to handle gpio event from isr
32     gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
33     //start gpio task
34     xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL);
35 //
36     //install gpio isr service
37     gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
38     //hook isr handler for specific gpio pin
39     gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);
40     //hook isr handler for specific gpio pin
41     gpio_isr_handler_add(GPIO_INPUT_IO_1, gpio_isr_handler, (void*) GPIO_INPUT_IO_1);
42
43     //remove isr handler for gpio number.
44     gpio_isr_handler_remove(GPIO_INPUT_IO_0);
45     //hook isr handler for specific gpio pin again
46     gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);
47
48     int cnt = 0;
49     while(1) {
50         printf("cnt: %d\n", cnt++);
51         vTaskDelay(1000 / portTICK_RATE_MS);
52         gpio_set_level(GPIO_OUTPUT_IO_0, cnt % 2);
53         gpio_set_level(GPIO_OUTPUT_IO_1, cnt % 2);
54     }
55 }

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开发手册

转载于:https://www.cnblogs.com/noticeable/p/7458292.html

esp32的GPIO操作相关推荐

  1. ESP32系列--第三篇 GPIO操作(基本输入输出)

    一.目的 在前面的章节中我们已经介绍了ESP32的开发环境的搭建过程,从本篇开始我们将从最基本的GPIO控制讲起,介绍ESP32上面相关的外设操作. 二.介绍 参考资料 GPIO & RTC ...

  2. Linux下给arm的引脚电平,ARM-Linux GPIO操作事宜

    原标题:ARM-Linux GPIO操作事宜 1.在 Linux 表示为"S3C2410_GPx(n)",其中x的取值为"A,B,C,D,E,F,G,H.....&quo ...

  3. RT-Thread对GPIO操作两种方式的区别:1)通过设备操作接口2)直接通过通用GPIO设备驱动

    在学习RT-Thread设备驱动框架时,看到潘多拉开发板的RT-Thread例程资料中的文档<AN0002-RT-Thread-通用 GPIO 设备应用笔记>有如下描述,因此产生使用文档中 ...

  4. linux 标准 GPIO 操作

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

  5. 驱动GPIO操作归纳

    IO内存操作可以使用ioremap映射再使用指针操作对应的寄存器,但是比较少使用,一般使用内核提供GPIO操作函数. 一.内核提供的通用GPIO操作的API接口,其文件是gpio.h (include ...

  6. linux蜂鸣器控制实验,【Linux公开课】蜂鸣器使用、LCD背光控制、触摸屏校准、GPIO操作...

    摘要为方便使用蜂鸣器,系统为蜂鸣器提供类似LED的操作接口,对应的操作文件是/sys/class/leds/beep/brightness.写入1使蜂鸣器鸣叫,写入0停止鸣叫- 8.12 蜂鸣器使用 ...

  7. W806 基于Arduino开发的GPIO操作示例,勇于尝新

    W806 基于Arduino的点灯实验的 一.写在前面 1. W806芯片参数: 2. MCU 特性: 3. 供电: 二.环境准备,添加支持包 三.打开永恒的LED测试 四.总结 一.写在前面 w80 ...

  8. Arduino ESP32:测试GPIO中断功能

    Arduino ESP32:测试GPIO中断功能 ESP32:测试GPIO中断功能 实例代码 /*测试GPIO中断功能接线说明: 按键1接23,按键2接18 */#include <Arduin ...

  9. HI3516DV300 GPIO操作

    前言 本次实验根据ProYuan28博主写的博客GPIO文档进行适配调试,特此记录GPIO操作. 正文 GPIO分为三个步骤: 1 设置gpio端口复用寄存器: 2 设置GPIO口的方向寄存器(GPI ...

最新文章

  1. HTTP 错误 500.21 - Internal Server Error 解决方案
  2. 现代操作系统: 第九章 安全
  3. SpringBoot:AOP处理请求
  4. RedisDeskTopManager连接时提示:can't nonnect to redis-server
  5. 程序员的崩溃,是从“你薪资比我高”开始的!
  6. npp夜光数据介绍 viirs_对 VIIRS/NPP 夜光数据的解读
  7. Idea 离线安装插件 Idea 安装离线插件
  8. CSS实现自定义虚线
  9. 数据分析师的工作绩效到底是什么?
  10. Spyder runfile
  11. 苹果要求添加手机号且忘记安全提示问题解决办法
  12. matlab ftt图像压缩,求助 fft图像压缩程序问题
  13. linux debian vi,debian系统中常用的vi命令使用和讲解
  14. Prim算法实现最小生成树(Java)
  15. Matlab 自编雅可比矩阵 (jacobi) 函数与官方的Jacobian matrix(雅可比矩阵)函数对比及创新
  16. 【转载】儒林外史人物——周进(二)
  17. 【企业】避免华盛顿合作规律,增强有效合作
  18. vue计算属性的get和set
  19. 车路协同-智慧出行(智慧交通解决方案)
  20. Centos7 Certbot 常用命令相关总结

热门文章

  1. java如何实现信号量_使用二进制信号量实现通用信号量
  2. api网关 android,如何通过Android上的retrofit2使用Cognito Credentials调用API网关?
  3. input css年月日,input标签的type为date,显示的日期格式样式更改
  4. java中timer类包_Java~util包中Timer的使用, 演示cancel方法 和 对比schedule和scheduleAtFixedRate方法...
  5. esrgan_港中文-商汤联合实验室:ECCV2018 PIRM-SR 超分辨率比赛冠军:ESRGAN(已开源)...
  6. oracle Blob保存方式,关于文件保存到Oracle中BLOB字段的方法及例子
  7. oracle 找不到程序,Oracle 找不到监听程序
  8. 【算法篇】八种内排序算法
  9. 【JAVA基础篇】集合框架
  10. Eclipse 版本升级:如何不卸载旧版本 Eclipse 实现在线升级到最新版本?