有关开发环境的搭建,可以查看本人的上一篇博文,这里不再赘述。

一、新建一个ESP32-S3工程

首先,打开VS Code,在左侧插件栏点击ESP-IDF的图标,在“命令”下拉栏中,找到“Advanced”——“新建项目向导”,稍等一会,界面上方会弹出一个选择框架的选项,我们点击“使用ESP-IDF”。之后会弹出如下界面:

在这里,我们修改项目名称为“LED”,第二行的项目地址可以自行选择,将会在该目录下新建一个名为“LED”的文件夹存放项目的所有内容。第三行选择芯片型号,我们选择“ESP32S3”,再下一个不需要更改,之后我们点击“Choose Template”开始选择项目的模板:

在此界面下,找到“ESP-IDF Templates”-“sample_project”,点开之后,右边显示没有README.md文件介绍这个项目,是因为这是一个空白的模板。

之后,我们点击最上方的“Create project using template sample_project”,此时可以看到右下角弹出“created successfully”,同时界面也变成了这样,我们直接点击“Open Project”即可:

VS Code默认打开了一个新的工作区,所以我们把原来的那个叉掉,进入我们创建好的项目:

需要注意,在打开项目时,上方可能会出现弹窗说:“未指定工具包”,我们先不予理会。可以看到我们刚才创建好的项目包含了许多的文件和文件夹,但是我们在进行开发的时候,只需要关注“main”文件夹里的内容即可,一般我们所作的所有修改都在main文件夹内。

二、工程大致框架

我们打开main文件夹,可以看到里面有两个文件,一个是“CMakeList.txt”,另一个是“main.c”。CMake是一个跨平台的构建配置工具,这里我们不细讲,大家只需要知道怎么使用就可以了。main.c文件是我们的代码文件,对芯片的所有编程主要在这个文件里完成。

CMakeList.txt文件里,是一个注册当前组件的核心配置语句,SRCS "main.c"表示该组件只包含"main.c"这一个源文件,INCLUDE_DIRS "."指定当前组件的头文件搜索目录。

“main.c”文件里,有一个#include将所需头文件包含进来。app_main是ESP32_S3的起始函数,程序将从这个函数开始运行。

三、开始程序编写

1.添加头文件

因为ESP-IDF使用了CMake,所以添加头文件要比一般的程序麻烦一些。

首先点击“CMakeList.txt”,在中间加入一行“PRIV_REQUIRES driver”,声明当前组件的私有依赖项,这里表示当前组件需要依赖ESP-IDF的driver组件。

接着,回到main.c文件中,在头文件处写上#include "driver/gpio.h",只有这样才算是加上了这个头文件。

在之后的开发中,添加头文件都需要这样的两步,在CMakeList中添加好后,再去.c文件中添加。

2.编写代码

#include <stdio.h>
#include "driver/gpio.h"

void app_main(void)
{
    gpio_config_t io_conf={
        .pin_bit_mask = (1ULL<<15),
        .mode = GPIO_MODE_OUTPUT,
        .pull_down_en = 0,
        .pull_up_en = 0,
        .intr_type = GPIO_INTR_DISABLE,
    };
    gpio_config(&io_conf);

    gpio_set_level(GPIO_NUM_15, 1);
}

鼠标光标放在gpio_config_t上,ctrl+单击,可以看到在gpio.h中头文件对于GPIO初始化的代码:

/**
 * @brief Configuration parameters of GPIO pad for gpio_config function
 */
typedef struct {
    uint64_t pin_bit_mask;          /*!< GPIO pin: set with bit mask, each bit maps to a GPIO */
    gpio_mode_t mode;               /*!< GPIO mode: set input/output mode                     */
    gpio_pullup_t pull_up_en;       /*!< GPIO pull-up                                         */
    gpio_pulldown_t pull_down_en;   /*!< GPIO pull-down                                       */
    gpio_int_type_t intr_type;      /*!< GPIO interrupt type                                  */
#if SOC_GPIO_SUPPORT_PIN_HYS_FILTER
    gpio_hys_ctrl_mode_t hys_ctrl_mode;       /*!< GPIO hysteresis: hysteresis filter on slope input    */
#endif
} gpio_config_t;

现在我们挨个解释一下:

  • pin_bit_mask,指定要配置的 GPIO 引脚,使用位掩码表示,我们这里要使用的是GPIO15,就设置为(1ULL<<15)。

  • mode,GPIO模式,可以选择GPIO_MODE_INPUT(输入模式)、GPIO_MODE_OUTPUT(输出模式)、GPIO_MODE_INPUT_OUTPUT(双向模式)。

  • pull_up_en,使能/禁用上拉电阻,可以选择GPIO_PULLUP_DISABLE(禁用)、GPIO_PULLUP_ENABLE(使能)。

  • pull_down_en,使能/禁用下拉电阻,可以选择GPIO_PULLDOWN_DISABLE(禁用)、GPIO_PULLDOWN_ENABLE(使能)。

  • intr_type,设置中断类型,可以选择GPIO_INTR_DISABLE(禁用)、GPIO_INTR_POSEDGE(上升沿触发)、GPIO_INTR_NEGEDGE(下降沿触发)、GPIO_INTR_ANYEDGE(双边沿触发)、GPIO_INTR_LOW_LEVEL(低电平触发)、GPIO_INTR_HIGH_LEVEL(高电平触发)。

所以,我们这里的代码是定义了一个输出引脚GPIO15,禁用了上下拉电阻和它的中断。之后,再给它写1,使它输出高电平。

四、编译烧录

之后,我们点一下界面左下角的扳手按钮进行编译:

编译成功后,终端输出会出现如下的内容,同时右下角的消息面板会显示“Build Successful”。

编译成功后,使用USB线连接电脑与ESP32-S3芯片,点击扳手右边的闪电按钮进行烧录:

弹出的弹窗中会让我们选择烧录方式,这里我们选择UART:

之后,如果我们没有提前选择串口的话,ESP-IDF会自动把所有的串口全部扫描一遍,我们也可以手动选择串口:

COM11后面有一大串东西,证明我们的COM11连接上了东西。

烧录完成后,会出现如下画面:

五、观察现象

将一颗LED的长脚插在GPIO15,短脚插在地,上电后可以看到LED被点亮:

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐