上海知名建站公司,电子商务网站开发技术路线,国外做问卷网站好,东莞市手机网站建设多少钱文章目录 前言一、按键的使用1.1 按键的简介1.2 读取按键的高低电平1.3 读取按键具体代码 二、中断二、EXIT外部中断2.1 EXIT外部中断简介2.2 外部中断基础知识2.3 设置外部中断注册外部中断服务函数设置触发方式添加中断函数 2.4 示例代码 总结 前言
在嵌入式系统开发中… 文章目录 前言一、按键的使用1.1 按键的简介1.2 读取按键的高低电平1.3 读取按键具体代码 二、中断二、EXIT外部中断2.1 EXIT外部中断简介2.2 外部中断基础知识2.3 设置外部中断注册外部中断服务函数设置触发方式添加中断函数 2.4 示例代码 总结 前言
在嵌入式系统开发中按键输入是与用户进行交互的重要方式之一。在 ESP32 开发中我们可以利用外部中断External Interrupt简称 EXTI来实现对按键的响应。外部中断使得我们可以在按键被按下时立即响应而不需要轮询输入状态这样可以提高系统的响应速度和效率。本文将介绍如何在 ESP32 IDFEspressif IoT Development Framework中实现按键输入与外部中断的结合以实现对按键的快速响应和处理。 一、按键的使用
1.1 按键的简介
几乎每个开发板都会板载有独立按键因为按键用处很多。常态下独立按键是断开的按下的时候才闭合。每个独立按键会单独占用一个 IO 口通过 IO 口的高低电平判断按键的状态。但是按键在闭合和断开的时候都存在抖动现象即按键在闭合时不会马上就稳定的连接断开时也不会马上断开。这是机械触点无法避免。独立按键抖动波形图如下 图中的按下抖动和释放抖动的时间一般为 5~10ms如果在抖动阶段采样其不稳定状态可能出现一次按键动作被认为是多次按下的情况。为了避免抖动可能带来的误操作我们要做的措施就是给按键消抖即采样稳定闭合阶段。消抖方法分为硬件消抖和软件消抖我们常用软件的方法消抖。 软件消抖方法很多我们例程中使用最简单的延时消抖。检测到按键按下后一般进行10ms 延时用于跳过抖动的时间段如果消抖效果不好可以调整这个 10ms 延时因为不同类型的按键抖动时间可能有偏差。待延时过后再检测按键状态如果没有按下那我们就判断这是抖动或者干扰造成的如果还是按下那么我们就认为这是按键真的按下了。对按键释放的判断同理。 硬件消抖利用 RC 电路的电容充放电特性来对抖动产生的电压毛刺进行平滑出来从而 实现消抖但是成本会更高一点本着能省则省的原则我们推荐使用软件消抖即可。
1.2 读取按键的高低电平
我们可以使用下面这个函数来读取按键的高低电平
int gpio_get_level(gpio_num_t gpio_num);参数为按键的对应引脚标号
1.3 读取按键具体代码
在使用按键的使用需要设置上拉或者下拉电阻需要根据实际原理图进行选择并且如果你需要读取按键的状态你需要设置引脚方向为输入模式
gpio_reset_pin(22);gpio_config_t key;
key.mode GPIO_MODE_INPUT;
key.pull_up_en GPIO_PULLUP_ENABLE;
key.pull_down_en GPIO_PULLDOWN_DISABLE;
key.pin_bit_mask (1ull 22);
key.intr_type GPIO_INTR_DISABLE;gpio_config(key);void key_scan()
{// gpio_pad_select_gpio(22);if(gpio_get_level(22) 0){vTaskDelay(10);if(gpio_get_level(22) 0)printf(Key pressed\n);}
}二、中断
二、EXIT外部中断
2.1 EXIT外部中断简介
外部中断External Interrupt是指来自于处理器外部的信号或事件可以中断处理器当前的执行流程跳转到相应的中断服务程序中执行。在嵌入式系统中外部中断通常用于处理与外部设备或外部事件相关的响应操作比如传感器的触发、按键的按下等。
当外部中断信号触发时处理器会立即停止当前的任务保存当前的执行环境比如程序计数器、寄存器状态等然后跳转到预先定义好的中断服务程序中执行相应的处理逻辑。一旦中断服务程序执行完成处理器会恢复之前的执行状态继续执行被中断的任务。
EXIT可能是指中断退出的意思即当中断服务程序执行完成后处理器退出中断状态恢复到之前的执行流程中。
2.2 外部中断基础知识
在数字电路和信号处理中上升沿和下降沿触发是指在信号的电压或电平变化时发生的事件。这些术语通常与时钟信号和触发器比如触发器、寄存器等的工作方式相关联。
上升沿触发当信号的电压或电平从低电平低电压变为高电平高电压时触发器或电路开始执行操作。简单来说上升沿触发意味着在信号的上升沿从低到高的过渡时刻上触发动作。
下降沿触发与上升沿相反当信号的电压或电平从高电平高电压变为低电平低电压时触发器或电路开始执行操作。换句话说下降沿触发意味着在信号的下降沿从高到低的过渡时刻上触发动作。
这些概念在数字电路中非常重要特别是在时序电路设计中。例如在时钟边沿触发的触发器中上升沿触发和下降沿触发可以决定何时执行数据的采样和传输
2.3 设置外部中断
注册外部中断服务函数
在 ESP32 IDF 中gpio_install_isr_service 函数用于安装 GPIO 中断服务。通过安装 GPIO 中断服务你可以注册 GPIO 中断处理程序以便在 GPIO 引脚状态发生变化时得到通知并执行相应的操作。
以下是 gpio_install_isr_service 函数的使用方法
#include driver/gpio.hvoid app_main() {// 初始化 GPIO 中断服务gpio_install_isr_service(0); // 参数 0 表示默认的 ESP_INTR_FLAG_DEFAULT// 在这里注册 GPIO 中断处理程序并进行其他操作
}在使用 gpio_install_isr_service 函数时你需要注意以下几点
在调用 gpio_install_isr_service 函数之前确保已经初始化了 GPIO 相关的硬件和驱动。
gpio_install_isr_service 函数接受一个参数用于指定中断服务的配置选项。一般情况下你可以传递 0 或者默认的 ESP_INTR_FLAG_DEFAULT 作为参数。
通常情况下gpio_install_isr_service 函数只需要在应用程序的启动时调用一次用于初始化 GPIO 中断服务。在后续的代码中你可以注册具体的 GPIO 中断处理程序并通过 gpio_isr_handler_add 函数将其与 GPIO 引脚关联起来。
通过使用 gpio_install_isr_service 函数你可以在 ESP32 应用程序中方便地管理和处理 GPIO 中断实现按键、传感器等外部事件的实时响应。
设置触发方式
在gpio_config_t结构体中有一个intr_type成员他用来设置gpio的中断触发方法的他是一个枚举他的定义如下
typedef enum {GPIO_INTR_DISABLE 0, /*! Disable GPIO interrupt */GPIO_INTR_POSEDGE 1, /*! GPIO interrupt type : rising edge */GPIO_INTR_NEGEDGE 2, /*! GPIO interrupt type : falling edge */GPIO_INTR_ANYEDGE 3, /*! GPIO interrupt type : both rising and falling edge */GPIO_INTR_LOW_LEVEL 4, /*! GPIO interrupt type : input low level trigger */GPIO_INTR_HIGH_LEVEL 5, /*! GPIO interrupt type : input high level trigger */GPIO_INTR_MAX,
} gpio_int_type_t;添加中断函数
我们可以使用下面这个函数来为某一个引脚添加中断回调函数
esp_err_t gpio_isr_handler_add(gpio_num_t gpio_num, gpio_isr_t isr_handler, void *args);参数1为对应的引脚标号 参数2为回调函数他的定义如下
typedef void (*gpio_isr_t)(void *);参数3为调用回调函数时传入的参数是什么如果没有填NULL即可
2.4 示例代码
void LED()
{gpio_reset_pin(1);gpio_pad_select_gpio(1);gpio_set_direction(1,GPIO_MODE_OUTPUT);
}void IRAM_ATTR Key_ISR(void *p)
{static bool count 0;count !count;gpio_set_level(1,count);
}gpio_reset_pin(22);gpio_config_t key;
key.mode GPIO_MODE_INPUT;
key.pull_up_en GPIO_PULLUP_ENABLE;
key.pull_down_en GPIO_PULLDOWN_DISABLE;
key.pin_bit_mask (1ull 22);
key.intr_type GPIO_INTR_POSEDGE;gpio_config(key);gpio_install_isr_service(0);LED();gpio_isr_handler_add(22,Key_ISR,NULL);IRAM_ATTR: 这里的 IRAM_ATTR 属性用于将中断处理函数存储在内部 RAM 中目的在于减少延迟 总结
通过本文的介绍我们了解了在 ESP32 IDF 中如何利用外部中断EXTI来实现对按键输入的快速响应。首先我们学习了如何配置 GPIO 并注册中断服务程序。然后我们通过编写中断服务程序来处理按键的触发事件并在其中进行相应的处理。通过这种方式我们可以实现对按键的即时响应提高系统的交互性和用户体验。在实际应用中我们可以根据需求对按键的功能进行扩展和定制从而实现更丰富和灵活的用户交互界面。