ESP-C3入门3. 基于IDF的GPIO基本操作

Posted 编程圈子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP-C3入门3. 基于IDF的GPIO基本操作相关的知识,希望对你有一定的参考价值。

ESP-C3入门3. 基于IDF的GPIO基本操作

一、ESP32-C3的GPIO口资源

ESP32-C3有22个物理GPIO管脚,编号从0~21。
每个管脚可用作通用IO,或连接一个内部的外设信号。

GPIO引脚特殊功能介绍:

GPIO模拟功能注释
GPIO0ADC1_CH0RTC
GPIO1ADC1_CH1RTC
GPIO2ADC1_CH2Strapping 管脚;RTC
GPIO3ADC1_CH3RTC
GPIO4ADC1_CH4RTC
GPIO5ADC2_CH0RTC
GPIO6
GPIO7
GPIO8Strapping 管脚
GPIO9Strapping 管脚
GPIO10
GPIO11
GPIO12SPI0/1
GPIO13SPI0/1
GPIO14SPI0/1
GPIO15SPI0/1
GPIO16SPI0/1
GPIO17SPI0/1
GPIO18USB-JTAG
GPIO19USB-JTAG
GPIO20
GPIO21

说明:

  • GPIO2、8、9是Strapping管脚;它们和芯片复位状态有关,在芯片的系统复位过程中,Strapping管脚对自己电平采样并存储到锁存器,一直保持到芯片掉电或关闭。避免把这几个端口使用到其它功能上。
  • GPIO12-17通常用于SPI flash和PSRAM,不推荐用作其它用途;
  • GPIO18、19默认用于USB-JTAG,如果用作GPIO将无法使用USB-JTAG;
  • RTC:GPIO0-5可以在Deep-sleep模式时使用。

二、重要的API

头文件位置:
components/driver/include/driver/gpio.h

1. gpio口配置函数

esp_err_t gpio_config(const gpio_config_t *pGPIOConfig)
端口可以设置以下模式:

  • pull-up
  • PullDown
  • IntrType
  • 参数: pGPIOConfig结构体
  • 返回: ERP_OK或ESP_ERR_INVALID_ARG

gpio_config_t 结构体

公共成员类型说明
pin_bit_maskunit64_tgpio引脚
modegpio_mode_t模式,input或oputput
pull_up_engpio_pullup_t是否启用内部上拉电阻,前提是已配置上拉电阻
pull_down_engpio_pulldown_t是否启用内部下拉电阻,前提是已配置下拉电阻
intr_typegpio_int_type_t中断类型

使用示例:

     gpio_set_pull_mode(3, GPIO_PULLUP_ONLY);
     gpio_set_pull_mode(4, GPIO_PULLUP_ONLY);
     gpio_set_pull_mode(5, GPIO_PULLUP_ONLY);
     gpio_config_t ioConfig = 
         .pin_bit_mask = (1ull<<3) || (1ull<<4) || (1ull<<5),
         .mode = GPIO_MODE_OUTPUT,
         .pull_up_en = 1
     ;
     gpio_config(&ioConfig);

2. gpio口复位函数

esp_err_t gpio_reset_pin(gpio_num_t gpio_num)

  • 设置为上拉、禁用输入、禁用输出
  • 参数: gpio口号
  • 返回: ESP_OK

3. 设置 gpio 方向

gpio_set_direction(gpio_num_tgpio_num, gpio_mode_tmode)

gpio_mode_tmode值

  • GPIO_MODE_DISABLE
  • GPIO_MODE_INPUT
  • GPIO_MODE_OUTPUT
  • GPIO_MODE_OUTPUT_OD
  • GPIO_MODE_INPUT_OUTPUT_OD
  • GPIO_MODE_INPUT_OUTPUT

4. GPIO输出高、低电平

gpio_set_level(gpio_num_t gpio_num, uint32_t level)
level:

  • 0 低电平
  • 1 高电平

5. 输入模式检测电平

gpio_get_level(gpio_num_t gpio_num)

6. 配置单个引脚内部上、下拉电阻

  • gpio_set_pull_mode(gpio_num_t gpio_num)
  • gpio_pullup_en(gpio_num_t gpio_num)
  • gpio_pullup_dis(gpio_num_t gpio_num)
  • gpio_pulldown_en(gpio_num_t gpio_num)
  • gpio_pulldown_dis(gpio_num_t gpio_num)

7. 配置内部上下拉电阻

esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull)
pull值列表:

  • GPIO_PULLUP_ONLY —— 仅上拉
  • GPIO_PULLDOWN_ONLY —— 仅下拉
  • GPIO_PULLUP_PULLDOWN —— 全部启用
  • GPIO_FLOATING —— 悬空

三、 示例

1. RGB轮流显示

#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void app_main()
    gpio_reset_pin(GPIO_NUM_3);
    gpio_reset_pin(GPIO_NUM_4);
    gpio_reset_pin(GPIO_NUM_5);
    gpio_set_direction(GPIO_NUM_3, GPIO_MODE_OUTPUT);
    gpio_set_direction(GPIO_NUM_4, GPIO_MODE_OUTPUT);
    gpio_set_direction(GPIO_NUM_5, GPIO_MODE_OUTPUT);

    int i=0;
    while(1)
        printf("r=%d,g=%d,b=%d \\n", i%3==0?0:1, i%3==1?0:1,i%3==2?0:1);
        //1为高电平,0为低电平
        gpio_set_level(GPIO_NUM_3,i%3==0?0:1);   // 红
        gpio_set_level(GPIO_NUM_4,i%3==1?0:1);   // 绿
        gpio_set_level(GPIO_NUM_5,i%3==2?0:1);   // 蓝

        vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
        i++;
        if(i>2)i=0;
    

2. 读取GPIO值示例

#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void app_main()

    gpio_reset_pin(GPIO_NUM_6);
    gpio_set_direction(GPIO_NUM_6, GPIO_MODE_INPUT);
    // 配置下拉,默认低电平
    gpio_pulldown_en(GPIO_NUM_6);

    while (1)
    
        vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
        int s = gpio_get_level(GPIO_NUM_6);
        printf("gpio6=%d \\n", s);
    

以上是关于ESP-C3入门3. 基于IDF的GPIO基本操作的主要内容,如果未能解决你的问题,请参考以下文章

ESP-C3入门2. Clion+IDF 开发环境搭建

ESP-C3入门2. Clion+IDF 开发环境搭建

ESP-C3入门2. Clion+IDF 开发环境搭建

ESP-C3入门1. VSCode+IDF 开发环境

ESP-C3入门1. VSCode+IDF 开发环境

ESP-C3入门14. 实现基本的web server