ESP32引脚中断03

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

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP32是一款基于Espressif Systems ESP8266平台开发的高性能、低功耗的Wi-Fi和Bluetooth双模SoC。在ESP32上操作GPIO(通用输入/输出)引脚是非常基础的操作,用于控制硬件设备如LED、蜂鸣器等。 **基本步骤**: 1. **初始化GPIO**: 首先,你需要通过`#include <GPIO.h>`包含GPIO库,并通过`GPIO_Init()`函数初始化特定的引脚。例如,设置GPIO0作为输出模式: ```c GPIO_InitStructure GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0; // 设置需要操作的引脚0 GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP; // 输出推挽模式 GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_LOW; // 设置速度为低速 GPIO_Init(GPIO_GPIO0, &GPIO_InitStructure); ``` 2. **设置引脚状态**: 要设置引脚输出高电平(`GPIO_HIGH_LEVEL`)或低电平(`GPIO_LOW_LEVEL`),你可以使用`GPIO_SetLevel()`或`GPIO_Toggle()`函数: - `GPIO_SetLevel(GPIO_GPIO0, GPIO_HIGHT_LEVEL);` 将GPIO0设为高电平 - `GPIO_Toggle(GPIO_GPIO0);` 则将GPIO0的状态反转 3. **控制硬件设备**: 你可以直接驱动外部设备,比如连接一个LED灯,当GPIO输出高电平时,LED亮起;反之,LED熄灭。 **注意事项**: - ESP32有多种GPIO模块(如GPIO0, GPIO1, GPIO2...),确保引用正确的GPIO编号。 - 使用前确保了解引脚是否已经配置好,避免干扰其他功能。 - 考虑到功耗管理,可能需要配合中断或者其他机制来减少频繁地读写GPIO。 **相关问题--:** 1. 如何处理ESP32 GPIO输入? 2. ESP32如何实现IO口模拟数字信号转换? 3. 如何在ESP32上控制多个外设同时使用不同的GPIO?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值