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_maskuint64_tGPIO pin : set with bit mask, each bit maps to a GPIO
modegpio_mode_tGPIO mode : set input/output mode
pull_up_engpio_pullup_tGPIO pull-up,表示是否启用内部上拉电阻
前提是已配置上拉电阻,详见本文的第二节:GPIO内部上、下拉电阻配置
pull_down_engpio_pulldown_tGPIO pull-down表示是否启用内部下拉电阻
前提是已配置下拉电阻(同上)
intr_typegpio_int_type_tGPIO 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_ARGGPIO error

3、参数值

[类型] 名称意义
[gpio_num_t] gpio_numwhich GPIO?(详见 gpio_num_t)
[gpio_mode_t] modeGPIO 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_ARGGPIO error

3、参数值

[类型] 名称意义
[gpio_num_t] gpio_numwhich 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_numwhich 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不需要)
<think>好的,我需要帮助用户找到关于ESP32使用ESP-IDF框架的教学资料。首先,我应该回顾用户提供的引用内容,看看有没有相关的信息。用户提到了三个引用,其中引用[1]和引用[2]似乎涉及ESP-IDF和Micropython的教程。引用[1]提到了ESP32的Micropython和ESP-IDF双线教程,特别是关于WiFi的示例代码。引用[2]是ESP32-IDF开发的基础教程,适合入门。引用[3]则是关于在ESP32C6上使用ESP-IDF驱动ST7789V屏幕时遇到的代码错误,可能与硬件支持有关。 接下来,我需要根据这些引用内容构建回答。首先,应该推荐用户参考引用[2]的基础教程,因为它明确提到了入门学习ESP32-IDF的旅程,适合新手。然后,引用[1]中的WiFi示例代码可能对需要网络功能的用户有帮助。另外,虽然引用[3]涉及硬件驱动问题,但用户可能也需要了解不同型号的ESP32ESP-IDF中的支持情况,特别是如果用户使用ESP32C6的话。 然后,我需要按照用户的格式要求组织回答。用户要求结构清晰,分步骤说明,并且生成相关问题。同时,必须使用中文,数学公式用$...$,独立公式用$$...$$,虽然当前问题可能不涉及数学公式,但需要注意其他格式要求,如代码块和引用标识。 此外,用户提到要生成相关问题,我需要根据ESP-IDF教程的常见学习路径来设计问题,例如开发环境搭建、项目结构、调试方法、与外设的交互、多任务处理、OTA升级等。同时,引用中的内容可以引导相关问题,比如WiFi应用、硬件驱动问题等。 需要确保所有引用的地方正确标注,比如在提到基础教程时添加[^2],在WiFi部分添加[^1],在硬件驱动部分添加[^3]。同时,代码示例需要符合用户提供的格式,使用三个反引号包围,并注明语言类型,如c或python。 最后,要检查是否符合用户的所有系统级指令,特别是格式和引用部分是否正确,避免使用任何Markdown格式,除了代码块和引用标识。确保回答真实可靠,基于提供的引用内容,并且结构清晰,帮助用户逐步解决问题。</think>### ESP32 使用 ESP-IDF 开发教程分步说明 #### 1. 开发环境搭建 ESP-IDF 是乐鑫官方为 ESP32 提供的开发框架,支持 FreeRTOS 和多任务开发。建议通过以下步骤搭建环境: - **安装工具链**:根据操作系统下载 [ESP-IDF 工具安装器](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/get-started/),支持 Windows、Linux、macOS。 - **配置 VS Code 插件**:安装官方 ESP-IDF 扩展,可直接管理工程和调试。 #### 2. 创建第个项目 通过命令行或 VS Code 插件初始化项目模板: ```bash idf.py create-project my_first_project ``` 项目目录结构包含: - `main/`:主代码和 CMakeLists.txt - `sdkconfig`:配置参数文件 - `components/`:自定义组件(可选) #### 3. 基础代码示例(WiFi 连接) 以下是引用[1]中的 WiFi 示例简化代码(`main/main.c`): ```c #include "esp_wifi.h" #include "nvs_flash.h" void app_main() { nvs_flash_init(); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&cfg); esp_wifi_set_mode(WIFI_MODE_STA); // 配置 SSID 和密码后启动 esp_wifi_start(); } ``` #### 4. 关键学习路径 - **FreeRTOS 集成**:ESP-IDF 深度整合 FreeRTOS,需掌握任务创建、队列、信号量。 - **外设驱动**:如 GPIO、SPI、I2C 的 API 调用(注意硬件差异,如引用[3]中 ESP32C6 的 SPI 配置问题)。 - **调试工具**:使用 `idf.py monitor` 查看串口日志,结合 JTAG 进行硬件调试。 #### 5. 官方资源推荐 - **文档**:[ESP-IDF 编程指南](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/) - **示例库**:GitHub 上 `esp-idf/examples` 包含 200+ 示例,涵盖网络、存储、传感器等。 ```c // 示例:Blink LED(GPIO 控制) #include "driver/gpio.h" #define LED_PIN 2 void app_main() { gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT); while (1) { gpio_set_level(LED_PIN, 1); vTaskDelay(1000 / portTICK_PERIOD_MS); gpio_set_level(LED_PIN, 0); vTaskDelay(1000 / portTICK_PERIOD_MS); } } ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Augtons正(单片机)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值