[ESP32]点亮LED灯

ESP32C3点亮LED灯

准备

开发板:合宙ESP32C3开发板,USB数据线,VSCode+ESP32插件

代码

通过开发板的原理图可知两个LED分别连接在IO12和IO13引脚上:
原理图

相关库函数

参考自ESP32官网:API手册
引入头文件:components/driver/include/driver/gpio.h

1. GPIO模式设置
esp_err_t gpio_config(constgpio_config_t *pGPIOConfig)

参数是个结构体指针,拥有四个成员:
uint64_t pin_bit_mask: 使用位掩码进行设置,每个位映射到一个 GPIO‎
gpio_mode_tmode: ‎设置输入/输出模式‎
gpio_pullup_tpull_up_en: 上拉使能
gpio_pulldown_tpull_down_en: 下拉使能
gpio_int_type_tintr_type: 中断类型

2. GPIO重置
esp_err_t gpio_reset_pin(gpio_num_tgpio_num)

‎将一个IO口重置为默认状态(选择GPIO功能,启用上拉并禁用输入和输出)

3. 输出电平
esp_err_t gpio_set_level(gpio_num_tgpio_num, uint32_t level)
4. 设置方向
esp_err_tgpio_set_direction(gpio_num_tgpio_num, gpio_mode_tmode)

方向选择为GPIO_MODE_OUTPUTGPIO_MODE_INPUT

整体代码

LED闪烁代码修改自官方例程:blink

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "led_strip.h"
#include "sdkconfig.h"

static const char *TAG = "example";

/* 定义LED引脚 */
#define BLINK_GPIO_1 12
#define BLINK_GPIO_2 13

static uint8_t s_led_state = 0;

static void blink_led(void)
{
    /* Set the GPIO level according to the state (LOW or HIGH)*/
    gpio_set_level(BLINK_GPIO_1, s_led_state);
    gpio_set_level(BLINK_GPIO_2, s_led_state);
}

static void configure_led(void)
{
    ESP_LOGI(TAG, "Example configured to blink GPIO LED!");
    gpio_reset_pin(BLINK_GPIO_1);
    gpio_reset_pin(BLINK_GPIO_2);
    /* Set the GPIO as a push/pull output */
    gpio_set_direction(BLINK_GPIO_1, GPIO_MODE_OUTPUT);
    gpio_set_direction(BLINK_GPIO_2, GPIO_MODE_OUTPUT);
}

void app_main(void)
{
    /* Configure the peripheral according to the LED type */
    configure_led();

    while (1) {
        ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF");
        blink_led();
        /* Toggle the LED state */
        s_led_state = !s_led_state;
        vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
    }
}

下载至开发板后可看到两个LED开始闪烁。

呼吸灯

相关库函数

后续补充

整体代码

设置两个任务,一个任务让LED1闪烁,一个任务让LED2呼吸。

#include <stdio.h>
#include "driver/gpio.h"
#include "driver/ledc.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#define LED1_PIN 12
#define LED2_PIN 13

TaskHandle_t xHandle_task_led = NULL;

/**
 * @brief led_pwm task
 *
 */
void app_led_pwm(void *pvParameters)
{
    /* setup */
    ledc_timer_config_t ledc_timer = {
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .timer_num = LEDC_TIMER_0,
        .duty_resolution = LEDC_TIMER_13_BIT,
        .freq_hz = 5000,
        .clk_cfg = LEDC_AUTO_CLK,
    };

    ledc_channel_config_t ledc_channel_0 = {
        .channel = LEDC_CHANNEL_0,
        .duty = 0,
        .gpio_num = LED2_PIN,
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .hpoint = 0,
        .timer_sel = LEDC_TIMER_0,
    };

    ledc_timer_config(&ledc_timer);
    ledc_channel_config(&ledc_channel_0);

    /* endless */
    for (;;)
    {
        for (int i = 0; i < 8191; i += 10)
        {
            ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, i);
            ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0);
            vTaskDelay(pdMS_TO_TICKS(10));
        }
        for (int i = 8191; i > 0; i -= 10)
        {
            ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, i);
            ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0);
            vTaskDelay(pdMS_TO_TICKS(10));
        }
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

/**
 * @brief main task
 *
 */
void app_main(void)
{
    xTaskCreatePinnedToCore(app_led_pwm, "task-led_pwm", 2048, NULL, 1, &xHandle_task_led, tskNO_AFFINITY);

    gpio_config_t led = {
        .pin_bit_mask = 1 << LED1_PIN,
        .mode = GPIO_MODE_OUTPUT,
        .pull_up_en = GPIO_PULLUP_DISABLE,
        .pull_down_en = GPIO_PULLDOWN_DISABLE,
        .intr_type = GPIO_INTR_DISABLE,
    };

    gpio_config(&led);

    int state = 0;

    for (;;)
    {
        state = !state;
        gpio_set_level(LED1_PIN, state);
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零零零耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值