文章目录[隐藏]
本文章 来自原创专栏《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, eachbit
maps to a GPIOmode gpio_mode_t GPIO mode : set input
/output
modepull_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 18
和GPUIO 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_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_ARG GPIO 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
(orinput 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不需要) |
版权声明:本文为CSDN博主「Augtons正(单片机)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_50064262/article/details/115189865
暂无评论