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

    文章

    473

    浏览量

    61347
  • 按键中断
    +关注

    关注

    0

    文章

    14

    浏览量

    6412
  • ESP32
    +关注

    关注

    13

    文章

    896

    浏览量

    15814
收藏 人收藏

    评论

    相关推荐

    ESP32 Arduino GPIO中断介绍

    ESP32 Arduino GPIO 中断研究 ESP32 中断 入门 学习文章目录ESP32 Arduino GPIO
    发表于 01-13 06:56

    ESP32外部中断怎么使用?

    ESP32外部中断怎么使用?
    发表于 01-14 06:28

    ESP32-S3(ESP32-S2,ESP32)在商用触摸按键面板上使用安全吗?

    ESP32ESP32-S2ESP32-S3 的数据表中提到:[indent]ESP32-S3(ESP32-S2,
    发表于 04-12 07:03

    ESP32环境搭建以及入门编程_esp32引脚图

    本文主要介绍了ESP32环境搭建以及入门编程及ESP32的引脚图。
    发表于 04-23 11:15 1.3w次阅读
    <b class='flag-5'>ESP32</b>环境搭建以及入门编程_<b class='flag-5'>esp32</b>引脚图

    ESP32模组的主要特性

    WT-ESP32-DevKitC V4是一款基于ESP32的小型开发板,集WIFI+蓝牙方案于一体,板上模组绝大部分管脚均已引出,开发人员可根据实际需求,轻松通过跳线连接多种外围器件,或将开发板直接
    发表于 11-04 14:54 3474次阅读

    ESP32开发套件 ESP32-DevKitC

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

    ESP32 SDIO 使用教程

    ESP32 SDIO 使用教程本文旨在说明如何使用标准的 ESP32-WROOM-32D 开发板进行 SDIO 的通信。本文档适用于所有需要与 ESP32 SDIO slave 通信的方案
    发表于 11-23 17:51 224次下载
    <b class='flag-5'>ESP32</b> SDIO 使用教程

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

    使用简介二、使用 UART 收发数据1、设置 UART 参数① 单步法(结构体法)② 分步法2、分配引脚,安装驱动二、使用 UART 事件三、自定义 UART 中断一、ESP32 的 UART 概览1、简介ESP32芯片有三个
    发表于 11-26 13:21 42次下载
    <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 WROVER B/ESP32 WROVER IB技术规格书

    电子发烧友网站提供《ESP32 WROVER B/ESP32 WROVER IB技术规格书.pdf》资料免费下载
    发表于 09-23 14:45 1次下载
    <b class='flag-5'>ESP32</b> WROVER B/<b class='flag-5'>ESP32</b> WROVER IB技术规格书

    ESP32 WROVER/ESP32 WROVER IE技术规格书

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

    乐鑫ESP32-MINI-1参考设计

    乐鑫ESP32-MINI-1参考设计乐鑫多年来深耕?AIoT?领域软硬件产品的研发与设计,专注于研发高集成、低功耗、性能卓越、安全稳定、高性价比的无线通信SoC,现已发布ESP8266、ESP32
    发表于 10-19 16:13 12次下载

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

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