一、查询GPIO的输入
1.使用函数:gpio_get_level
2.示例程序:
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#define INPUT_GPIO 4
void app_main()
{
gpio_config_t io_conf;
io_conf.pin_bit_mask =1ULL<<INPUT_GPIO;
io_conf.mode = GPIO_MODE_INPUT;
io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
io_conf.pull_down_en = 0;
io_conf.pull_up_en = 0;
gpio_config(&io_conf);
while(1) {
printf(" Current Input Gpio Level is : %d \r\n\r\n",
gpio_get_level(INPUT_GPIO));
vTaskDelay(500);
}
}
二、GPIO输入中断
#include <stdio.h>
#include "esp_types.h"
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#define INPUT_GPIO 5
static xQueueHandle gpio_evt_queue = NULL; //定义一个队列返回变量
void IRAM_ATTR gpio_isr_handler(void* arg) {
//把中断消息插入到队列的后面,将gpio的io参数传递到队列中
uint32_t gpio_num = (uint32_t) arg;
xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}
//低电平触发的回调方法
void gpio_low_interrupt_callBack(void* arg) {
printf(" \r\n into gpio_low_interrupt_callBack ...\r\n ");
uint32_t io_num;
while (1) {
//不断读取gpio队列,读取完后将删除队列
if (xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {
printf("GPIO[%d] volt: %d\n", io_num,
gpio_get_level(io_num));
}
}
}
void app_main()
{
gpio_config_t io_conf;
io_conf.pin_bit_mask =1ULL<<INPUT_GPIO;
io_conf.mode = GPIO_MODE_INPUT;
io_conf.intr_type = GPIO_INTR_NEGEDGE;
io_conf.pull_down_en = 0;
io_conf.pull_up_en = 1;
gpio_config(&io_conf);
//注册中断服务
gpio_install_isr_service(1);
//设置GPIO的中断回调函数
gpio_isr_handler_add(INPUT_GPIO, gpio_isr_handler,(void*) INPUT_GPIO);
//创建一个消息队列,从中获取队列句柄
gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
//新建队列的
xTaskCreate(gpio_low_interrupt_callBack //任务函数
, "gpio_task_example" //任务名字
, 2048 //任务堆栈大小
, NULL //传递给任务函数的参数
, 10 //任务优先级
, NULL); //任務句柄
while(1) {
printf("FrontDesk\n");
vTaskDelay(500);
}
}