ESP32-WROOM-32D学习记录(2)

ESP32-WROOM-32D学习记录(2)

今日实验主要学习ESP32-GPIO的输入输出操作,以及对应消息队列和任务的创建。对应程序为ESP-idf文件中peripherals目录下GPIO文件。

实验开发板及开发环境

开发板:ESP32_Devkitc_V4,micro USB数据线
开发环境:eclipse IDE,msys32,串口助手
实验预期结果:配置2个输出引脚,2个输入引脚(一各引脚配置为上升沿外部输入中断,另一个配置为上升沿和下降沿外部输入中断),将输入与输出连接,触发中断时打印中断源信息以及当时引脚电平。

程序分析

在这里插入图片描述利用宏定义配置输入输出引脚。其中,GPIO_OUTPUT_PIN_SEL 含义为将1左移X位(X为引脚数),将GPIO对应的位置1,使能该GPIO位。

在这里插入图片描述
第一个函数为GPIO中断服务函数,参数为中断源引脚,服务函数内部将中断源引脚地址通过队列句柄发送给消息队列。
第二个函数为任务函数,通过句柄定位到的消息队列中有数据进入时立即将其读出,读出数据为中断源引脚,检测该引脚电平后连同信息一起打印到串口。

在这里插入图片描述
主函数程序中,首先配置GPIO基本模式,定义一个结构体变量,配置成员,主要有输入/输出,上拉/下拉,使能/禁止中断,引脚号等。该程序配置完后,GPIO18,19为输出引脚,GPIO4,5为上拉输入引脚,使能中断,GPIO4为下降沿和上升沿都触发,GPIO5仅上升沿触发。

xQueueCreate()函数创建了一个消息队列,消息个数为10,函数返回队列句柄赋值给gpio_evt_queue变量。xTaskCreate()函数创建了一个任务,用来接收消息队列信息并进行信息打印。

gpio_isr_handler_add()函数用来使能GPIO特定引脚的中断,参数为引脚号,中断服务函数名称,传递给服务函数的实参。GPIO4,5都可以触发中断。
gpio_isr_handler_remove()函数作用则正相反,用来移除中断。该程序中最后两个GPIO中断函数可以注释掉,实际效果一样,只是为了熟悉函数作用。

主循环中,每隔一秒控制引脚电平反转输出。

串口打印信息

在这里插入图片描述当遇到上升沿时,GPIO4,5触发中断,都通过中断服务函数发送消息至队列中,任务函数读取后打印信息。遇到下降沿时,只有4触发中断,因此只有GPIO4打印信息。

调试过程中遇到的问题

在这里插入图片描述

用eclipse编译下载过程中,出现了如图片所示错误。

解决办法

使用msys32编译环境,进入到项目文件GPIO中,利用make clean指令清除掉工程之前的obj文件,删除后再次用eclipse build即可。

未解决疑问点

程序while(1)死循环中,先将GPIO4拉高,在拉高GPIO5,由此,因该GPIO4对应的消息先进入队列,由于消息队列具有先进先出的特性,串口应该先打印的GPIO4的信息。但遇到上升沿时总是先打印GPIO5信息。前后相悖。

以上皆为本人个人观点,希望路过大佬批评指正,也希望大佬能解决我的困惑。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值