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.方式一:基本方式

2.方式二:配置?gpio_config_t?结构体方式

3.测试代码:

方式一:前后台方式(不使用操作系统)

方式二:使用FreeRTOS操作系统

4.运行结果:

二、GPIO输入

1.方式一:基本方式

?2.方式二:配置?gpio_config_t?结构体方式

3.测试代码:

三、GPIO中断

测试代码:

运行结果:

总结:



一、GPIO输出

1.方式一:基本方式

编程逻辑:

7ea362eed3fb4eaeaa2bdbcc68314403.png

?以初始化LED为例,代码如下:

void LED_GPIO_Init(void)
{
    gpio_pad_select_gpio(GPIO_LED);                 // 选择GPIO口
    gpio_set_direction(GPIO_LED, GPIO_MODE_OUTPUT); // GPIO作为输出
    gpio_set_level(GPIO_LED, 0);                    // 默认低电平
}

2.方式二:配置?gpio_config_t?结构体方式

gpio_config_t结构体:

typedef struct {
    uint64_t pin_bit_mask;          /*!< GPIO pin: set with bit mask, each bit maps to a GPIO */
    gpio_mode_t mode;               /*!< GPIO mode: set input/output mode                     */
    gpio_pullup_t pull_up_en;       /*!< GPIO pull-up                                         */
    gpio_pulldown_t pull_down_en;   /*!< GPIO pull-down                                       */
    gpio_int_type_t intr_type;      /*!< GPIO interrupt type                                  */
} gpio_config_t;

?以初始化LED为例,代码如下:

void LED_GPIO_Init(void)
{
    gpio_config_t io_config;
    io_config.mode = GPIO_MODE_OUTPUT;               //输入模式
    io_config.pin_bit_mask = (1ull << 15);           //引脚15
    io_config.pull_down_en = GPIO_PULLDOWN_DISABLE; //下拉失能
    io_config.pull_up_en = GPIO_PULLUP_DISABLE;      //上拉失能
    io_config.intr_type = GPIO_INTR_DISABLE;        //中断失能
    gpio_config(&io_config);
    gpio_set_level(GPIO_LED, 1); // 高电平
}

3.测试代码:

LED每隔一秒闪烁:

方式一:前后台方式(不使用操作系统)

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "driver/gpio.h"
#include "esp_spi_flash.h"
#include "freertos/queue.h"


#define GPIO_LED  GPIO_NUM_2

//led初始化
void LED_GPIO_Init(void)
{
    gpio_pad_select_gpio(GPIO_LED);                 // 选择GPIO口
    gpio_set_direction(GPIO_LED, GPIO_MODE_OUTPUT); // GPIO作为输出
    gpio_set_level(GPIO_LED, 0);                    // 默认低电平
}

//主函数
int app_main()
{
    LED_GPIO_Init();
    while(1)
    {
       gpio_set_level(GPIO_LED,1);//开灯
       vTaskDelay(1000/portTICK_PERIOD_MS);//延时一秒
       gpio_set_level(GPIO_LED,0);//关灯
       vTaskDelay(1000/portTICK_PERIOD_MS);//延时一秒
    }
  
}

方式二:使用FreeRTOS操作系统

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "driver/gpio.h"
#include "esp_spi_flash.h"
#include "freertos/queue.h"


#define GPIO_LED GPIO_NUM_2

// LED任务函数
void led_task(void *pvParam)
{
    while (1)
    {

        gpio_set_level(GPIO_LED, 1); // 高电平
        printf("LED OFF !\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS); //延时
        gpio_set_level(GPIO_LED, 0);          //低电平
        printf("LED ON !\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS); //延时
    }
}

//LED初始化
void LED_GPIO_Init(void)
{
    gpio_pad_select_gpio(GPIO_LED);                 // 选择GPIO口
    gpio_set_direction(GPIO_LED, GPIO_MODE_OUTPUT); // GPIO作为输出
    gpio_set_level(GPIO_LED, 0);                    // 默认低电平
}

void app_main(void)
{
    LED_GPIO_Init();
    xTaskCreate(led_task,"ledtask",1024,NULL,4,NULL);
}

4.运行结果:


二、GPIO输入

1.方式一:基本方式

编程逻辑:

8e1d5c7661cf4effbe0bba389ae51f2c.png?

?以初始化按键为例:

void KEY_GPIO_Init(void)
{
    gpio_pad_select_gpio(GPIO_KEY);//选择keyIO口
    gpio_set_direction(GPIO_KEY, GPIO_MODE_INPUT);//将该口设置为输入模式
   
}

?2.方式二:配置?gpio_config_t?结构体方式

?以初始化按键为例:

void KEY_GPIO_Init(void)
{
    gpio_config_t io_config;
    io_config.mode = GPIO_MODE_INPUT;               //输入模式
    io_config.pin_bit_mask = (1ull << 0);           //key引脚
    io_config.pull_down_en = GPIO_PULLDOWN_DISABLE; //下拉失能
    io_config.pull_up_en = GPIO_PULLUP_ENABLE;      //上拉使能
    io_config.intr_type = GPIO_INTR_NEGEDGE;        //下降沿触发中断
    gpio_config(&io_config);
}

3.测试代码:

以按键点灯为例:

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "driver/gpio.h"
#include "esp_spi_flash.h"

//----------宏定义-----------
#define GPIO_LED GPIO_NUM_2
#define GPIO_KEY GPIO_NUM_0

// LED初始化
void LED_GPIO_Init(void)
{
    gpio_pad_select_gpio(GPIO_LED);                 // 选择GPIO口
    gpio_set_direction(GPIO_LED, GPIO_MODE_OUTPUT); // GPIO作为输出
    gpio_set_level(GPIO_LED, 0);                    // 默认低电平
}

//KEY初始化
void KEY_GPIO_Init(void)
{
    gpio_pad_select_gpio(GPIO_KEY);
    gpio_set_direction(GPIO_KEY, GPIO_MODE_INPUT);
   
}

//按键扫描
uint8_t key_scan(void)
{
    if(gpio_get_level(GPIO_KEY)==0)
    {
        while(gpio_get_level(GPIO_KEY)==0);
        return 1;
    }
    return 0;
}

//主函数
void app_main(void)
{
    uint8_t key_value;
    uint8_t ledflag=0;
    LED_GPIO_Init();
    KEY_GPIO_Init();
    while (1)
    {
        key_value = key_scan();
        if (key_value == 1 && ledflag == 0)
        {
            ledflag = 1;
            gpio_set_level(GPIO_LED,0);
        }
        else if (key_value == 1 && ledflag == 1)
        {
            ledflag = 0;
            gpio_set_level(GPIO_LED,1);
        }
        vTaskDelay(10/portTICK_PERIOD_MS);//防止看门狗复位
    }
}

三、GPIO中断

编程逻辑:

f40aa5eb709643d69a6f1b34b4f561e4.png?

示例:

//key中断初始化
void KEY_Intr_Init(void)
{
    gpio_config_t io_config;
    io_config.mode = GPIO_MODE_INPUT;               //输入模式
    io_config.pin_bit_mask = (1ull << 0);           // key引脚
    io_config.pull_down_en = GPIO_PULLDOWN_DISABLE; //下拉失能
    io_config.pull_up_en = GPIO_PULLUP_ENABLE;      //上拉使能
    io_config.intr_type = GPIO_INTR_NEGEDGE;        //下降沿触发中断
    gpio_config(&io_config);

    gpio_install_isr_service(1); //注册中断服务

    gpio_isr_handler_add(GPIO_KEY, key_isr_handler, (void *)NULL); //设置中断回调函数
}

测试代码:

?以按键中断点灯为例:

注意:中断回调函数内不能有任何延时操作,包括printf也不能有,如果要打印信息可以使用?esp_rom_printf(const char *fmt, ...)函数.

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "driver/gpio.h"
#include "esp_spi_flash.h"

//----------宏定义-----------
#define GPIO_LED GPIO_NUM_2
#define GPIO_KEY GPIO_NUM_0

char LED_FLAG = 0;

// led初始化
void LED_GPIO_Init(void)
{
    gpio_pad_select_gpio(GPIO_LED);                 // 选择GPIO口
    gpio_set_direction(GPIO_LED, GPIO_MODE_OUTPUT); // GPIO作为输出
    gpio_set_level(GPIO_LED, 0);                    // 默认低电平
}

//中断处理函数
static void IRAM_ATTR key_isr_handler(void *arg)
{
    if (LED_FLAG == 0)
    {
        LED_FLAG = 1;
        gpio_set_level(GPIO_LED, 0);
?       esp_rom_printf("LED is ON!\n");
    }
    else
    {
        LED_FLAG = 0;
        gpio_set_level(GPIO_LED, 1);
        esp_rom_printf("LED is OFF!\n");
    }}

//key中断初始化
void KEY_Intr_Init(void)
{
    gpio_config_t io_config;
    io_config.mode = GPIO_MODE_INPUT;               //输入模式
    io_config.pin_bit_mask = (1ull << 0);           // key引脚
    io_config.pull_down_en = GPIO_PULLDOWN_DISABLE; //下拉失能
    io_config.pull_up_en = GPIO_PULLUP_ENABLE;      //上拉使能
    io_config.intr_type = GPIO_INTR_NEGEDGE;        //下降沿触发中断
    gpio_config(&io_config);

    gpio_install_isr_service(1); //注册中断服务

    gpio_isr_handler_add(GPIO_KEY, key_isr_handler, (void *)NULL); //设置中断回调函数
}

void app_main(void)
{
    LED_GPIO_Init();
    KEY_Intr_Init();
    while (1)
    {
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

运行结果:

6f18eec2656641d9998cd3553ce0046a.png?


总结:

GPIO的配置两方式:基本方式、配置结构体方式。

GPIO中断:1.配置IO口为中断? 2.注册中断服务? 3.设置中断回调函数

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:52:42  更:2022-04-22 18:52: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 5:30:36-

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