You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32-C3 Arduino环境下‘gpio_new_pin_glitch_filter’未声明报错求助

在Arduino ESP32-C3中使用硬件毛刺滤波器

你遇到的报错是因为Arduino ESP32核心未将ESP-IDF的gpio_new_pin_glitch_filter函数封装到上层Arduino API中,但Arduino ESP32本质基于ESP-IDF构建,你可以直接调用底层ESP-IDF的GPIO驱动API启用硬件毛刺滤波功能,具体实现如下:

前提说明

Arduino ESP32核心版本对应不同的ESP-IDF版本,硬件滤波API存在差异:

  • Arduino-ESP32 2.x及以上 → 对应ESP-IDF v5.x,使用新API
  • Arduino-ESP32 1.x版本 → 对应ESP-IDF v4.x,使用旧API

情况1:Arduino-ESP32 2.x+(ESP-IDF v5.x)

直接引入IDF GPIO驱动头文件,调用新API实现:

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

#define INPUT_PIN GPIO_NUM_0  // 替换为你需要的引脚

void setup() {
  Serial.begin(115200);
  
  // 初始化GPIO为上拉输入(可根据需求调整)
  gpio_config_t io_conf = {};
  io_conf.pin_bit_mask = (1ULL << INPUT_PIN);
  io_conf.mode = GPIO_MODE_INPUT;
  io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
  io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
  io_conf.intr_type = GPIO_INTR_NEGEDGE;  // 可选:设置中断触发方式
  gpio_config(&io_conf);

  // 配置硬件毛刺滤波器参数
  gpio_glitch_filter_handle_t filter = NULL;
  gpio_glitch_filter_config_t filter_conf = {
    .clk_src = GPIO_GLITCH_FILTER_CLK_SRC_DEFAULT,
    .filter_width_ns = 20000,  // 滤波宽度20us,可根据抖动情况调整
    .flags = {.invert_filtered_signal = false}
  };

  // 创建并启用滤波器
  esp_err_t err = gpio_new_pin_glitch_filter(INPUT_PIN, &filter_conf, &filter);
  if (err != ESP_OK) {
    Serial.printf("创建滤波器失败: %s\n", esp_err_to_name(err));
    return;
  }
  gpio_glitch_filter_enable(filter);
  Serial.println("硬件毛刺滤波器已启用");

  // 可选:设置为深度睡眠唤醒源
  // gpio_wakeup_enable(INPUT_PIN, GPIO_INTR_NEGEDGE);
  // esp_deep_sleep_enable_gpio_wakeup();
}

void loop() {
  // 读取滤波后的引脚状态
  int pin_state = gpio_get_level(INPUT_PIN);
  Serial.printf("引脚状态: %d\n", pin_state);
  delay(100);
}

情况2:Arduino-ESP32 1.x(ESP-IDF v4.x)

使用旧版gpio_install_glitch_filter函数实现:

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

#define INPUT_PIN GPIO_NUM_0

void setup() {
  Serial.begin(115200);
  
  // 初始化GPIO
  gpio_config_t io_conf = {};
  io_conf.pin_bit_mask = (1ULL << INPUT_PIN);
  io_conf.mode = GPIO_MODE_INPUT;
  io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
  io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
  io_conf.intr_type = GPIO_INTR_NEGEDGE;
  gpio_config(&io_conf);

  // 配置滤波周期(APB时钟默认80MHz,1周期=12.5ns,1600周期对应20us)
  gpio_glitch_filter_config_t filter_conf = {
    .filter_period = 1600,
    .flags = {.enable = true}
  };

  // 安装并启用滤波器
  esp_err_t err = gpio_install_glitch_filter(INPUT_PIN, &filter_conf);
  if (err != ESP_OK) {
    Serial.printf("安装滤波器失败: %s\n", esp_err_to_name(err));
    return;
  }
  Serial.println("硬件毛刺滤波器已启用");
}

void loop() {
  int pin_state = digitalRead(INPUT_PIN);
  Serial.printf("引脚状态: %d\n", pin_state);
  delay(100);
}

注意事项

  • 硬件滤波无需占用CPU资源,且在中断、深度睡眠唤醒场景下依然有效(软件滤波无法覆盖这类场景)。
  • 滤波宽度/周期需根据物理开关的抖动特性调整:过短无法有效消抖,过长可能过滤有效信号。
  • ESP32-C3的所有GPIO引脚(GPIO0~GPIO17)均支持硬件毛刺滤波功能。

内容的提问来源于stack exchange,提问作者JBFUK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:09:56