esp32的GPIO操作
对于任何一款芯片,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操作相关推荐
- ESP32系列--第三篇 GPIO操作(基本输入输出)
一.目的 在前面的章节中我们已经介绍了ESP32的开发环境的搭建过程,从本篇开始我们将从最基本的GPIO控制讲起,介绍ESP32上面相关的外设操作. 二.介绍 参考资料 GPIO & RTC ...
- Linux下给arm的引脚电平,ARM-Linux GPIO操作事宜
原标题:ARM-Linux GPIO操作事宜 1.在 Linux 表示为"S3C2410_GPx(n)",其中x的取值为"A,B,C,D,E,F,G,H.....&quo ...
- RT-Thread对GPIO操作两种方式的区别:1)通过设备操作接口2)直接通过通用GPIO设备驱动
在学习RT-Thread设备驱动框架时,看到潘多拉开发板的RT-Thread例程资料中的文档<AN0002-RT-Thread-通用 GPIO 设备应用笔记>有如下描述,因此产生使用文档中 ...
- linux 标准 GPIO 操作
Linux 提供了GPIO 操作的 API,具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现. #include int gpio_request(unsigned ...
- 驱动GPIO操作归纳
IO内存操作可以使用ioremap映射再使用指针操作对应的寄存器,但是比较少使用,一般使用内核提供GPIO操作函数. 一.内核提供的通用GPIO操作的API接口,其文件是gpio.h (include ...
- linux蜂鸣器控制实验,【Linux公开课】蜂鸣器使用、LCD背光控制、触摸屏校准、GPIO操作...
摘要为方便使用蜂鸣器,系统为蜂鸣器提供类似LED的操作接口,对应的操作文件是/sys/class/leds/beep/brightness.写入1使蜂鸣器鸣叫,写入0停止鸣叫- 8.12 蜂鸣器使用 ...
- W806 基于Arduino开发的GPIO操作示例,勇于尝新
W806 基于Arduino的点灯实验的 一.写在前面 1. W806芯片参数: 2. MCU 特性: 3. 供电: 二.环境准备,添加支持包 三.打开永恒的LED测试 四.总结 一.写在前面 w80 ...
- Arduino ESP32:测试GPIO中断功能
Arduino ESP32:测试GPIO中断功能 ESP32:测试GPIO中断功能 实例代码 /*测试GPIO中断功能接线说明: 按键1接23,按键2接18 */#include <Arduin ...
- HI3516DV300 GPIO操作
前言 本次实验根据ProYuan28博主写的博客GPIO文档进行适配调试,特此记录GPIO操作. 正文 GPIO分为三个步骤: 1 设置gpio端口复用寄存器: 2 设置GPIO口的方向寄存器(GPI ...
最新文章
- HTTP 错误 500.21 - Internal Server Error 解决方案
- 现代操作系统: 第九章 安全
- SpringBoot:AOP处理请求
- RedisDeskTopManager连接时提示:can't nonnect to redis-server
- 程序员的崩溃,是从“你薪资比我高”开始的!
- npp夜光数据介绍 viirs_对 VIIRS/NPP 夜光数据的解读
- Idea 离线安装插件 Idea 安装离线插件
- CSS实现自定义虚线
- 数据分析师的工作绩效到底是什么?
- Spyder runfile
- 苹果要求添加手机号且忘记安全提示问题解决办法
- matlab ftt图像压缩,求助 fft图像压缩程序问题
- linux debian vi,debian系统中常用的vi命令使用和讲解
- Prim算法实现最小生成树(Java)
- Matlab 自编雅可比矩阵 (jacobi) 函数与官方的Jacobian matrix(雅可比矩阵)函数对比及创新
- 【转载】儒林外史人物——周进(二)
- 【企业】避免华盛顿合作规律,增强有效合作
- vue计算属性的get和set
- 车路协同-智慧出行(智慧交通解决方案)
- Centos7 Certbot 常用命令相关总结
热门文章
- java如何实现信号量_使用二进制信号量实现通用信号量
- api网关 android,如何通过Android上的retrofit2使用Cognito Credentials调用API网关?
- input css年月日,input标签的type为date,显示的日期格式样式更改
- java中timer类包_Java~util包中Timer的使用, 演示cancel方法 和 对比schedule和scheduleAtFixedRate方法...
- esrgan_港中文-商汤联合实验室:ECCV2018 PIRM-SR 超分辨率比赛冠军:ESRGAN(已开源)...
- oracle Blob保存方式,关于文件保存到Oracle中BLOB字段的方法及例子
- oracle 找不到程序,Oracle 找不到监听程序
- 【算法篇】八种内排序算法
- 【JAVA基础篇】集合框架
- Eclipse 版本升级:如何不卸载旧版本 Eclipse 实现在线升级到最新版本?