ESP32_定时器的简单使用

冇雨
2023-09-12 / 0 评论 / 154 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年09月30日,已超过449天没有更新,若内容或图片失效,请留言反馈。

学习目的及目标

  1. 掌握 LED 灯电路设计:控制方式
  2. 掌握 ESP32 定时器的库函数
  3. 写 LED 闪烁灯程

    实验原理

    本实验板使用esp32自带的一个引脚为2的LED灯,使用定时器对LED灯就行亮灭控制,在定时5秒后自动重启计时器。

代码设计

  1. 代码逻辑
    代码逻辑.png
  2. 串口输出
    串口输出.png
  3. 代码

    #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);
     }
    }
    
1

评论

博主关闭了所有页面的评论