当前位置: 代码迷 >> 综合 >> Ubuntu18.04 ESP32-S2 二次开发(2)- 点亮LED
  详细解决方案

Ubuntu18.04 ESP32-S2 二次开发(2)- 点亮LED

热度:101   发布时间:2023-11-21 21:27:32.0

Ubuntu18.04 ESP32-S2 二次开发(1) - 开发环境搭建
Ubuntu18.04 ESP32-S2 二次开发(2)- 点亮LED
Ubuntu18.04 ESP32-S2 二次开发(3)- 按键输入
Ubuntu18.04 ESP32-S2 二次开发(4)- 建立WIFI AP模式
Ubuntu18.04 ESP32-S2 二次开发(5)- 建立WIFI STA模式
Ubuntu18.04 ESP32-S2 二次开发(6)- 创建TCP客户端

···

Ubuntu18.04 ESP32-S2 二次开发(2)- 点亮LED

    • ···
  • 操作原理
  • ESP32 的 GPIO 接口介绍
  • ESP32 的 GPIO API介绍
  • ESP32 的 BLINK 例程
  • ESP32-S2 LED代码解析

操作原理

对于任何一款芯片,GPIO接口是其最基本的组成部分,也是一款芯片入门的最基本操作。
如何搭建环境,之前的文章已详细讲解,此处不再赘述。参考:Ubuntu18.04 ESP32-S2 二次开发(1) - 开发环境搭建
我用的是安信可ESP12K开发板,开发板自带了一个LED,查看原理图,LED连接在了GPIO2上。

ESP12K原理图
LED 灯的阳极都是通过电阻连接到ESP32的 GPIO引脚, 只要我们控制 GPIO
引脚的电平输出状态, 即可控制 LED 灯的亮灭。 接下来我们就需要操作GPIO2了。

ESP32 的 GPIO 接口介绍

官方API手册中介绍说ESP32-S2芯片有43个物理GPIO,每个IO可以用作通用I/O或可以连接到内部外设信号。截取一部分图如下所示:
在这里插入图片描述

ESP32 的 GPIO API介绍

设置 IO 模式函数: gpio_set_pull_mode();

函数原型 gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull)
函数功能 设置 IO 模式
参数 [in] gpio_num:引脚编号,0~34(存在部分)
[in] pull:IO 模式,可以设置:
GPIO_MODE_DISABLE:不输入不输出
GPIO_MODE_INPUT:输入模式
GPIO_MODE_OUTPUT:输出模式
GPIO_MODE_OUTPUT_OD:开漏输出模式
GPIO_MODE_INPUT_OUTPUT_OD:开漏输入输出模式
GPIO_MODE_INPUT_OUTPUT:输入输出模式
返回值 ESP_OK:成功
ESP_ERR_INVALID_ARG : 参数错误

设置 IO 输出值函数: gpio_set_level();

函数原型 esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level)
函数功能 设置 IO 输出值
参数 [in]gpio_num:引脚编号,0~34(存在部分)
[in]pull:IO 模式,可以设置:
0:输出低
1:输出高
返回值 ESP_OK:成功
ESP_ERR_INVALID_ARG : 参数错误

其他的API可参考官方API手册。

ESP32 的 BLINK 例程

在官方给的例程中,也给出了LED闪烁的例子,位置在/ESP-IDF/examples/get-started/blink , 我已截了一张全部的代码图
在这里插入图片描述

宏定义 #define BLINK_GPIO CONFIG_BLINK_GPIO 中的 CONFIG_BLINK_GPIOmenuconfig来映射到对应的IO。

下面来编译此工程,和之前搭建开发环境一样,注意的是要在menuconfig步骤修改IO的引脚,输入

idf.py menuconfig

在其中选择 Example Configuration(通过上下键选择)在这里插入图片描述
然后回车键进入,将GPIO number改为对应连接到LED的IO,我对应开发板的IO是2,然后保存退出,再下载即可。
在这里插入图片描述

ESP32-S2 LED代码解析

官方给的ESP32-S2代码已经集成了Freertos实时操作系统,所以我们的代码都是在这基础上修改的。若是不了解Freertos,建议学习一下。

整个代码如下:

// An highlighted block
void app_main(void)
{
    /* Configure the IOMUX register for pad BLINK_GPIO (some pads aremuxed to GPIO on reset already, but some default to otherfunctions and need to be switched to GPIO. Consult theTechnical Reference for a list of pads and their defaultfunctions.)*/gpio_reset_pin(BLINK_GPIO);/* Set the GPIO as a push/pull output */gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);while(1) {
    /* Blink off (output low) */printf("Turning off the LED\n");gpio_set_level(BLINK_GPIO, 0);vTaskDelay(1000 / portTICK_PERIOD_MS);/* Blink on (output high) */printf("Turning on the LED\n");gpio_set_level(BLINK_GPIO, 1);vTaskDelay(1000 / portTICK_PERIOD_MS);}
}

所有的代码入口都是 void app_main(void) ,这一点和我们写C程序int main入口不太一样,原因是在Freertos系统上运行,这一点不需要太多的解释。

接下来就是 gpio_reset_pin(BLINK_GPIO); ,先复位GPIO,然后设置GPIO输入输出功能:

gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);

BLINK_GPIO 是一个宏定义,取值由硬件的IO连接决定。
GPIO_MODE_OUTPUT 是输出模式

GPIO的设置就是这两句就完成了,然后就是while(1) 死循环,其中的延时函数是:

vTaskDelay(1000 / portTICK_PERIOD_MS);

建议用上面的写法,vTaskDelay是延时多少个时钟节拍。如果直接写1000,必然不是延时1000ms,因为ESP32-S2的freertos时钟节拍不是1ms。

gpio_set_level(BLINK_GPIO, 1);

gpio_set_level 函数用于设置IO的电平,这个也非常好理解。

总结一下,ESP32-S2的GPIO输出操作还是非常的简单。