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);
}
}