目录
1. 环境搭建
2. 创建项目
3. 调试相关介绍
4. 代码编写
4.1 包含头文件
4.2 引脚配置
4.3 设置输出电平
4.4 延时函数
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某一个模块 |
随便打一句话,编译一下看看是否成功:
#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函数需要将其头文件包含进来:
#include "driver/gpio.h"
4.2 引脚配置
这里我们可以参考STM32的引脚配置方便理解一些,我们在使能STM32的引脚时需要将引脚挂载到对应总线上使能时钟,然后对GPIO口其中的一些数据进行配置,将配置好的变量传给相关参数:
/*开启时钟*/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速度,赋值为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数//函数内部会自动根据结构体的参数配置相应寄存器//实现GPIOA的初始化
ESP32的GPIO口使能大同小异,不过需要注意一点的是,STM32 采用的是传统的 ARM Cortex-M 系列架构,其外设(包括 GPIO)通常挂在不同的总线上,需要单独使能对应总线的时钟才能操作外设,这是为了降低功耗。但是ESP32 的外设时钟管理机制不同,其 GPIO 等常用外设的时钟在芯片上电后默认是使能的,不需要用户手动开启。
因此这里我们只要定义结构体变量,并且赋值即可,这里我们需要调用 gpio_config_t 函数:
// 配置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,代码可以写成:
io_conf.pin_bit_mask = (1ULL << GPIO_NUM_0) | (1ULL << GPIO_NUM_2) | (1ULL << GPIO_NUM_4);
对于模式配置,根据需求,使能就是ENABLE,失能就是DISABLE,这里就配置一个输出其他都不要,因此全是DISABLE,可以自己跳转到定义查看:
配置完后将参数写入,调用函数 gpio_config :
其实除了缺了个使能这里和STM32差不多:
#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;// 中断模式不使用// 配置GPIOgpio_config(&io_conf);
}
4.3 设置输出电平
我们知道在STM32当中是通过 GPIO_ResetBits 和 GPIO_SetBits 来控制电平的高低的:
GPIO_ResetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为低电平Delay_ms(500); //延时500msGPIO_SetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为高电平Delay_ms(500); //延时500ms
在ESP32-IDF当中,是通过 gpio_set_level 来控制的:
gpio_set_level(GPIO_NUM_1, 1); // 设置GPIO0为高电平
此时的代码:
#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;// 中断模式不使用// 配置GPIOgpio_config(&io_conf);gpio_set_level(GPIO_NUM_1, 1); // 设置GPIO0为高电平
}
4.4 延时函数
这里我使用FreeRTOS的延时函数,因此需要将FreeRTOS头文件引入进来:
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
调用延时函数 vTaskDelay 延时500ms:
vTaskDelay(500/portTICK_PERIOD_MS); // 延时500毫秒,portTICK_PERIOD_MS是FreeRTOS的时间基数(通常为1ms)
此时完整代码:
#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;// 中断模式不使用// 配置GPIOgpio_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博客