前言
开发环境:ESP-IDF 4.3
操作系统:Windows10 专业版
开发板:自制的ESP32-WROOM-32E
我们已经学习了在主函数里操作GPIO引脚的方式点亮LED灯,也学习了如何使用任务,现在我们来学习使用任务的方式来操作LED灯。
头文件和宏
先创建一个新工程。
然后在main.c里编写头文件和宏定义:
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include <esp_log.h>
#define LED 2//GPIO引脚号
任务函数
编写我们的任务函数,功能是初始化GPIO引脚和控制GPIO高低电平输出:
static const char *TAG = "LED_Task";
void LED_Task(void *param)
{
gpio_pad_select_gpio(LED);//选择GPIO
gpio_set_direction(LED, GPIO_MODE_OUTPUT);// 设置GPIO为推挽输出模式
int LED_STATUE = 0;
while(1)
{
ESP_LOGI(TAG, "LED STATUE%d\n",LED_STATUE);
gpio_set_level(LED, LED_STATUE);// GPIO输出电平(1或者0)
vTaskDelay(1000 / portTICK_PERIOD_MS);//延时1s
LED_STATUE = !LED_STATUE;
}
}
主函数
编写app_main()函数,只需要在主函数中执行我们的任务即可:
void app_main(void)
{
xTaskCreate(LED_Task,"LED_Task",2048,NULL,1,NULL);//创建任务
}
完整代码
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include <esp_log.h>
#define LED 2
static const char *TAG = "LED_Task";
void LED_Task(void *param)
{
gpio_pad_select_gpio(LED);//选择GPIO
gpio_set_direction(LED, GPIO_MODE_OUTPUT);// 设置GPIO为推挽输出模式
int LED_STATUE = 0;
while(1)
{
ESP_LOGI(TAG, "LED STATUE%d\n",LED_STATUE);
gpio_set_level(LED, LED_STATUE);// GPIO输出电平(1或者0)
vTaskDelay(1000 / portTICK_PERIOD_MS);//延时1s
LED_STATUE = !LED_STATUE;
}
}
void app_main(void)
{
xTaskCreate(LED_Task,"LED_Task",2048,NULL,1,NULL);//创建任务
}
编译并烧录至ESP32中,可以看到灯一亮一闪,并且串口有下方输出:
演示效果
如下: