ESP32S3 ——点亮一个LED
所谓工欲善其事,必先点其灯。
点灯应该是每位工程师拿到一块新板子时,第一件做的事。
本篇主要介绍如何操纵esp32S3的IO口,并用IO口使一个led闪烁。
如下是ESP-IDF的编程指南,在后面的学习过程中,会经常使用,可以添加一个书签。
esp32S3 IO介绍
ESP32-S3 芯片具有 45 个物理 GPIO 管脚(GPIO0 ~ GPIO21 和 GPIO26 ~ GPIO48)。每个管脚都可用作一个通用 IO
更位厉害的是,通过 IO MUX、RTC IO MUX 和 GPIO 交换矩阵,可配置外设模块的输入信号来源于任何的 IO 管脚,并且外设模块的输出信号也可连接到任意 IO 管脚。不过,关于这项技术,将在其他篇章再做了解,不在本篇深入。
配置IO口
关于IO口的配置,这里提供了两种方法
方法1:
#define LED_IO 38
void led_io_config(void)
{
gpio_config_t io_conf;
io_conf.pin_bit_mask = (1ULL<<LED_IO) ;
io_conf.intr_type = GPIO_INTR_DISABLE;
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
io_conf.mode =GPIO_MODE_OUTPUT;
gpio_config(&io_conf);
}
通过设置一个结构体gpio_config_t,将IO38配置为输出模式,无上拉下拉且不支持中断。
使用该方法的好处就是随心所欲,你可以按照自己的意向将对应的IO口配置为输入或输出,上拉或下拉,边沿中断或电平中断。。。。
方法2:
这是一种更为简易的配置方法
gpio_reset_pin(LED_IO );
gpio_set_direction(LED_IO , GPIO_MODE_OUTPUT);//输出
先通过gpio_reset_pin函数初始化一个IO口,然后再使用gpio_set_direction函数配置这个函数的输入输出模式。
让我们点进gpio_reset_pin函数,看看它究竟干了些什么
esp_err_t gpio_reset_pin(gpio_num_t gpio_num)
{
assert(GPIO_IS_VALID_GPIO(gpio_num));
gpio_config_t cfg = {
.pin_bit_mask = BIT64(gpio_num),
.mode = GPIO_MODE_DISABLE,
//for powersave reasons, the GPIO should not be floating, select pullup
.pull_up_en = true,
.pull_down_en = false,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&cfg);
return ESP_OK;
}
可以看到本质上这个函数也是配置gpio_config_t结构体
IO口操控
配置完IO口后,让我们再来认识一个IO口控制函数:
esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level)
该函数可以设置IO口的高低电平
例:
gpio_set_level(LED_IO, 0);//将led引脚配置为低电平
gpio_set_level(LED_IO, 1);//将led引脚配置为高电平
点个灯先
通过现有的知识,我们可以编写一个最为简易的LED灯闪烁的程序
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include "driver/gpio.h"
#define LED_IO 38
extern void led_wink(void);
void app_main(void)
{
gpio_reset_pin(LED_IO);
gpio_set_direction(LED_IO, GPIO_MODE_OUTPUT);//输出
while (true) {
led_wink();
sleep(1);
}
}
void led_wink(void)
{
static uint8_t flag =0;
if(flag == 0)
{
gpio_set_level(LED_IO, 1);//将led引脚配置为高电平;
flag =1;
}
else
{
gpio_set_level(LED_IO, 0);//将led引脚配置为高电平;
flag =0;
}
}