ESP32 GPIO使用

ESP32 GPIO使用

GPIO使用需要加入必要的GPIO库

#include <driver/gpio.h>

接下来进行初始化GPIO

#define GPIO_OUT_PIN 2      //定义引脚号
#define GPIO_OUTPUT_PIN_SEL  (1<<GPIO_OUT_PIN)      //定义输出引脚的宏,用来将输出引脚号转换为位掩码

void bsp_gpio_init(){
    gpio_config_t io_conf;
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;     //  配置GPIO引脚
    io_conf.mode = GPIO_MODE_OUTPUT;        //  配置GPIO模式
    io_conf.pull_up_en = 0;     //  配置上拉电阻
    io_conf.pull_down_en = 0;   // 配置下拉电阻
    io_conf.intr_type = GPIO_INTR_ANYEDGE;      //配置GPIO口的中断类型
    gpio_config(&io_conf);
}

其他可以选择的参数:
intr_type:中断类型
GPIO_INTR_DISABLE(禁止中断)
GPIO_INTR_POSEDGE(上升沿触发)
GPIO_INTR_NEGEDGE(下降沿触发)
GPIO_INTR_ANYEDGE(边沿触发)
GPIO__INTR_LOW_LEVEL(低电平触发)
GPIO_INTR_HIGH_LEVEL(高电平触发)。

mode:GPIO口的工作模式,
GPIO_MODE_INPUT(输入模式)
GPIO_MODE_OUTPUT(输出模式)
GPIO_MODE_INPUT_OUTPUT(输入/输出模式)。
具体模式如下:
具体模式如下

pin_bit_mask:GPIO口的引脚编号,具体需要还是按位操作,下面是参考命名:
GPIO_INPUT_PIN_SEL(输入引脚)
GPIO_OUTPUT_PIN_SEL(输出引脚)。
还可以如下配置

//定义需要操作的GPIO
#define GPIO_OUT_Pin 2                              //配置的GPIO引脚
#define GPIO_ON gpio_set_level(GPIO_OUT_Pin, 1)     //高电平
#define GPIO_OFF gpio_set_level(GPIO_OUT_Pin, 0)    //低电平
void bsp_gpio_init(void){
    gpio_config_t io_conf;
    io_conf.pin_bit_mask = (1<<GPIO_OUT_Pin);   //注意pin_bit_mask配置GPIO的引脚要按位,左移2位即配置GPIO2
    io_conf.mode = GPIO_MODE_OUTPUT;            //配置GPIO模式  --  输出模式
    i0_conf.pull_down_en = 0;                   //配置下拉电阻  --  无下拉
    i0_conf.pull_up_en = 0;                     //配置上拉电阻  --  无上拉
    i0_conf.intr_type = GPIO_PIN_INTR_NEGEDGE;  //配置中断类型  --  下降沿中断
    gpio_config(&io_conf);
}

pull_down_en:是否启用GPIO口的下拉电阻,可以选择0(禁止)或1(启用)。
pull_up_en:是否启用GPIO口的上拉电阻,可以选择0(禁止)或1(启用)。
上下拉电阻

示例:

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

#define GPIO_OUT_PIN 2
#define GPIO_OUTPUT_PIN_SEL  (1<<GPIO_OUT_PIN)

#define GPIO_ON gpio_set_level(GPIO_OUT_PIN, 1)     //高电平
#define GPIO_OFF gpio_set_level(GPIO_OUT_PIN, 0)    //低电平

static const char* TAG = "GPIO";
//#define BUF_SIZE (1024)
void bsp_gpio_init(){
    gpio_config_t io_conf;
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;     //  配置GPIO引脚
    io_conf.mode = GPIO_MODE_OUTPUT;        //  配置GPIO模式
    io_conf.pull_up_en = 0;     //  配置上拉电阻
    io_conf.pull_down_en = 0;   // 配置下拉电阻
    io_conf.intr_type = GPIO_INTR_ANYEDGE;      //配置GPIO口的中断类型
    gpio_config(&io_conf);

    // uart_config_t uart_config = {
    //         .baud_rate = 115200,
    //         .data_bits = UART_DATA_8_BITS,
    //         .parity    = UART_PARITY_DISABLE,
    //         .stop_bits = UART_STOP_BITS_1,
    //         .flow_ctrl = UART_HW_FLOWCTRL_DISABLE
    //     };
    // uart_param_config(UART_NUM_1, &uart_config);
    // uart_set_pin(UART_NUM_1, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
    // uart_driver_install(UART_NUM_1, BUF_SIZE * 2, 0, 0, NULL, 0);
   
    printf("init\n");
    ESP_LOGI(TAG, "GPIO Init ready!");
}
void app_main(void)
{
    uint16_t count = 0;
    bsp_gpio_init();
    while(1){
        if(0 == count){
            count = 1;
            GPIO_ON;
        }
        else{
            count = 0;
            GPIO_OFF;
        }
        ESP_LOGI(TAG,"count:%d", count);
        vTaskDelay(1000 / portTICK_PERIOD_MS); /*  1000 / portTICK_PERIOD_MS,表示延时1000ms,
                                                        portTICK_PERIOD_MS表示每ms有多少个ticks,
                                                        ticks是一个时间片,一般1ms有1000ticks,
                                                        如果延时1000ms,则需要1000*1000=1000000ticks。
                                                        */
    }
}

有关ESP_LOGI(TAG, “GPIO Init ready!”);可以看之前文章
https://blog.csdn.net/hongyun1221/article/details/129391697

posted @ 2023-03-07 21:18  lhy_1016  阅读(476)  评论(0编辑  收藏  举报  来源