首先我们来扩展一个知识,在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\components
Mode 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\driver
Mode 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\include
Mode 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\driver
Mode 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
#include "driver/gpio.h"
#include "FreeRTOS/freertos.h"
#include "FreeRTOS/task.h"
#define LED_PIN GPIO_NUM_12
#define DELAY_MS 1000
uint32_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
这一行是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)
,它用于设置指定引脚的输出电平。