0%

ESP32_LED

ESP32控制LED灯亮灭 (裸机模式&FreeRTOS系统)

1.功能需求

  • 裸机模式:以1s间隔点亮/熄灭LED
  • FreeRTOS:以任务的方式:1s间隔点亮/熄灭LED

2.硬件原理图

ESP32开发板介绍

3.软件设计

3.1 裸机代码

1.硬件初始化

  • 绑定GPIO引脚
  • GPIO功能模式: GPIO推挽输入/输出/开漏输入/输出
  • 设置GPIO输出电平
1
2
3
4
5
6
7
8
void bsp_GpioInit(void)
{
ESP_LOGI(TAG, ">>>===== 1.GPIO初始化 =====<<<");
gpio_pad_select_gpio(GPIO_LED_Pin); // 选择要操作的GPIO
gpio_set_direction(GPIO_LED_Pin, GPIO_MODE_OUTPUT); // 设置GPIO为推挽输出模式
ESP_LOGI(TAG, ">>>===== GPIO初始化成功! =====<<<");
}

API介绍

头文件路径: #include "driver/gpio.h"

函数名 描述 案例
void gpio_pad_select_gpio(uint8_t gpio_num); 绑定GPIO gpio_pad_select_gpio(4)
esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode); 设置GPIO功能模式(输入/输出方向) gpio_set_direction(4,GPIO_MODE_DISABLE)
GPIO_MODE_DISABLE
GPIO_MODE_INPUT
GPIO_MODE_OUTPUT
GPIO_MODE_OUTPUT_OD
GPIO_MODE_INPUT_OUTPUT_OD
GPIO_MODE_INPUT_OUTPUT
void vTaskDelay(uint ticks) 延迟n个节拍 vTaskDelay(1000 / portTICK_PERIOD_MS)

主函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Hello Bug Example

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include <esp_log.h>
#include "driver/gpio.h"

#define GPIO_LED_Pin 4
const char* TAG = "LED";

void app_main()
{
bool toggleFlag = true;

bsp_GpioInit();

for(;;){

ESP_LOGI(TAG, "Turning %s...\n",toggleFlag?"On":"Off");
vTaskDelay(1000 / portTICK_PERIOD_MS);
gpio_set_level(GPIO_LED_Pin,toggleFlag);
toggleFlag=!toggleFlag;

}
ESP_LOGI(TAG, "Restarting now.");
//fflush(stdout);
esp_restart();
}

效果

SwitchLED_Debug;

3.2 FreeRTOS代码

API介绍

函数名 描述 案例
portBASE_TYPE xTaskCreate(pdTASK_CODE pvTaskCode,const portCHAR * const pcName,unsigned portSHORT usStackDepth,void *pvParameters,unsigned portBASE_TYPE uxPriority,xTaskHandle *pvCreatedTask); 创建任务句柄
pvTaskCode:指向任务函数,一般死循环
pcName:任务函数的别名,仅仅是方便调试所用
usStackDepth:任务堆栈的深度,定义了堆栈可以包含的变量数,其字节数大小=堆栈深度*堆栈宽度。
pvParameters:作为参数的指针,当任务创建时
uxPriority:任务的优先级。包括MPU支持的系统可以选择在特权模式创建任务,通过设置优先级参数的portPRIVILEGE_BIT位。比如,创建一个特权任务在优先级2,则uxPriority 应当设置为(2|portPRIVILEGE_BIT)
pvCreatedTask:回传一个句柄,以便创建的任务可以被关联。返回值:pdPASS,如果任务成功创建且添加到就绪列表,否则返回一个错误代码,见 projdefs.h
xTaskCreate(&blink_task,"LED_Task",configMINIMAL_STACK_SIZE,NULL,5,NULL);

blink_task创建

1
2
3
4
5
6
7
8
9
10
11
  void blink_task(void *pvParameter)
{
bool toggleFlag = true;
ESP_LOGI(TAG, "LED Blink Task开始...\n");
for(;;){
ESP_LOGI(TAG, "Turning %s...",toggleFlag?"On":"Off");
vTaskDelay(1000 / portTICK_PERIOD_MS);
gpio_set_level(GPIO_LED_Pin,toggleFlag);
toggleFlag=!toggleFlag;
}
}

主函数

1
2
3
4
5
6
void app_main()
{
bsp_GpioInit();
xTaskCreate(&blink_task,"LED_Task",configMINIMAL_STACK_SIZE,NULL,5,NULL);
//for(;;); 似乎不能出现
}

效果

LED_Task_Debug;