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_OUTPUT
或GPIO_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));
}
}