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

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

实验开发板及开发环境

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

程序分析

ESP32C3 加密 esp32 wroom32_ESP32C3 加密

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

ESP32C3 加密 esp32 wroom32_ESP32C3 加密_02


第一个函数为GPIO中断服务函数,参数为中断源引脚,服务函数内部将中断源引脚地址通过队列句柄发送给消息队列。

第二个函数为任务函数,通过句柄定位到的消息队列中有数据进入时立即将其读出,读出数据为中断源引脚,检测该引脚电平后连同信息一起打印到串口。

ESP32C3 加密 esp32 wroom32_上升沿_03


主函数程序中,首先配置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中断函数可以注释掉,实际效果一样,只是为了熟悉函数作用。

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

串口打印信息

ESP32C3 加密 esp32 wroom32_ESP32C3 加密_04

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

调试过程中遇到的问题

ESP32C3 加密 esp32 wroom32_嵌入式_05

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

解决办法

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

未解决疑问点

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

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