IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 二、esp32-GPIO例程程序 -> 正文阅读

[嵌入式]二、esp32-GPIO例程程序

这个测试代码展示了如何配置GPIO以及如何在中断时使用它。

测试方法:
1.连接GPIO18和GPIO4
2.连接GPIO19和GPIO5
3.在GPIO18/19上产生脉冲,触发GPIO4/5上的中断

//GPIO 例程

#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"

/**
*简介:
*此测试代码显示如何配置gpio以及如何使用gpio中断。
*
*GPIO状态:
*GPIO18:输出
*GPIO19:输出
*GPIO4:输入,上拉,从上升沿和下降沿中断
*GPIO5:输入,上拉,从上升沿中断。
*
*测试:
*连接GPIO18和GPIO4
*连接GPIO19和GPIO5
*在GPIO18/19上产生脉冲,触发GPIO4/5上的中断
*
*/

//宏定义输入输出端口
#define GPIO_OUTPUT_IO_0 18
#define GPIO_OUTPUT_IO_1 19
#define GPIO_OUTPUT_PIN_SEL ((1ULL << GPIO_OUTPUT_IO_0) | (1ULL << GPIO_OUTPUT_IO_1))
#define GPIO_INPUT_IO_0 4
#define GPIO_INPUT_IO_1 5
#define GPIO_INPUT_PIN_SEL ((1ULL << GPIO_INPUT_IO_0) | (1ULL << GPIO_INPUT_IO_1))
#define ESP_INTR_FLAG_DEFAULT 0

//FreeRTOS生成队列,用于中断与任务间的通信
static xQueueHandle gpio_evt_queue = NULL;

//IO口中断服务函数,用于将发生中断的端口号发送到队列中
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 gpio_task_example(void *arg)
{
    uint32_t io_num;
    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 app_main(void)
{
    //初始化IO口配置结构体(这里初始化为空)
    gpio_config_t io_conf = {};

    //输出端口(GPIO18/GPIO19)设置
    //关闭中断
    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;   //上述上下拉设置相当于使引脚浮空
    //根据上述配置设置输出IO口
    gpio_config(&io_conf);

    //输入端口(GPIO4/GPIO5)设置
    //没有配置到的属性说明和输出端口一样
    //上升沿触发
    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;
    //根据上述配置设置输入IO口
    gpio_config(&io_conf);

    //更改GPIO4中断触发为上升/下降沿均触发
    gpio_set_intr_type(GPIO_INPUT_IO_0, GPIO_INTR_ANYEDGE);

    //创建任务与中断间传递数据的队列(FreeRTOS)
    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);
    //为GPIO4的中断添加中断服务函数
    gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void *)GPIO_INPUT_IO_0);
    //为GPIO5的中断添加中断服务函数
    gpio_isr_handler_add(GPIO_INPUT_IO_1, gpio_isr_handler, (void *)GPIO_INPUT_IO_1);

    //以下两句测试是为显示中断删除和添加的方法(实际无需多此一举)
    //移除GPIO4的中断
    gpio_isr_handler_remove(GPIO_INPUT_IO_0);
    //再次为GPIO4的中断添加中断服务函数
    gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void *)GPIO_INPUT_IO_0);

    printf("Minimum free heap size: %d bytes\n", esp_get_minimum_free_heap_size());

    int cnt = 0;
    while (1)    //注意:while中优先级比gpio_task_example高。
    {
        printf("cnt: %d\n", cnt++);
        vTaskDelay(1000 / portTICK_RATE_MS);   
        gpio_set_level(GPIO_OUTPUT_IO_0, cnt % 2);
        gpio_set_level(GPIO_OUTPUT_IO_1, cnt % 2);
    }
}

编译下载后,在监视器中查看程序运行结果如下:
在这里插入图片描述

注:在本程序调试过程中发现,若在中断服务程序中使用printf()函数,在中断发生时将导致开发板重启,应注意。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:44:59  更:2022-03-15 22:45:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:42:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码