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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# bool?和bool_C#中的bool关键字

c# bool?和boolC&#xff03;bool关键字 (C# bool keyword) In C#, bool is a keyword which is used to declare a variable that can store Boolean values true or false. bool keyword is an alias of System.Boolean. 在C&#xff03;中&#xff0c; bool是一个关键字&am…

聚焦数据的力量——全球领先安全技术分享会在京召开

ZD至顶网安全频道 04月21日 综合消息&#xff1a; 由中国网络安全与信息化产业联盟、360共同主办的“数据的力量——全球领先安全技术分享会“今日在北京成功召开。来自政府、企业、教育、投资机构和产业联盟的300多位嘉宾参加了本次技术分享会&#xff0c;共同就安全产业发展趋…

algol语言_ALGOL的完整形式是什么?

algol语言ALGOL&#xff1a;算法语言 (ALGOL: Algorithmic Language) ALGOL is an abbreviation of "Algorithmic Language". ALGOL是“算法语言”的缩写 。 It is a family of very significant computer programming languages, initially designed and created i…

Qt/QML编程学习之心得:一个.qml文件调用另一个.qml文件(十七)

在c++中,一个文件调用另外一个文件最直接最快捷的方式就是#incldue<头文件>的使用,那么在元数据描述性语言QML中,如何从一个界面描述调用另外一个界面描述,一个.qml文件调用另外一个.qml呢?QML虽然有个import,但是用法可以说完全不同于#include。 引用方法1:直接…

如何设置Fedora默认从命令行启动?

2019独角兽企业重金招聘Python工程师标准>>> Sumary:因为在Fedora中没有/etc/initab文件我们不方便从这里设置它的runlevel target&#xff0c;但是Linux又给我们提供了一个强悍的工具systemd,我们可以用system来链接默认的启动级别&#xff0c;所以开始吧&#xff…

scala 线性回归_Scala的特征线性化

scala 线性回归Scala | 特性线性化 (Scala | Trait Linearization) In Scala programming language, trait linearization is a property that helps to rectify ambiguity when instances of a class that are defined using multiple inheritances from different classes an…

MDK C++中对内联的极度优化

先来看看我们SmartIRQ的具体实现 // 智能IRQ&#xff0c;初始化时备份&#xff0c;销毁时还原 class SmartIRQ { public:force_inline SmartIRQ(bool enable false){_state __get_PRIMASK();if(enable)__enable_irq();else__disable_irq();}force_inline ~SmartIRQ(){__set_P…

python中类怎么理解_Python中的列表理解

python中类怎么理解In order to create a list, a most obvious and remembered solution is to use a for-loop. 为了创建列表&#xff0c;最明显和记住的解决方案是使用for循环。 Example: 例&#xff1a; Python 3.6.8 (default, Apr 25 2019, 21:02:35)[GCC 4.8.5 201506…

工控领域的网络攻击 食尸鬼行动深入解读Operation Ghoul

卡巴斯基于2016年6月监测到了Operation Ghoul&#xff08;食尸鬼行动&#xff09;网络攻击&#xff0c;Operation Ghoul针对30多个国家的工业、制造业和工程管理机构发起了定向渗透入侵。目前&#xff0c;卡巴斯基发现&#xff0c;有130多个机构已被确认为这类攻击的受害者。 该…

julia自然常数_Julia中的Sys.KERNEL常数

julia自然常数Julia| 系统内核常数 (Julia | Sys.KERNEL Constant) Sys.KERNEL is a constant of the Symbol type in Julia programming language, it is used to get the name of the operating system. Sys.KERNEL是Julia编程语言中Symbol类型的常量&#xff0c;用于获取操作…

tomcat:sessionId生成机制导致tomcat启动过慢问题

为什么80%的码农都做不了架构师&#xff1f;>>> http://blog.csdn.net/u013939884/article/details/72860358 转载于:https://my.oschina.net/wii01/blog/1527731

Codeforces Round #431 (Div. 2)

A. Odds and Endstime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputWhere do odds begin, and where do they end? Where does hope emerge, and will they ever break? Given an integer sequence a1, a2, ..., a…

ping/pong模式_PING的完整形式是什么?

ping/pong模式PING&#xff1a;数据包InterNet Groper (PING: Packet InterNet Groper) In the sector of networking of computers, PING is an abbreviation of Packet InterNet Groper. It is utility software or system software of administration of computer network u…

Gartner: 2017年11大信息安全技术(解读版)

在2017年6月份举办的第23届Gartner安全与风险管理峰会上&#xff0c;Gartner的Fellow——Neil McDonald发布了2017年度的11个最新最酷的信息安全技术&#xff0c;比往年的10大技术多了一项。以往都是通过互联网了解Gartner的各种信息和报告。这次&#xff0c;本人有幸亲临现场&…

博客url什么形式_URL的完整形式是什么?

博客url什么形式URL&#xff1a;统一资源定位符 (URL: Uniform Resource Locator) URL is an abbreviation of Uniform Resource Locator. Uniform Resource Locator which is informally or casually known as a web address is addressed as a resource of the web, which ca…

Verizon的SDN策略:不鸣则已,一鸣惊人?

Verizon对于其网络虚拟化计划的进展等一直保持缄默&#xff0c;但这并不代表Verizon没在SDN方面投入。 Verizon于2015年推出了初步的SDN迁移计划&#xff0c;但并未就此事对外界做过多披露。与此同时&#xff0c;它影响着它的SDN虚拟化合作伙伴。如电缆方面&#xff0c;据介绍&…

宝马奥迪工厂模式_宝马的完整形式是什么?

宝马奥迪工厂模式宝马&#xff1a;巴伐利亚汽车公司 (BMW: Bayerische Motoren Werke) BMW is an abbreviation of "Bayerische Motoren Werke". It is a multinational automobile and motorcycle manufacturing company whose headquarter is situated in Munich, …

艾拉物联CEO :物联网时代的到来让安全问题显得尤为突出

产品安全和嵌入式安全的理念一直都很复杂&#xff0c;不过我们至少对它们比较熟悉。但物联网&#xff08;IoT&#xff09;却对“产品”这一理念进行了颠覆&#xff0c;让联网成为了产品定义中不可或缺的一部分。 由此一来&#xff0c;仅在设备层面讨论安全已经远远不够了。不论…

jquery选择器连续选择_JQuery中的选择器

jquery选择器连续选择Its time to write some JQuery now. Do check out the introductory article on JQuery first in case you havent. Before we move to Selectors in JQuery, lets talk a bit about the general syntax first. 现在该写一些JQuery了。 如果没有&#xff…

加拿大大数据:正在升温的大数据市场

产业发展背景 早在2011年5月加拿大广播电视和电信委员会&#xff08;CRTC&#xff09;就发布了新的“国家宽带计划”&#xff0c;该计划显示&#xff0c;到2015年加拿大全体国民将享有5Mbps的宽带接入速度。CRTC表示&#xff1a;“来自市场的资金及有针对性的政府拨款将继续推动…