0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

[esp32教程]2、按键中断

板凳说 来源:板凳说 作者:板凳说 2023-05-05 09:04 次阅读

esp32的按键中断

0、前期准备

1、参考上一篇文章搭建好esp32环境

2、准备好一块esp32开发开发板(本作者使用了esp32c3作为开发平台)

1、知识储备

消息队列:在RTOS中,常用于任务之间或者是中断与任务之间的数据交换。具有特点是:先入入先出,类似我们平时排队进园区旅游,排在前面总是首先进入里面。
FreeRTOS中,消息队列用的函数有以下几个:
  • 用于创建消息队列

​ xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize )

参数如下:

uxQueueLength:队列最大长度
uxItemSize:数据体的数据大小,注意:队列中每个数据体的大小必须要保存一致
  • 用于读取消息队列

​ portBASE_TYPE xQueueReceive( xQueueHandle xQueue, void *pvBuffer, portTickType xTicksToWait )

​ 参数如下:

pxQueue:队列句柄,其值为xQueueCreate放回值,类型为:xQueueHandle
    pvBuffer:数据指针用于指向出队的数据地址
    xTicksToWait:任务中断并等待队列中可用空间的最大时间。若设置为0且队列为空时,调用立刻返回。如果要设置具体时间可以用(时间/portTICK_RATE_MS)公式来获取具体时间。又若设置为( portMAX_DELAY) 将导致任务阻塞
  • 用于写入消息队列

​ portBASE_TYPE xQueueSendFromISR(xQueueHandle pxQueue,const void *pvItemToQueue,portBASE_TYPE *pxHigherPriorityTaskWoken);

​ 参数如下:

pxQueue:队列句柄,其值为xQueueCreate放回值,类型为:xQueueHandle
    pvItemToQueue:要存入队列的数据的指针,数据类型要和xQueueCreate初始化的数据类型一样
    pxHigherPriorityTaskWoken:如果数据入队使任务解锁,并且解锁的任务的优先级高于当前运行任务的优先级xQueueSendFromISR将设置*pxHigherPriorityTaskWokenpdTRUE 。如果xQueueSendFromISR()设置这个值到 pdTRUE,那么在中断退出的时候将会进行任务切换。
ESP32中断

​ ESP32-C3芯片具有硬件滤波器,可去除输入GPIO中不需要的毛刺脉冲,这有助于减少中断的错误触发。

中断函数介绍

  • 中断服务注册函数

​ esp_err_t gpio_install_isr_service( int intr_alloc_flags )

​ 函数说明

​ 使用该函数,ISR服务将提供全局GPIO的ISR,并通过gpio_isr_handler_add()函数注册各个引脚处理程序

​ 参数如下:

intr_alloc_flags:中断的类型
  • GPIO中断注册函数

​ esp_err_t gpio_isr_handler_add(gpio_num_t gpio_num,gpio_isr_t isr_handler,void * args )

​ 函数说明

​ 用于为相应的GPIO引脚添加中断处理函数

​ 参数如下:

gpio_num:GPIO引脚号
    isr_handler:中断处理函数名
    args:往中断函数传递的参数

2、新建工程

idf.py create-project project_led # 新建工程
cd project_key
idf.py set-target esp32c3 # 设置工程使用的芯片

3、查看原理图确定按键控制引脚

key.png

经查阅原理图,确定led的引脚为gpio_19,读者需根据自身开发板来修改引脚

4、编写程序

#include 

#include 
#include 
#include 

#include 

#define KEY_PIN GPIO_NUM_9
static QueueHandle_t key_queue = NULL;

static void IRAM_ATTR key_isr_handler(void *arg)
{
    uint32_t gpio_num = (uint32_t)arg;
    xQueueSendFromISR(key_queue, &gpio_num, NULL);
}

void app_main(void)
{
    uint32_t gpio_num;
    //配置模式 输入 下降沿触发中断
    gpio_config_t cfg = {
        .mode = GPIO_MODE_INPUT,
        .pin_bit_mask = 1ULL << KEY_PIN,
        .pull_up_en = GPIO_PULLUP_DISABLE,
        .pull_down_en = GPIO_PULLUP_DISABLE,
        .intr_type = GPIO_INTR_POSEDGE,
    };

    gpio_config(&cfg);
    //创建消息队列、注册中断函数
    key_queue = xQueueCreate(10, sizeof(uint32_t));
    gpio_install_isr_service(0);
    gpio_isr_handler_add(KEY_PIN, key_isr_handler, (void *)KEY_PIN);

    while (pdTRUE)
    {
        //
        if (xQueueReceive(key_queue, &gpio_num, portMAX_DELAY))
        {
            printf("key is down\\\\\\\\n");
        }
    }
    
}

5、编译下载

#编译
idf.py build
#烧录以及查看日志,使用ctrl+] 可以退出监视窗口
idf.py -p /dev/ttyUSB0 flash monitor

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FreeRTOS
    +关注

    关注

    12

    文章

    483

    浏览量

    61992
  • 按键中断
    +关注

    关注

    0

    文章

    15

    浏览量

    6438
  • ESP32
    +关注

    关注

    17

    文章

    955

    浏览量

    17069
收藏 人收藏

    评论

    相关推荐

    ESP32-C2 ESP8684芯片AT固件使用

    ESP32-C2 ESP8684芯片AT固件使用
    的头像 发表于 07-27 13:48 3563次阅读
    <b class='flag-5'>ESP32-C2</b> <b class='flag-5'>ESP</b>8684芯片AT固件使用

    ESP32模组的主要特性

    ● ESP32-WROOM-32D ● ESP32-WROOM-32U ● ESP32-SOLO-1 模组 ● ESP32-WROVER ● ES
    发表于 11-04 14:54 3934次阅读

    ESP32开发套件 ESP32-DevKitC

    ,具备丰富的外设和优化的引脚布局,助力用户快速实现产品开发,它有4MB Flash,有I/O,USB以及按键、LED   支持 Wi-Fi 蓝牙连接 ESP32-DevKitC 是一款基于 ESP32
    的头像 发表于 01-06 16:55 8312次阅读

    ESP32 开发之旅② Arduino For ESP32说明

    文章目录1. Arduino Core For ESP32是什么?2.Arduino core for ESP32库3.与ESP8266库类比3.1 WiFi ——
    发表于 11-13 19:51 33次下载
    <b class='flag-5'>ESP32</b> 开发之旅② Arduino For <b class='flag-5'>ESP32</b>说明

    ESP32ESP-IDF 教学(三)——通用硬件定时器(Timer)

    ESP32ESP-IDF 学习笔记(三)【通用硬件定时器(Timer)】文章目录ESP32ESP-IDF 学习笔记(三)【通用硬件定时器(Timer)】通用硬件定时器(Ti
    发表于 11-26 11:36 37次下载
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP</b>-IDF 教学(三)——通用硬件定时器(Timer)

    ESP32ESP-IDF 教学(九)—— 串口通信(UART)

    使用简介二、使用 UART 收发数据1、设置 UART 参数① 单步法(结构体法)② 分步法2、分配引脚,安装驱动二、使用 UART 事件三、自定义 UART 中断一、ESP32 的 UART 概览
    发表于 11-26 13:21 43次下载
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP</b>-IDF 教学(九)—— 串口通信(UART)

    [ESP32]学习笔记02

    [ESP32学习笔记02]使用ViusalStudio2017开发ESP32按键输入检测前言一、安装Visual Studio 2017二、配置开发环境1.安装ViusalGDB2.
    发表于 12-03 17:36 23次下载
    [<b class='flag-5'>ESP32</b>]学习笔记02

    esp32学习之按键检测gpio中断

    esp32学习之gpio中断前言流程选定gpiogpio配置设置回调函数注册中断处理程序前言最近在做一个按键检测,按键检测有两种方法,一种是
    发表于 12-04 16:21 14次下载
    <b class='flag-5'>esp32</b>学习之<b class='flag-5'>按键</b>检测gpio<b class='flag-5'>中断</b>

    ESP32系列芯片的规格

    ESP32是一款2.4GHz Wi-Fi和蓝牙组合芯片,采用TSMC超低功耗40nm设计技术它旨在实现最佳功率和射频性能,显示出鲁棒性、多功能性和灵活性在各种应用和电源场景中的可靠性。ESP32系列芯片包括ESP32-D0WDQ
    发表于 04-25 16:21 7次下载

    ESP32 S2 SOLO/ESP32 S2 SOLO U技术规格书

    电子发烧友网站提供《ESP32 S2 SOLO/ESP32 S2 SOLO U技术规格书.pdf》资料免费下载
    发表于 09-23 14:57 0次下载
    <b class='flag-5'>ESP32</b> S<b class='flag-5'>2</b> SOLO/<b class='flag-5'>ESP32</b> S<b class='flag-5'>2</b> SOLO U技术规格书

    ESP32 S2 WROVER/ESP32 S2 WROVER I技术规格书

    电子发烧友网站提供《ESP32 S2 WROVER/ESP32 S2 WROVER I技术规格书.pdf》资料免费下载
    发表于 09-23 11:48 2次下载
    <b class='flag-5'>ESP32</b> S<b class='flag-5'>2</b> WROVER/<b class='flag-5'>ESP32</b> S<b class='flag-5'>2</b> WROVER I技术规格书

    ESP32 S2 WROOM/ESP32 S2 WROOM I技术规格书

    电子发烧友网站提供《ESP32 S2 WROOM/ESP32 S2 WROOM I技术规格书.pdf》资料免费下载
    发表于 09-23 11:31 4次下载
    <b class='flag-5'>ESP32</b> S<b class='flag-5'>2</b> WROOM/<b class='flag-5'>ESP32</b> S<b class='flag-5'>2</b> WROOM I技术规格书

    ESP32C2如何使用AT固件

    ESP32C2如何使用AT固件
    的头像 发表于 12-12 13:58 3015次阅读
    <b class='flag-5'>ESP32C2</b>如何使用AT固件

    ESP32-C2 8684 AT固件

    ESP32-C2模组 ESP8684芯片 智能家居设备开发模组
    的头像 发表于 07-03 13:41 813次阅读
    <b class='flag-5'>ESP32-C2</b>  8684  AT固件

    如何使用MicroPython和ESP32来编写按键程序?

    首先,我们需要将LED灯、电阻和开关、ESP32连接起来。
    的头像 发表于 11-08 12:35 1718次阅读
    如何使用MicroPython和<b class='flag-5'>ESP32</b>来编写<b class='flag-5'>按键</b>程序?