ESP32 之 ESP-IDF 教学(一)——GPIO(1) GPIO配置及其简单操作

本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!

↓↓↓通过下方对话框进入专栏目录页↓↓↓
CSDN 请求进入目录       _ O x

是否进入ESP32教学导航(基于ESP-IDF)?

       确定


一、GPIO配置及简单操作

0、引用头文件 #include "driver/gpio.h"

1、方式1 —— 整体法

通过调用gpio_config(const gpio_config_t *pGPIOConfig)函数配置GPIO

(1) 函数gpio_config简介

1、功能简介
GPIO common configuration.
(GPIO通用配置)
Configure GPIO’s Mode,pull-up,PullDown,IntrType
(配置GPIO的模式上拉下拉中断触发类型
2、返回值

返回值 意义
ESP_OK 配置成功
ESP_ERR_INVALID_ARG 参数错误

3、参数值

  • pGPIOConfig (结构体 gpio_config_t 的指针)

(2) 结构体简介

结构体gpio_config_t简介, 在头文件"gpio_types.h"中,但同时包含在gpio.h中,无需再次引用此头文件。

公共成员 类型 意义
pin_bit_mask uint64_t GPIO pin : set with bit mask, each bit maps to a GPIO
mode gpio_mode_t GPIO mode : set input/output mode
pull_up_en gpio_pullup_t GPIO pull-up,表示是否启用内部上拉电阻
前提是已配置上拉电阻,详见本文的第二节:GPIO内部上、下拉电阻配置
pull_down_en gpio_pulldown_t GPIO pull-down表示是否启用内部下拉电阻
前提是已配置下拉电阻(同上)
intr_type gpio_int_type_t GPIO interrupt type

例如,配置GPIO 18GPUIO 19为输出, 其他属性省略。

#include "driver/gpio.h"

void app_main(){
	gpio_config_t ioConfig = {
		.pin_bit_mask = (1ull << 18)|(1ull << 19),
//等价于	.pin_bit_mask = 0x60000
		.mode = GPIO_MODE_OUTPUT,
	//	.	....省
	//  .   ....略
	//	.	....号
	}
	//传入gpio_config_t指针
	gpio_config(&ioConfig);
}

重点:pin_bit_mask
他是一个uint64_t类型的变量,有64个二进制位,其中部分位对应这个配置对哪些 GPIO 生效。例如:

// 表示此配置对 GPIO2生效,因为这个64位数的第2位(从零开始)为1
pin_bit_mask = 0b0100

// 表示此配置对 GPIO0 和 GPIO5 生效,因为第0位和第5位为1
pin_bit_mask = 0b100001

// 表示此配置对 GPIO16 和 GPIO 18 生效,采用位运算
pin_bit_mask = (1ull << 16) | (1ull << 18)

2、方式2 —— 单个法

此方法涉及到的函数比较多,功能与结构体法基本一致,只不过是把结构体法拆成了函数。由于函数较多,在此不一一列举,未列举到的可到官方文档查阅

1. 设置GPIO方向(输入 或者 输出

通过调用函数gpio_set_direction(gpio_num_tgpio_num, gpio_mode_tmode)

(1)函数gpio_set_direction简介
1、功能简介
GPIO set direction.

Configure GPIO direction,such as output_only,input_only,output_and_input
2、返回值

返回值 意义
ESP_OK 配置成功
ESP_ERR_INVALID_ARG GPIO error

3、参数值

[类型] 名称 意义
[gpio_num_t] gpio_num which GPIO?(详见 gpio_num_t)
[gpio_mode_t] mode GPIO direction(详见 gpio_mode_t)

2. 配置为输出时,设置某个GPIO的 输出电平

调用下文代码框中的函数gpio_set_level

#include "driver/gpio.h"
/**
 *返回值	ESP_OK 						成功
 *		ESP_ERR_INVALID_ARG GPIO 	number error
 */
gpio_set_level(gpio_num_t gpio_num, uint32_t level)

(2)函数gpio_set_level简介
1、功能简介
GPIO set output level.
2、返回值

返回值 意义
ESP_OK 配置成功
ESP_ERR_INVALID_ARG GPIO error

3、参数值

[类型] 名称 意义
[gpio_num_t] gpio_num which GPIO (详见 gpio_num_t)
[uint32_t] level 电平 Output level. (0: low ; 1: high)

例如:将GPIO16配置为输出,并输出高电平

#include "driver/gpio.h"
//GPIO_NUM_16		结构体gpio_num_t中的枚举值
gpio_set_direction(GPIO_NUM_16, GPIO_MODE_OUTPUT);//写这个或下一个
gpio_set_direction(16, GPIO_MODE_OUTPUT);//或这个
//1为高电平,0为低电平
gpio_set_level(GPIO_NUM_16, 1);

3. 在配置为输入模式时,检测GPIO的电平。

(2)函数gpio_get_level简介
1、功能简介
GPIO get input level.

[注意] If the pad is not configured for input (or input and output) the returned value is always 0.

2、返回值

返回值 意义
[int] 0 低电平
[int] 1 高电平

3、参数值

[类型] 名称 意义
[gpio_num_t] gpio_num which GPIO (详见 gpio_num_t)

例如:将GPIO配置为输入,当GPIO16电平改变时打印当前的电平。

#include "driver/gpio.h"
#include <stdio.h>

void app_main(){
	int mLevel = 0;
	gpio_set_direction(16, GPIO_MODE_INPUT);
	gpio_get_level(16);
	while (1){
		if (mLevel != (temp = gpio_get_level(16))){
			mLevel = temp;
			if (temp){
				printf("HIGH Level\n");
			}else {
				printf("LOW Level\n");
			}
		}
	}
}

4、单个法下配置GPIO内部上下拉电阻

使用函数
gpio_set_pull_mode()
gpio_pullup_en()
gpio_pullup_dis()
gpio_pulldown_en()
gpio_pulldown_dis()
等函数用于配置GPIO的上拉电阻,以及启用上下拉电阻

3、恢复 GPIO 默认值

调用函数gpio_reset_pin()

二、GPIO 内部上、下拉电阻配置

调用以下函数选择GPIO上下拉电阻

函数 gpio_set_pull_mode()
函数原型 esp_err_t gpio_set_pull_mode(gpio_num_tgpio_num, gpio_pull_mode_tpull)
返回值 ESP_OK Success
ESP_ERR_INVALID_ARG : Parameter error
参数 gpio_num 配置哪个 GPIO
pull想选择哪种上下拉方式:
GPIO_PULLUP_ONLY —— 仅上拉
GPIO_PULLDOWN_ONLY —— 仅下拉
GPIO_PULLUP_PULLDOWN —— 全部启用
GPIO_FLOATING —— 悬空这个 GPIO
注意 只有同时支持输入和输出的引脚集成了上拉和下拉电阻。(仅输入的GPIO 34 至 GPIO 39不需要)

版权声明:本文为CSDN博主「Augtons正(单片机)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_50064262/article/details/115189865

生成海报
点赞 0

Augtons正(单片机)

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

CH579(M0内核)中断向量表偏移处理

通常情况下,为了产品后续的升级,程序都会分为两部分BootloaderApp,因为有两个程序,所以需要对中断向量表进行处理,否则,当程序已经跳转到app中运行,当中断产生的时候,响应函数仍然是Bootloader的中断函数,而不是app的 在S

【导航】ESP32 教学篇目录 【快速跳转】

本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》 讲解如何使用 ESP-IDF 构建 ESP32 的WIFI及连接的程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨&#xf

ESP8266 无限重启踩坑

最近做了一个电子墨水屏万年历,在移植屏幕代码时遇到了esp8266无限软复位的问题,如果你的串口打印是以下图片所示,那么恭喜你问题解决了。 造成软复位的原因是因为,程序里有死循环&#xf