学习目的及目标
- 掌握 LED 灯电路设计:控制方式
- 掌握 ESP32 定时器的库函数
写 LED 闪烁灯程
实验原理
本实验板使用esp32自带的一个引脚为2的LED灯,使用定时器对LED灯就行亮灭控制,在定时5秒后自动重启计时器。
代码设计
- 代码逻辑
- 串口输出
代码
#include <stdio.h> #include <sdkconfig.h> #include <freertos/FreeRTOS.h> #include <freertos/task.h> #include <freertos/queue.h> #include <driver/gpio.h> #include <esp_log.h> #include <driver/gptimer.h> #include <esp_timer.h> #include <esp_types.h> #include "esp_private/periph_ctrl.h" #define LED_IO 2 static const char *TAG = "example"; //定时器句柄 esp_timer_handle_t fw_timer_handle = 0; void fw_timer_cb(void *arg) { //获取时间戳 int64_t tick = esp_timer_get_time(); ESP_LOGI(TAG,"timer cnt = %lld \r\n",tick); if (tick >50*1000*1000)//如果大于50秒则自动停止 { //定时器暂停、删除 esp_timer_stop(fw_timer_handle); ESP_LOGI(TAG,"timer is stop!!"); esp_timer_delete(fw_timer_handle); ESP_LOGI(TAG,"timer is delete!!"); //定时器重启 //esp_timer_restart(fw_timer_handle,50); esp_restart(); // ESP_LOGI(TAG,"the fw_timer static : %d",esp_timer_restart(fw_timer_handle,tick)); } //LED亮0.5一秒 gpio_set_level(LED_IO,0); vTaskDelay(500 /portTICK_PERIOD_MS); //LED灯灭0.5秒 gpio_set_level(LED_IO,1); vTaskDelay(500 /portTICK_PERIOD_MS); } void app_main(void) { //选择IO口 esp_rom_gpio_pad_select_gpio(LED_IO); //设置IO为输出 gpio_set_direction(LED_IO,GPIO_MODE_OUTPUT); //定时器结构体初始化 esp_timer_create_args_t fw_timer = { .callback = &fw_timer_cb, //回调函数 .arg = NULL, //参数 .name = "fw_timer" //定时器名称 }; //定时器创建,启动 esp_err_t err = esp_timer_create(&fw_timer,&fw_timer_handle); err =esp_timer_start_periodic(fw_timer_handle, 1000*1000 );//1秒回调 //判断是否创建并成功启动 if (err == ESP_OK) { ESP_LOGI(TAG,"fw_timer create and start OK!\r\n"); } else { printf("error: %d",err); } }
评论