> 文章列表 > 【ESP-IDF】使用GPIO点亮LED

【ESP-IDF】使用GPIO点亮LED

【ESP-IDF】使用GPIO点亮LED

【ESP-IDF】使用GPIO点亮LED

  • 点灯程序

首先我们来扩展一个知识,在ESP-IDF中,库文件都保存在哪个位置呢?

以嵌入式开发中经典的点灯程序为例,点灯程序需要用到GPIO引脚,所以在ESP-IDF中,我们需要把其GPIO引脚头文件引出来。

首先我们打开ESP-IDF 5.0 PowerShell,输入ls

目录: G:\\\\Espressif\\\\frameworks\\\\esp-idf-v5.0.1
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----          2023/4/9     22:15                .git
d-----          2023/4/7     11:51                .github
d-----          2023/4/7     11:51                .gitlab
d-----          2023/4/7     11:55                components
d-----          2023/4/7     11:55                docs
d-----          2023/4/7     11:57                examples
d-----          2023/4/7     11:57                tools
-a----         2023/3/21     22:36            653 .editorconfig
-a----         2023/3/21     22:36           8929 .flake8
-a----         2023/3/21     22:36           1666 .gitignore
-a----         2023/3/21     22:36           8575 .gitlab-ci.yml
-a----         2023/3/21     22:36           2723 .gitmodules
-a----         2023/3/21     22:36           1011 .mypy.ini
-a----         2023/3/21     22:36           6361 .pre-commit-config.yaml
-a----         2023/3/21     22:36          19693 .pylintrc
-a----         2023/3/21     22:36            559 .readthedocs.yml
-a----         2023/3/21     22:36            739 add_path.sh
-a----         2023/3/21     22:36          10322 CMakeLists.txt
-a----         2023/3/21     22:36          14735 conftest.py
-a----         2023/3/21     22:36            320 CONTRIBUTING.md
-a----         2023/3/21     22:36           3991 export.bat
-a----         2023/3/21     22:36           3976 export.fish
-a----         2023/3/21     22:36           3746 export.ps1
-a----         2023/3/21     22:36           8387 export.sh
-a----         2023/3/21     22:36           1618 install.bat
-a----         2023/3/21     22:36            828 install.fish
-a----         2023/3/21     22:36            906 install.ps1
-a----         2023/3/21     22:36            827 install.sh
-a----         2023/3/21     22:36          20493 Kconfig
-a----         2023/3/21     22:36          11560 LICENSE
-a----         2023/3/21     22:36           3349 pytest.ini
-a----         2023/3/21     22:36           8601 README.md
-a----         2023/3/21     22:36           8489 README_CN.md
-a----         2023/3/21     22:36           1920 sdkconfig.rename
-a----         2023/3/21     22:36            484 SECURITY.md
-a----         2023/3/21     22:36            594 sonar-project.properties
-a----         2023/3/21     22:36           3772 SUPPORT_POLICY.md
-a----         2023/3/21     22:36           3455 SUPPORT_POLICY_CN.md

我们可以在上面找到一个叫components的文件夹,所有我们需要引入的文件基本上都在components文件夹中,所以我们进入components

目录: G:\\Espressif\\frameworks\\esp-idf-v5.0.1\\componentsMode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----          2023/4/7     11:51                app_trace
d-----          2023/4/7     11:51                app_update
d-----          2023/4/7     11:51                bootloader
d-----          2023/4/7     11:51                bootloader_support
d-----          2023/4/7     11:51                bt
d-----          2023/4/7     11:51                cmock
d-----          2023/4/7     11:51                console
d-----          2023/4/7     11:51                cxx
d-----          2023/4/7     11:51                driver
d-----          2023/4/7     11:51                efuse
d-----          2023/4/7     11:51                esp-tls
d-----          2023/4/7     11:51                espcoredump
d-----          2023/4/7     11:51                esptool_py
d-----          2023/4/7     11:51                esp_adc
d-----          2023/4/7     11:51                esp_app_format
d-----          2023/4/7     11:51                esp_common
d-----          2023/4/7     11:51                esp_eth
d-----          2023/4/7     11:51                esp_event
d-----          2023/4/7     11:51                esp_gdbstub
d-----          2023/4/7     11:51                esp_hid
d-----          2023/4/7     11:51                esp_https_ota
d-----          2023/4/7     11:51                esp_https_server
d-----          2023/4/7     11:51                esp_http_client
d-----          2023/4/7     11:51                esp_http_server
d-----          2023/4/7     11:51                esp_hw_support
d-----          2023/4/7     11:51                esp_lcd
d-----          2023/4/7     11:51                esp_local_ctrl
d-----          2023/4/7     11:51                esp_netif
d-----          2023/4/7     11:51                esp_partition
d-----          2023/4/7     11:51                esp_phy
d-----          2023/4/7     11:51                esp_pm
d-----          2023/4/7     11:51                esp_psram
d-----          2023/4/7     11:51                esp_ringbuf
d-----          2023/4/7     11:51                esp_rom
d-----          2023/4/7     11:51                esp_system
d-----          2023/4/7     11:51                esp_timer
d-----          2023/4/7     11:51                esp_wifi
d-----          2023/4/7     11:51                fatfs
d-----          2023/4/7     11:51                freertos
d-----          2023/4/7     11:51                hal
d-----          2023/4/7     11:51                heap
d-----          2023/4/7     11:51                http_parser
d-----          2023/4/7     11:51                idf_test
d-----          2023/4/7     11:51                ieee802154
d-----          2023/4/7     11:51                json
d-----          2023/4/7     11:51                linux
d-----          2023/4/7     11:51                log
d-----          2023/4/7     11:52                lwip
d-----          2023/4/7     11:52                mbedtls
d-----          2023/4/7     11:52                mqtt
d-----          2023/4/7     11:52                newlib
d-----          2023/4/7     11:52                nvs_flash
d-----          2023/4/7     11:53                openthread
d-----          2023/4/9     10:22                partition_table
d-----          2023/4/7     11:53                perfmon
d-----          2023/4/7     11:53                protobuf-c
d-----          2023/4/7     11:53                protocomm
d-----          2023/4/7     11:53                pthread
d-----          2023/4/7     11:54                riscv
d-----          2023/4/7     11:54                sdmmc
d-----          2023/4/7     11:54                soc
d-----          2023/4/7     11:54                spiffs
d-----          2023/4/7     11:54                spi_flash
d-----          2023/4/7     11:54                tcp_transport
d-----          2023/4/7     11:54                touch_element
d-----          2023/4/7     11:54                ulp
d-----          2023/4/7     11:55                unity
d-----          2023/4/7     11:55                usb
d-----          2023/4/7     11:55                vfs
d-----          2023/4/7     11:55                wear_levelling
d-----          2023/4/7     11:55                wifi_provisioning
d-----          2023/4/7     11:55                wpa_supplicant
d-----          2023/4/7     11:55                xtensa
-a----         2023/3/21     22:36           6488 README.md

我们查看components文件夹中的内容,其中有一个文件夹叫driver,里面存放的驱动程序

目录: G:\\Espressif\\frameworks\\esp-idf-v5.0.1\\components\\driverMode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----          2023/4/7     11:51                deprecated
d-----          2023/4/7     11:51                esp32
d-----          2023/4/7     11:51                esp32s2
d-----          2023/4/7     11:51                esp32s3
d-----          2023/4/7     11:51                gpio
d-----          2023/4/7     11:51                i2s
d-----          2023/4/7     11:51                include
d-----          2023/4/7     11:51                mcpwm
d-----          2023/4/7     11:51                rmt
d-----          2023/4/7     11:51                test
d-----          2023/4/7     11:51                test_apps
-a----         2023/3/21     22:36           1140 .build-test-rules.yml
-a----         2023/3/21     22:36           3718 CMakeLists.txt
-a----         2023/3/21     22:36           3474 dac_common.c
-a----         2023/3/21     22:36          21897 gptimer.c
-a----         2023/3/21     22:36          69658 i2c.c
-a----         2023/3/21     22:36          19457 Kconfig
-a----         2023/3/21     22:36          57319 ledc.c
-a----         2023/3/21     22:36            856 linker.lf
-a----         2023/3/21     22:36          32643 pulse_cnt.c
-a----         2023/3/21     22:36          28349 sdio_slave.c
-a----         2023/3/21     22:36            232 sdkconfig.rename
-a----         2023/3/21     22:36          11213 sdm.c
-a----         2023/3/21     22:36          24362 sdmmc_host.c
-a----         2023/3/21     22:36            976 sdmmc_private.h
-a----         2023/3/21     22:36          17370 sdmmc_transaction.c
-a----         2023/3/21     22:36           2568 sdspi_crc.c
-a----         2023/3/21     22:36            757 sdspi_crc.h
-a----         2023/3/21     22:36          33898 sdspi_host.c
-a----         2023/3/21     22:36           4522 sdspi_private.h
-a----         2023/3/21     22:36           7886 sdspi_transaction.c
-a----         2023/3/21     22:36          36405 spi_bus_lock.c
-a----         2023/3/21     22:36          37352 spi_common.c
-a----         2023/3/21     22:36          45014 spi_master.c
-a----         2023/3/21     22:36          15904 spi_slave.c
-a----         2023/3/21     22:36          22507 spi_slave_hd.c
-a----         2023/3/21     22:36           7665 temperature_sensor.c
-a----         2023/3/21     22:36           7539 touch_sensor_common.c
-a----         2023/3/21     22:36          27390 twai.c
-a----         2023/3/21     22:36          85489 uart.c
-a----         2023/3/21     22:36           8643 usb_serial_jtag.c

可以看到,里面有一个名为include的文件夹,里面存放的是所有include文件

目录: G:\\Espressif\\frameworks\\esp-idf-v5.0.1\\components\\driver\\includeMode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----          2023/4/7     11:51                driver
d-----          2023/4/7     11:51                esp_private

接着我们进入driver驱动引入文件夹

目录: G:\\Espressif\\frameworks\\esp-idf-v5.0.1\\components\\driver\\include\\driverMode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2023/3/21     22:36           2209 dac_common.h
-a----         2023/3/21     22:36           7366 dedic_gpio.h
-a----         2023/3/21     22:36          18791 gpio.h
-a----         2023/3/21     22:36          10674 gptimer.h
-a----         2023/3/21     22:36          25643 i2c.h
-a----         2023/3/21     22:36          11100 i2s_common.h
-a----         2023/3/21     22:36          18956 i2s_pdm.h
-a----         2023/3/21     22:36          15015 i2s_std.h
-a----         2023/3/21     22:36          12001 i2s_tdm.h
-a----         2023/3/21     22:36           3027 i2s_types.h
-a----         2023/3/21     22:36          26319 ledc.h
-a----         2023/3/21     22:36          11280 mcpwm_cap.h
-a----         2023/3/21     22:36           3906 mcpwm_cmpr.h
-a----         2023/3/21     22:36           4615 mcpwm_fault.h
-a----         2023/3/21     22:36           8446 mcpwm_gen.h
-a----         2023/3/21     22:36           7085 mcpwm_oper.h
-a----         2023/3/21     22:36            605 mcpwm_prelude.h
-a----         2023/3/21     22:36           4777 mcpwm_sync.h
-a----         2023/3/21     22:36           6502 mcpwm_timer.h
-a----         2023/3/21     22:36           4291 mcpwm_types.h
-a----         2023/3/21     22:36          16668 pulse_cnt.h
-a----         2023/3/21     22:36           3406 rmt_common.h
-a----         2023/3/21     22:36           4875 rmt_encoder.h
-a----         2023/3/21     22:36           4977 rmt_rx.h
-a----         2023/3/21     22:36           8909 rmt_tx.h
-a----         2023/3/21     22:36           2421 rmt_types.h
-a----         2023/3/21     22:36           8456 rtc_io.h
-a----         2023/3/21     22:36          13723 sdio_slave.h
-a----         2023/3/21     22:36           4681 sdm.h
-a----         2023/3/21     22:36          26176 sdmmc_defs.h
-a----         2023/3/21     22:36           9370 sdmmc_host.h
-a----         2023/3/21     22:36          11696 sdmmc_types.h
-a----         2023/3/21     22:36           6183 sdspi_host.h
-a----         2023/3/21     22:36           8531 spi_common.h
-a----         2023/3/21     22:36          21851 spi_master.h
-a----         2023/3/21     22:36           9648 spi_slave.h
-a----         2023/3/21     22:36          10792 spi_slave_hd.h
-a----         2023/3/21     22:36           3281 temperature_sensor.h
-a----         2023/3/21     22:36            248 touch_pad.h
-a----         2023/3/21     22:36           5433 touch_sensor_common.h
-a----         2023/3/21     22:36          16799 twai.h
-a----         2023/3/21     22:36          32020 uart.h
-a----         2023/3/21     22:36            974 uart_select.h
-a----         2023/3/21     22:36           2750 usb_serial_jtag.h

可以看到这里面就有我们需要的头文件gpio.h

点灯程序

开门见山,我们直接来看源代码:

#include <stdio.h>
#include "driver/gpio.h"
#include "FreeRTOS/freertos.h"
#include "FreeRTOS/task.h"#define LED_PIN GPIO_NUM_12
#define DELAY_MS 1000uint32_t status = 0;void app_main(void)
{gpio_reset_pin(LED_PIN);gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);while (true){status = !status;gpio_set_level(LED_PIN, status);vTaskDelay(DELAY_MS);}
}

以下是代码的逐行分析:

#include <stdio.h>

这一行是C语言标准库中用于输入输出的头文件。

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

这三行是ESP32的GPIO库和FreeRTOS库的头文件,其中gpio.h是GPIO库的头文件,提供了对ESP32芯片上的GPIO引脚进行读写操作的函数;freertos.h和task.h是FreeRTOS库的头文件,FreeRTOS是一个开源的实时操作系统,提供了一些函数来方便地创建和管理多任务。

#define LED_PIN GPIO_NUM_12
#define DELAY_MS 1000

这两行定义常量LED_PIN和DELAY_MS,分别代表LED所连接的GPIO引脚号码和LED闪烁的时间间隔。

Chat GPT回答:

使用 #define 定义常量时,编译器在编译阶段会将所有出现的常量替换为它的值,因此生成的目标代码中并不包含常量的定义,而是直接使用常量的值。这样可以减少目标代码的大小,因为常量的定义并不需要占用程序的存储空间。

相比之下,在全局变量中定义常量会占用程序的存储空间,因为变量的定义会导致编译器在目标代码中分配相应的存储空间。此外,在程序运行时,全局变量的值可以被修改,而 #define 定义的常量则不可以。

综上所述,使用 #define 定义常量可以减少目标代码的大小,而使用全局变量则需要占用程序的存储空间。因此,当需要定义不会被修改的常量时,最好使用 #define,而当需要定义可修改的变量时,则需要使用全局变量。

uint32_t status = 0;

这一行定义了一个无符号32位整数变量status,并将其初始化为0。因为我们深入解析gpio_set_direction后会发现,其方法需要传入的参数为:

  • **gpio_set_level(gpio_num_t gpio_num, uint32_t level)**

所以我们需要将定义一个无符号32位整数变量status

gpio_reset_pin(LED_PIN);
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);

这两行代码分别使用了 gpio_reset_pin()gpio_set_direction() 函数,它们都是 ESP32 的 GPIO 库提供的函数,用于配置指定的 GPIO 引脚的工作模式和状态。

gpio_reset_pin(LED_PIN) 函数的作用是将指定的 GPIO 引脚恢复为默认状态,也就是重置其所有配置。在这个例子中,它会将 LED 所连接的 GPIO 引脚(即 LED_PIN)的工作模式、状态、上拉/下拉电阻等参数恢复为默认值。

gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT) 函数的作用是设置指定的 GPIO 引脚的工作模式。在这个例子中,它将 LED 所连接的 GPIO 引脚(即 LED_PIN)设置为输出模式,以便控制 LED 的亮灭。

需要注意的是,在使用 GPIO 库中的函数之前,必须先通过 gpio_install() 函数来初始化 GPIO 库。否则这些函数将无法正常工作。在这个例子中,由于这部分代码被封装在 ESP32 的开发环境中,因此这一步初始化的工作已经被自动完成了。

gpio_set_level(LED_PIN, status);

这行代码使用了GPIO库中的一个函数 gpio_set_level(gpio_num_t gpio_num, uint32_t level),它用于设置指定引脚的输出电平。