开发板 正点原子DNESP32S3 BOX3
使用开发板GPIO_NUM_13引脚接LED,实现 LED 闪烁。

/**
 * 实验平台:正点原子 ESP32S3 BOX3 开发板
 * 功能: FreeRTOS 任务方式实现 LED 闪烁
 */
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "nvs_flash.h"
#include "driver/gpio.h"

#define LED_GPIO_PIN            GPIO_NUM_13
#define LED_BLINK_INTERVAL_MS   1000

/**
 * @brief  LED 硬件初始化
 */
void led_init(void)
{
    gpio_config_t led_conf = {
        .pin_bit_mask = (1ULL << LED_GPIO_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_conf);
    gpio_set_level(LED_GPIO_PIN, 1); // 默认熄灭
}

/**
 * @brief  LED 闪烁任务函数(FreeRTOS 标准任务原型)
 * @param  pvParameters 任务传入参数,本例未使用
 */
static void led_blink_task(void *pvParameters)
{
    led_init(); // 任务内完成硬件初始化

    while (1)
    {
        gpio_set_level(LED_GPIO_PIN, 0);
        printf("LED state: ON\n");
        vTaskDelay(pdMS_TO_TICKS(LED_BLINK_INTERVAL_MS));

        gpio_set_level(LED_GPIO_PIN, 1);
        printf("LED state: OFF\n");
        vTaskDelay(pdMS_TO_TICKS(LED_BLINK_INTERVAL_MS));
    }

    // 正常情况下任务不会退出,此处仅为语法完整性
    vTaskDelete(NULL);
}

/**
 * @brief  程序入口
 */
void app_main(void)
{
    esp_err_t ret;

    // 初始化 NVS
    ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ESP_ERROR_CHECK(nvs_flash_init());
    }

    // 创建 LED 闪烁任务
    BaseType_t task_ret = xTaskCreate(
        led_blink_task,    // 任务函数入口
        "led_blink",       // 任务名称(调试用)
        2048,              // 任务栈大小(单位:字,32位系统下1字=4字节)
        NULL,              // 传入任务的参数
        5,                 // 任务优先级(数字越大优先级越高)
        NULL               // 任务句柄(不需要控制任务可传NULL)
    );

    if (task_ret != pdPASS)
    {
        printf("LED task create failed!\n");
    }

    // app_main 任务执行完后会被系统自动回收
    // LED 任务独立运行,不受主任务结束影响
}

更多推荐