【ESP32学习之路2——GPIO操作】

一、工程模板

新建的工程模板可使用IDF中examples下get-started中sample_project工程复制到ESP-idf文件夹下。
在这里插入图片描述

二、示例程序

实现功能:按下一次按键点亮一个LED灯,再按下熄灭LED灯,依次循环。(找一个有按键和LED的开发板,用杜邦线把ESP32上IO口连接到对应开发板的LED和按键上)

1、函数操作

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

#define GPIO_NUM_26 26//IO口26
#define GPIO_NUM_17 17//IO口17

void app_main(void)
{
    static unsigned char flag = 1;//led灯亮灭标志位
    gpio_pad_select_gpio(GPIO_NUM_26);
    gpio_set_direction(GPIO_NUM_26, GPIO_MODE_OUTPUT);//输出
    gpio_pad_select_gpio(GPIO_NUM_17);
    gpio_set_direction(GPIO_NUM_17, GPIO_MODE_INPUT);//输入
    while(1) 
    {
        if(0 == gpio_get_level(GPIO_NUM_17))
        {
            vTaskDelay(10 / portTICK_PERIOD_MS);//消抖
            if(0 == gpio_get_level(GPIO_NUM_17))
            {
                printf("press the key!\n");
                flag = !flag;
                if(0 == flag)
                {
                    printf("Turning on the LED\n");
                    gpio_set_level(GPIO_NUM_26, 0);
                }
                else
                {
                    printf("Turning off the LED\n");
                    gpio_set_level(GPIO_NUM_26, 1);
                }
            }
            while(!gpio_get_level(GPIO_NUM_17));//防止按下不松手连续触发
        }
        vTaskDelay(10 / portTICK_PERIOD_MS);//避免触发看门狗	    
    }
}

在这里插入图片描述

2、结构体操作

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

#define GPIO_NUM_26 26//IO口26
#define GPIO_NUM_17 17//IO口17
#define GPIO_OUTPUT_PIN_SEL  (1ULL<<GPIO_NUM_26)  // 配置GPIO_OUT位寄存器
#define GPIO_INPUT_PIN_SEL  (1ULL<<GPIO_NUM_17)

void gpio_init(void)
{
    gpio_config_t io_conf;  // 定义一个gpio_config类型的结构体,下面的都算对其进行的配置

    io_conf.intr_type = GPIO_PIN_INTR_DISABLE;  // 禁止中断  
    io_conf.mode = GPIO_MODE_OUTPUT;            // 选择输出模式
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; // 配置GPIO_OUT寄存器
    io_conf.pull_down_en = 0;                   // 禁止下拉
    io_conf.pull_up_en = 0;                     // 禁止上拉

    gpio_config(&io_conf);                      // 最后配置使能

    io_conf.intr_type = GPIO_PIN_INTR_DISABLE;  
    io_conf.mode = GPIO_MODE_INPUT;            //选择输入模式
    io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL; 
    io_conf.pull_down_en = 0;                   
    io_conf.pull_up_en = 0;                     

    gpio_config(&io_conf); 
}

void app_main(void)
{
    static unsigned char flag = 1;//led灯亮灭标志位
    gpio_init();
    while(1) 
    {
        if(0 == gpio_get_level(GPIO_NUM_17))
        {
            vTaskDelay(10 / portTICK_PERIOD_MS);//消抖
            if(0 == gpio_get_level(GPIO_NUM_17))
            {
                printf("press the key!\n");
                flag = !flag;
                if(0 == flag)
                {
                    printf("Turning on the LED\n");
                    gpio_set_level(GPIO_NUM_26, 0);
                }
                else
                {
                    printf("Turning off the LED\n");
                    gpio_set_level(GPIO_NUM_26, 1);
                }
            }
            while(!gpio_get_level(GPIO_NUM_17));//防止按下不松手连续触发
        }
        vTaskDelay(10 / portTICK_PERIOD_MS);//避免触发看门狗	    
    }
}

在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值