技术新思考

返回

02-GPIO控制

GPIO控制相关知识

ESP32开发的主流方式主要有arduino、microPython和ESP-IDF,一般来说功能快速验证可以使用arduino、microPython,大型项目一般是使用官方的ESP-IDF。 本知识库主要使用microPython和ESP-IDF来开发代码示例 GPIO中文意思是通用输入输出接口,可以设置输入输出模式,输入模式用于感知外部信号,输出模式用来控制外部设备。ESP32分很多种型号,比如ESP32-S3 芯片具有 45 个物理 GPIO 管脚(GPIO0 ~ GPIO21 和 GPIO26 ~ GPIO48)。 1、管脚配置 和STM32一样,要使用引脚就要先配置对应的管脚模式,ESP32中使用esp_err_t gpio_config(const gpio_config_t *pGPIOConfig)来配置管脚模式。 这里需要注意几点,返回的esp_err_t实际上就是一个int类型变量,0为成功,-1为失败。 这里的pin_bit_mask是一个uint64_t类型的变量,有64个二进制位,其中每一位对应这个配置对哪些 GPIO 生效

#include "driver/gpio.h"

void gpioInit(){
	gpio_config_t ioConfig = {
		.pin_bit_mask = (1ull << 2)|(1ull << 4),
		.mode = GPIO_MODE_OUTPUT,
		//	.	....省
		//  .   ....略
		//	.	....号
	};
	//传入gpio_config_t指针
	gpio_config(&ioConfig);
}
c

还有一个头文件gpio_num.h,包含gpio_num_t 枚举,可以改成如下形式

#include "driver/gpio.h"
#define LED GPIO_NUM_2

gpio_config_t ioConfig = {
	.pin_bit_mask = (1ull << LED)

};
c

2、单独配置 也可以使用函数单独配置管脚参数,如下所示:

// 设置输入输出模式
esp_err_t gpio_set_direction(gpio_num_tgpio_num, gpio_mode_tmode);
// 设置引脚电平
esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level);
// 获取电平
int gpio_get_level(gpio_num_t gpio_num);
// 设置上下拉模式
esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull_mode);
c

3、中断配置 可以在管脚配置中统一配置,也可以使用函数单独配置,第一步就是使能外部中断和配置中断触发方式。

gpio_config_t ioConfig = {
	.intr_type = GPIO_INTR_NEGEDGE,	//本例中设置为下降沿触发中断
	.pull_down_en = 1,				//要触发下降沿中断,所以要允许下拉
};
gpio_config(&ioConfig);
c
gpio_set_intr_type(2, GPIO_INTR_NEGEDGE);
c

第二步是安装中断服务,同时指定要为其添加中断处理函数的GPIO引脚。

gpio_install_isr_service(0); 
gpio_isr_handler_add(18, gpio_isr_handler, NULL);
c

最后一步是编写中断服务函数,需要创建一个静态的,带有IRAM_ATTR宏的函数作为中断服务程序 Handler。

// 声明一个用于处理GPIO中断的函数
static void IRAM_ATTR gpio_isr_handler(void* arg) {
    // 读取按钮状态并设置LED
    int button_state = gpio_get_level(BUTTON_GPIO);
    gpio_set_level(LED_GPIO, button_state == 0 ? 1 : 0);
}
c