ESP32-IDF 02-6 外设-GPIO

Posted Ciaran-byte

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP32-IDF 02-6 外设-GPIO相关的知识,希望对你有一定的参考价值。

GPIO

1. 原理层面

在这里插入图片描述

  每个引脚的输入和输出特性都是由IO_MUX和RTC_IO_MUX决定的。

  输出时,外设通过MUX与pin pad进行绑定,即可输出

  输入时,pin Pad设置好外设引脚为输入状态,并且设置好哪个外设接受这个信号即可。

  配置上,GPIO可以设置为上下拉,可以设置方向

  功能上GPIO可以与外设绑定,可以设置中断,也可以与低功耗进行绑定

2. 编程层面

2.1 GPIO输出

   esp32的GPIO可以通过函数的方法进行配置,也可以通过GPIO结构体的方法进行配置。使用GPIO结构体的话,适合连续配置。

2.1.1 通过结构体进行配置



#include "driver/gpio.h"


void setup() {
//gpio配置结构体
	gpio_config_t gpio;
	gpio.intr_type = GPIO_INTR_DISABLE;  //禁止中断
	gpio.mode = GPIO_MODE_OUTPUT;        //设置为输出模式
	gpio.pin_bit_mask = (1ULL << GPIO_NUM_23); //需要使用的引脚置位
	gpio.pull_down_en = GPIO_PULLDOWN_DISABLE;  //不下拉,因为这里是输出
	gpio.pull_up_en = GPIO_PULLUP_DISABLE;  //不上拉,因为这里是输出

	gpio_config(&gpio); //配置
	
}

// the loop function runs over and over again until power down or reset
void loop() {
	
	gpio_set_level(GPIO_NUM_23, 1);  //输出高电平
	delay(1000);

}


2.1.2 通过函数进行配置



#include "driver/gpio.h"


void setup() {
	gpio_pad_select_gpio(GPIO_NUM_23);   //选择gpio引脚
	gpio_set_direction(GPIO_NUM_23, GPIO_MODE_OUTPUT); //设置功能模式
	gpio_set_level(GPIO_NUM_23, 1);  //设置gpio输出为高
	
}

// the loop function runs over and over again until power down or reset
void loop() {
	


}



2.2 GPIO输入

2.2.1 轮询方式

  这里以按键输入检测为例,进行基于轮询的gpio输入实验。通过gpio_4进行检测输入。并且gpio_2连接了led,用于指示按键输入情况



#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"






void setup() {
	
	
	gpio_pad_select_gpio(GPIO_NUM_4);  //选择gpio
	gpio_set_direction(GPIO_NUM_4, GPIO_MODE_INPUT); //设置工作模式
	gpio_set_pull_mode(GPIO_NUM_4, GPIO_PULLUP_ONLY); //设置上拉输入

	gpio_pad_select_gpio(GPIO_NUM_2);
	gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT);
	
	uint32_t tag = 1;
	while (1)
	{
		if (gpio_get_level(GPIO_NUM_4) == 0)
		{
			delayMicroseconds(100);
			if (gpio_get_level(GPIO_NUM_4) == 0)
			{
				gpio_set_level(GPIO_NUM_2, tag);
				tag = !tag;

				while (gpio_get_level(GPIO_NUM_4) == 0);
			}

		}
	}

	
	
}

// the loop function runs over and over again until power down or reset
void loop() {
	




}



2.2.2 中断方式

  这里以按键输入检测为例,进行基于中断的gpio输入实验。通过gpio_4进行检测输入。并且gpio_2连接了led,用于指示按键输入情况

  


#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"


//中断服务函数
static void IRAM_ATTR gpio_isr_handler(void* arg)
{
	static uint32_t ison = 1;
	gpio_set_level(GPIO_NUM_2, ison);
	ison = !ison;
}



void setup() {
	
	//接受中断的引脚
	//设置gpio上拉输入
	gpio_pad_select_gpio(GPIO_NUM_4);
	gpio_set_direction(GPIO_NUM_4, GPIO_MODE_INPUT);
	gpio_pullup_en(GPIO_NUM_4);
	gpio_set_pull_mode(GPIO_NUM_4, GPIO_PULLUP_ONLY);


	//设置中断
	gpio_set_intr_type(GPIO_NUM_4, GPIO_INTR_NEGEDGE);//设置中断类型
	gpio_install_isr_service(0); //给单个引脚注册边沿检测中断,而不是全部引脚。0表示会默认分配中断优先级1或2或3
	gpio_isr_handler_add(GPIO_NUM_4, gpio_isr_handler,(void*)GPIO_NUM_4);
	gpio_intr_enable(GPIO_NUM_4); //使能中断



	//led
	gpio_pad_select_gpio(GPIO_NUM_2);
	gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT);
	
	
}

// the loop function runs over and over again until power down or reset
void loop() {
	




}


3. GPIO配置总结

  • GPIO有结构体配置法和库函数配置法两种,结构体配置法适合多个引脚需要同时配置的时候。而库函数配置更适合配置单个引脚。
  • 中断函数前面要加IRAM_ATTR标志符

以上是关于ESP32-IDF 02-6 外设-GPIO的主要内容,如果未能解决你的问题,请参考以下文章

ESP32-IDF02-3 外设-定时器

ESP32-IDF 02-4 外设-SPI

ESP32-IDF02-2 外设-触摸传感器

ESP8266 SDK开发: 外设篇-GPIO中断检测

ESP8266 LUA脚本语言开发: 外设篇-GPIO输入检测

ESP8266 LUA脚本语言开发: 外设篇-GPIO输出高低电平