ESP32入门-GPIO输入模式key

1.硬件

我使用的是GPIO口14号引脚

在这里插入图片描述

2.软件配置

2.1 查询方式检测key是否按下

2.1.1 初始化GPIO

通过使用创建新例程的例程,添加LED组件后,对应配置 keyIO口,如下:

#define GPIO_KEY1 14

void key_init(void)
{
    gpio_pad_select_gpio(GPIO_KEY1);	//指定IO口
    gpio_set_direction(GPIO_KEY1,GPIO_MODE_INPUT);
}

2.1.2 程序的处理函数

void key_prog(void)
{
#if (KEY_CYCLE_FLAG == 1)
    //加延时消抖
    if (gpio_get_level(GPIO_KEY1)== 0)
    {
        key_delay_cnt++;
        if (key_delay_cnt >= 3)
        {
            printf("key_low\n");
        }    
    }
    else
    {
        key_delay_cnt = 0;
        printf("key_high\n");
    } 
}

2.1.2 程序的主函数

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "led.h"
#include "key.h"

void app_main(void)
{
    int cnt = 0;
    //led_init();
    key_init();
    while (1)
    {
        //led_prog();
        printf("cnt: %d\n", cnt);
        key_prog();
        vTaskDelay(50 / portTICK_PERIOD_MS);
    }
}

2.1.1 key中断的方式处理

key.c文件进行初始化和中断处理

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "sdkconfig.h"
#include <sys/time.h>
#include "key.h"

static xQueueHandle gpio_evt_queue = NULL;

uint8_t key_delay_cnt=0;

//按键中断处理函数
static void IRAM_ATTR gpio_isr_handler(void* arg)
{
    uint32_t gpio_num = (uint32_t) arg;
    xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}

//任务处理
static void key_task(void* arg)
{
    uint32_t io_num;
    BaseType_t press_key = pdFALSE;
    BaseType_t lift_key = pdFALSE;
    int backup_time = 0;  
    for(;;)
    {
        if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY))
        {
            printf("GPIO[%d] intr, val: %d\n", io_num, gpio_get_level(io_num));            
        }
    }  
}

void key_init(void)
{
    //按键中断配置
    gpio_config_t io_conf={};
    io_conf.intr_type = GPIO_INTR_ANYEDGE;
    io_conf.pin_bit_mask = GPIO_KEY_PIN_SEL;
    io_conf.mode = GPIO_MODE_INPUT;
    io_conf.pull_up_en = 1;
    gpio_config(&io_conf);
 
   //创建消息队列处理引脚中断事件  ESP_INTR_FLAG_DEFAULT
    gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
    //创建任务
    xTaskCreate(key_task, "key_task", 2048, NULL, 10, NULL);
    //第一个处理器核安装中断处理程序,因为esp32是双核的
    gpio_install_isr_service(0);
    //添加中断处理函数
    gpio_isr_handler_add(GPIO_KEY_IO, gpio_isr_handler, (void*) GPIO_KEY_IO);
    //remove isr handler for gpio number.
    gpio_isr_handler_remove(GPIO_KEY_IO);
    //hook isr handler for specific gpio pin again
    gpio_isr_handler_add(GPIO_KEY_IO, gpio_isr_handler, (void*) GPIO_KEY_IO);
}

main.c 函数

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "led.h"
#include "key.h"

void app_main(void)
{
    int cnt = 0;
    //led_init();
    key_init();
    while (1)
    {
        //led_prog();
        printf("cnt: %d\n", cnt);
        //key_prog();
        vTaskDelay(50 / portTICK_PERIOD_MS);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值