Blink

通过开发历程(1)的方法2建立工程之后,将如下代码复制进Main.c

代码

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#define LED_R_IO 2
#define LED_G_IO 18
#define LED_B_IO 19
#define GPIO_OUTPUT_PIN_SEL (1ULL << LED_R_IO)
void app_main()
{
    /**
     * @brief 这里是两种方法,方法一使用结构体,配置更详细,不过比较麻烦
     * 同时在配置中断的过程中可能会用到这种方法
     * 方法二是直接通过语句简写,三两句话就搞定
     */
    //方法一
    gpio_config_t io_conf;                        //配置引脚功能结构体
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;   //类似于选择哪个GPIO
    io_conf.mode = GPIO_MODE_OUTPUT;              //工作模式
    io_conf.pull_up_en = GPIO_PULLUP_DISABLE;     //上拉使能
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; //下拉使能
    io_conf.intr_type = GPIO_INTR_DISABLE;        //中断功能
    gpio_config(&io_conf);                        //通过gpio_config函数初始化GPIO
    //方法二
    //gpio_pad_select_gpio(LED_R_IO);                 //选择GPIO
    //gpio_set_direction(LED_R_IO, GPIO_MODE_OUTPUT); //指定哪个GPIO以什么方式工作
    while (1)
    {
        //红灯亮
        gpio_set_level(LED_R_IO, 0);
        vTaskDelay(100 / portTICK_PERIOD_MS);
        //红灯灭
        gpio_set_level(LED_R_IO, 1);
        vTaskDelay(100 / portTICK_PERIOD_MS);
    }
}

OK下面是代码的解释(个人理解,多指教!)。

代码解释

#define LED_R_IO 2

LED_R_IO定义为2LED_R_IO是我们所定义的开发板上LED的引脚。在实际的物理连接中LED链接到2脚,所以在这里我们为了方便,整个宏定义用。

#define GPIO_OUTPUT_PIN_SEL (1ULL << LED_R_IO)

后缀ULL以整数表示类型说明符。它的意思是unsigned long long

1ULL修改了字面的1,并将其制成unsigned long long(精度64位)。

这句话的意思是表示此配置对 GPIO2生效,采用位运算,然后将数值写入某个寄存器中……

做了个小实验:

后续中的两种方法

方法一调用gpio_config函数,比较像32中的GPIO_Init();函数。
方法二像Arduino中控制引脚的函数,封装的更彻底。
不过方法2可能会出现的更多一些,方法二不需要宏定义来选择引脚,而是使用gpio_pad_select_gpio(LED_R_IO);来选择引脚。

未解决的问题

gpio.h在哪里导入进工程的……

读取引脚

也就一句话的事
int gpio_get_level(gpio_num_t gpio_num);

启用内部上下拉

可以通过方法一结构体这一功能,同时也可以通过函数

gpio_set_pull_mode()gpio_pullup_en()

gpio_pullup_dis()

gpio_pulldown_en()

gpio_pulldown_dis()

来进行单个控制


配置说明见上表

参考链接

ESP32 之 ESP-IDF 教学(一)——GPIO(1) GPIO配置及其简单操作。
第八章 ESP32驱动LED灯。
C在线工具
第九章 ESP32的GPIO输入按键操作.