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)
};c2、单独配置 也可以使用函数单独配置管脚参数,如下所示:
// 设置输入输出模式
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);c3、中断配置 可以在管脚配置中统一配置,也可以使用函数单独配置,第一步就是使能外部中断和配置中断触发方式。
gpio_config_t ioConfig = {
.intr_type = GPIO_INTR_NEGEDGE, //本例中设置为下降沿触发中断
.pull_down_en = 1, //要触发下降沿中断,所以要允许下拉
};
gpio_config(&ioConfig);cgpio_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