ESP32入门开发·VScode空白项目搭建·点亮一颗LED灯

目录

[1. 环境搭建](#1. 环境搭建)

[2. 创建项目](#2. 创建项目)

[3. 调试相关介绍](#3. 调试相关介绍)

[4. 代码编写](#4. 代码编写)

[4.1 包含头文件](#4.1 包含头文件)

[4.2 引脚配置](#4.2 引脚配置)

[4.3 设置输出电平](#4.3 设置输出电平)

[4.4 延时函数](#4.4 延时函数)

[4.5 调试](#4.5 调试)


1. 环境搭建

默认已经搭建好环境,如果未搭建好可参考:

ESP32入门开发·Windows平台下开发环境的搭建-CSDN博客

2. 创建项目

当我们配好环境后,左边会出现ESP-IDF的图标,点击图标找到新项目向导,选择框架,这里我只安装了5.2.3所以就一个:

如果没汉化就找到New Project Wizard(新项目向导):


当然除了上述方法,我们也可以按F1或者Shift+Ctrl+P唤醒上方搜索栏,搜索Nuw Project,效果是一样的:


选择完框架后进入如下界面,①位项目名称,②是你所要保存的工程路径(注意ESP-IDF 编译系统不支持 ESP-IDF 路径或其工程路径中带有空格):

③是一些esp32的芯片型号,根据自己芯片进行选择,这里我使用的是esp32-s3的芯片:

④是一些目标芯片的选择,根据板子的不同这里的东西也不同,根据自己需求选择:

⑤是连接板子的COM口,看看哪个口和板子连接,这个后续可进行更改:

设定完后点击"Choose Template"选择模版:

选择ESP-IDF:

下面都是一些官方示例模版,如果你想要新建一个空白的,直接如图所示找到sample_project点击,找到图示Creat project using template sample_project点击:

此时我们发现新建好了一个空白工程:

此时左侧的相关文件功能分别为:

|----------------|---------------------------------|
| 文件名 | 功能描述 |
| .devcontainer | 和Docker相关的配置文件(系统自动生成,不需要用户修改) |
| .vscode | 和vscode相关的配置文件(系统自动生成,不需要用户修改) |
| build | 编译项目文件(编译项目后会自动生成,不需要用户修改) |
| main | 主程序目录,系统自动生成的代码 |
| CMakeLists.txt | CMake配合文件,用于构建项目编译环境 |
| README.md | 项目说明文档 |
| sdkconfig | SDK配置,在这里可选择enable/disable某一个模块 |

随便打一句话,编译一下看看是否成功:

cpp 复制代码
#include <stdio.h>

void app_main(void)
{
    printf("Hellow esp32!!!\n");
}

点击构建,烧录和监视按键可以发现打印数据:

空白项目创建完成。

3. 调试相关介绍

|----|-------------|
| 编号 | 功能介绍 |
| 1 | 当前项目 |
| 2 | 当前版本 |
| 3 | 选择烧录方式 |
| 4 | 选择烧录口 |
| 5 | 芯片设备 |
| 6 | SDK配置编辑器 |
| 7 | 清理构建的项目 |
| 8 | 构建项目 |
| 9 | 烧录 |
| 10 | 监听 |
| 11 | 调试 |
| 12 | 构建,烧录,监听 |
| 13 | 打开ESP-IDF终端 |
| 14 | 执行自定义任务 |
| 15 | 问题提示 |

4. 代码编写

在代码开始编写前,我们最好找到ESP32-IDF相关的编程指南,方便了解引脚功能,编写代码:

快速入门 - ESP32-S3 - --- ESP-IDF 编程指南 v5.5 文档

找打GPIO相关的章节:

代码就用上面创建的工程在里面来添加把。

4.1 包含头文件

想要调用GPIO口相关API函数需要将其头文件包含进来:

cpp 复制代码
#include "driver/gpio.h"

4.2 引脚配置

这里我们可以参考STM32的引脚配置方便理解一些,我们在使能STM32的引脚时需要将引脚挂载到对应总线上使能时钟,然后对GPIO口其中的一些数据进行配置,将配置好的变量传给相关参数:

cpp 复制代码
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
															//使用各个外设前必须开启时钟,否则对外设的操作无效
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				//GPIO引脚,赋值为第0号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
															//函数内部会自动根据结构体的参数配置相应寄存器
															//实现GPIOA的初始化
	

ESP32的GPIO口使能大同小异,不过需要注意一点的是,STM32 采用的是传统的 ARM Cortex-M 系列架构,其外设(包括 GPIO)通常挂在不同的总线上,需要单独使能对应总线的时钟才能操作外设,这是为了降低功耗。但是ESP32 的外设时钟管理机制不同,其 GPIO 等常用外设的时钟在芯片上电后默认是使能的,不需要用户手动开启。

因此这里我们只要定义结构体变量,并且赋值即可,这里我们需要调用 gpio_config_t 函数:

cpp 复制代码
    // 配置GPIO引脚
    gpio_config_t io_conf;
   
    io_conf.pin_bit_mask = (1ULL << GPIO_NUM_1); // 设置要配置的引脚
    io_conf.mode = GPIO_MODE_OUTPUT;// 设置为输出模式
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;// 禁用下拉电阻
    io_conf.pull_up_en = GPIO_PULLUP_DISABLE;// 禁用上拉电阻
    io_conf.intr_type = GPIO_INTR_DISABLE;// 中断模式不使用式不使用

解释:

第一行代码结构体声明没少好说的,引脚配置,在 ESP32-IDF 的gpio_config_t结构体中,pin_bit_mask采用位掩码(bitmask) 方式来指定需要配置的 GPIO 引脚,其中的位掩码设计思路:

  • 每个 bit 代表一个 GPIO 引脚,bit 位置与 GPIO 编号对应
  • 当某个 bit 被设置为 1 时,表示需要配置对应的 GPIO 引脚
  • 例如:1ULL << GPIO_NUM_0 表示只配置 GPIO0
  • 若要同时配置多个引脚,可以这样写:(1ULL << GPIO_NUM_0) | (1ULL << GPIO_NUM_2) | (1ULL << GPIO_NUM_4)

ULL表示无符号长整型(64 位),确保在移位操作时不会发生溢出。

如果要同时配置 GPIO0、GPIO2 和 GPIO4,代码可以写成:

cpp 复制代码
io_conf.pin_bit_mask = (1ULL << GPIO_NUM_0) | 
                      (1ULL << GPIO_NUM_2) | 
                      (1ULL << GPIO_NUM_4);

对于模式配置,根据需求,使能就是ENABLE,失能就是DISABLE,这里就配置一个输出其他都不要,因此全是DISABLE,可以自己跳转到定义查看:


配置完后将参数写入,调用函数 gpio_config :

其实除了缺了个使能这里和STM32差不多:

cpp 复制代码
#include <stdio.h>
#include "driver/gpio.h"

void app_main(void)
{
    // 配置GPIO引脚
    gpio_config_t io_conf;
   
    io_conf.pin_bit_mask = (1ULL << GPIO_NUM_1); // 设置要配置的引脚
    io_conf.mode = GPIO_MODE_OUTPUT;// 设置为输出模式
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;// 禁用下拉电阻
    io_conf.pull_up_en = GPIO_PULLUP_DISABLE;// 禁用上拉电阻
    io_conf.intr_type = GPIO_INTR_DISABLE;// 中断模式不使用
    
    // 配置GPIO
    gpio_config(&io_conf);
}

4.3 设置输出电平

我们知道在STM32当中是通过 GPIO_ResetBits 和 GPIO_SetBits 来控制电平的高低的:

cpp 复制代码
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为低电平
		Delay_ms(500);										//延时500ms
		GPIO_SetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为高电平
		Delay_ms(500);										//延时500ms

在ESP32-IDF当中,是通过 gpio_set_level 来控制的:

cpp 复制代码
    gpio_set_level(GPIO_NUM_1, 1); // 设置GPIO0为高电平

此时的代码:

cpp 复制代码
#include <stdio.h>
#include "driver/gpio.h"

void app_main(void)
{
    // 配置GPIO引脚
    gpio_config_t io_conf;
   
    io_conf.pin_bit_mask = (1ULL << GPIO_NUM_1); // 设置要配置的引脚
    io_conf.mode = GPIO_MODE_OUTPUT;// 设置为输出模式
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;// 禁用下拉电阻
    io_conf.pull_up_en = GPIO_PULLUP_DISABLE;// 禁用上拉电阻
    io_conf.intr_type = GPIO_INTR_DISABLE;// 中断模式不使用
    
    // 配置GPIO
    gpio_config(&io_conf);

    gpio_set_level(GPIO_NUM_1, 1); // 设置GPIO0为高电平
}

4.4 延时函数

这里我使用FreeRTOS的延时函数,因此需要将FreeRTOS头文件引入进来:

cpp 复制代码
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

调用延时函数 vTaskDelay 延时500ms:

cpp 复制代码
 vTaskDelay(500/portTICK_PERIOD_MS); // 延时500毫秒,portTICK_PERIOD_MS是FreeRTOS的时间基数(通常为1ms)

此时完整代码:

cpp 复制代码
#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void app_main(void)
{
    // 配置GPIO引脚
    gpio_config_t io_conf;
   
    io_conf.pin_bit_mask = (1ULL << GPIO_NUM_1); // 设置要配置的引脚
    io_conf.mode = GPIO_MODE_OUTPUT;// 设置为输出模式
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;// 禁用下拉电阻
    io_conf.pull_up_en = GPIO_PULLUP_DISABLE;// 禁用上拉电阻
    io_conf.intr_type = GPIO_INTR_DISABLE;// 中断模式不使用
    
    // 配置GPIO
    gpio_config(&io_conf);

    while (1)
    {
        gpio_set_level(GPIO_NUM_1, 1); // 设置GPIO0为高电平  
        printf("LED_ON!!!\r\n");     
        vTaskDelay(500/portTICK_PERIOD_MS); // 延时500毫秒,portTICK_PERIOD_MS是FreeRTOS的时间基数(通常为1ms)

        gpio_set_level(GPIO_NUM_1, 0); // 设置GPIO0为高电平       
        printf("LED_OFF!!!\r\n");  
        vTaskDelay(500/portTICK_PERIOD_MS); // 延时500毫秒,portTICK_PERIOD_MS是FreeRTOS的时间基数(通常为1ms)
    }
}

4.5 调试

下载调试看一下:

可以看到灯闪烁,数据也交替打印:

这里放不了视频,就只能通过Printf打印来看了,等之后研究研究,更多使用可以参考下方链接。

ESP32入门开发·Windows平台下开发环境的搭建-CSDN博客
ESP32学习笔记_时光の尘的博客-CSDN博客

相关推荐
xiaobobo333042 分钟前
C语言中关于普通变量和指针变量、结构体包含子结构体或包含结构体指针的一些思考
c语言·开发语言·结构体指针
里昆2 小时前
【AI】Pycharm中要注意Python程序文件的位置
ide·python·学习·pycharm
John.Lewis3 小时前
数据结构初阶(8)二叉树的顺序结构 && 堆
c语言·数据结构·算法
一枚小小程序员哈3 小时前
基于Android的音乐播放器/基于android studio的音乐系统/音乐管理系统
android·ide·android studio
程序猿编码3 小时前
基于LLVM的memcpy静态分析工具:设计思路与原理解析(C/C++代码实现)
c语言·c++·静态分析·llvm·llvm ir
再睡一夏就好4 小时前
【排序算法】④堆排序
c语言·数据结构·c++·笔记·算法·排序算法
再睡一夏就好4 小时前
【排序算法】⑥快速排序:Hoare、挖坑法、前后指针法
c语言·数据结构·经验分享·学习·算法·排序算法·学习笔记
李永奉6 小时前
C语言—数组和指针练习题合集(二)
c语言·开发语言
草莓熊Lotso7 小时前
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day2
c语言·经验分享·笔记·其他