#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
//定义IO输出接口
#define GPIO_OUTPUT_IO_0 14
#define GPIO_OUTPUT_IO_1 14
#define GPIO_OUTPUT_PIN_SEL ((1ULL<<GPIO_OUTPUT_IO_0) | (1ULL<<GPIO_OUTPUT_IO_1))
//定义IO输入接口
#define GPIO_INPUT_IO_0 12
#define GPIO_INPUT_IO_1 12
#define GPIO_INPUT_PIN_SEL ((1ULL<<GPIO_INPUT_IO_0) | (1ULL<<GPIO_INPUT_IO_1))
//注册中断服务默认值
#define ESP_INTR_FLAG_DEFAULT 0
//消息队列
static QueueHandle_t gpio_evt_queue = NULL;
//GPIO中断函数
static void IRAM_ATTR gpio_isr_handler(void* arg)
{
uint32_t gpio_num = (uint32_t) arg;
xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}
//GPIO任务函数
static void gpio_task_example(void* arg)
{
uint32_t io_num;
for (;;) {
//接受消息队列信息
if (xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {
printf("GPIO[%"PRIu32"] intr, val: %d\n", io_num, gpio_get_level(io_num));
}
}
}
//主函数
void app_main(void)
{
//GPIO 结构体
gpio_config_t io_conf = {};
//不允许中断
io_conf.intr_type = GPIO_INTR_DISABLE;
//设置输出模式
io_conf.mode = GPIO_MODE_OUTPUT;
//设置输出引脚
io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
//引脚上拉模式不使用
io_conf.pull_down_en = 0;
//引脚下拉模式不使用
io_conf.pull_up_en = 0;
//配置GOIO
gpio_config(&io_conf);
//引脚中断模式
io_conf.intr_type = GPIO_INTR_POSEDGE;
//引脚选择
io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
//引脚输入模式
io_conf.mode = GPIO_MODE_INPUT;
//引脚上拉
io_conf.pull_up_en = 1;
//配置GPIO
gpio_config(&io_conf);
//更改引脚的中断方式
gpio_set_intr_type(GPIO_INPUT_IO_0, GPIO_INTR_ANYEDGE);
//创建消息队列
gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
//创建任务
xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL);
//注册中断服务
gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
//引脚添加中断处理函数
gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);
//引脚添加中断处理函数
gpio_isr_handler_add(GPIO_INPUT_IO_1, gpio_isr_handler, (void*) GPIO_INPUT_IO_1);
//移除引脚中断
gpio_isr_handler_remove(GPIO_INPUT_IO_0);
//引脚添加中断处理函数
gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);
//esp32 得到最小堆栈大小
printf("Minimum free heap size: %"PRIu32" bytes\n",
esp_get_minimum_free_heap_size());
int cnt = 0;
while (1) {
printf("cnt: %d\n", cnt++);
//系统延时
vTaskDelay(1000 / portTICK_PERIOD_MS);
//设置引脚电平
gpio_set_level(GPIO_OUTPUT_IO_0, cnt % 2);
//设置引脚电平
gpio_set_level(GPIO_OUTPUT_IO_1, cnt % 2);
}
}
运行结果: