【ESP32 IDF】ESPTIMER定时器

文章目录

  • 前言
  • 一、ESPTIMER定时器的介绍
    • 1.1 定时器是什么
    • 1.2 ESPTIMER定时器的介绍
  • 二、ESPTIMER的使用
    • 2.1 简单使用过程
    • 2.2 停止定时器
    • 2.3 删除定时器
  • 三、示例代码
  • 总结


前言

在ESP32 IDF开发框架中,ESPTIMER是一个功能强大的定时器模块,用于实现定时任务和周期性操作。ESPTIMER可以帮助开发者按照预定的时间间隔执行特定的代码,从而实现定时触发、周期性任务、延时执行等功能。本文将介绍ESPTIMER的基本用法和一些常见的应用场景。


一、ESPTIMER定时器的介绍

1.1 定时器是什么

单片机(Microcontroller)中的定时器是一种硬件模块,用于计时、计数和生成定时事件。定时器通常由一个或多个计时/计数器组成,并且具有相关的控制逻辑和寄存器。它是单片机中的重要组件,广泛应用于各种实时计时、时间测量和定时操作的应用中。

定时器在单片机中的作用包括:

事件计时:定时器可以用于测量两个事件之间的时间间隔。开发者可以使用定时器来计算传感器读数之间的时间间隔、测量电平持续时间或定时特定操作的执行时间。

周期性操作:定时器可以配置为以固定的时间间隔生成中断或触发相关事件。这种周期性操作对于周期性数据采集、控制信号的生成和实时任务的调度非常有用。

脉冲宽度调制(PWM):定时器通常可以生成PWM信号,用于控制模拟电路、执行数字-模拟转换或驱动电机等设备。通过调整定时器的计数值和输出设置,可以实现不同占空比的PWM信号。

超时检测:使用定时器可以实现超时检测功能,以便在特定时间内接收或处理输入数据。例如,通过设定定时器的计数值和预定时间,可以检测输入信号是否在指定时间内到达。

时基生成:定时器可以用于生成时基信号,例如时钟信号或其他时间参考信号,用于同步其他硬件模块的操作。

定时器在单片机中的具体实现和功能会根据芯片架构和制造商的不同而有所差异。每个单片机都会提供特定的定时器模块,并且通常包括计数器、预分频器、控制寄存器和中断机制等。开发者可以通过配置和操作这些寄存器来实现所需的定时功能。

总的来说,单片机中的定时器是一种硬件模块,用于计时、计数和生成定时事件。它在实时计时、时间测量、周期性操作和时基生成等应用中发挥着重要作用。开发者可以利用定时器来满足各种特定的计时和定时需求,从而实现单片机系统的功能扩展和更高级的应用。

1.2 ESPTIMER定时器的介绍

SPTIMER是Espressif Systems提供的定时器功能库,集成在ESP32 IDF(IoT Development Framework)中。它为开发者提供了一种简单而强大的方式来实现定时任务和周期性操作。

ESPTIMER特点如下:

精确的定时控制:ESPTIMER通过使用硬件定时器,可以以微秒级的精度进行定时,非常适用于对时间精度有较高要求的应用场景。

多任务支持:ESPTIMER可以同时管理多个定时器任务,每个任务可以独立运行,互不干扰。这意味着可以用一个单独的定时器来处理多个不同的任务。

灵活的任务调度:ESPTIMER提供了丰富的任务调度选项,包括在指定时间触发、循环执行、延时执行等。开发者可以根据自己的需求,轻松地配置定时器按照预定的时间间隔执行代码。

多种工作模式:ESPTIMER支持多种工作模式,包括单次定时器、重复定时器和高精度定时器。单次定时器在触发后只会执行一次任务,重复定时器会按照设置的时间间隔周期性执行任务,高精度定时器提供了更高的时间精度。

在idf中,除了ESPTIMER软件定时器外,还有GPTIMER定时器,他们的区别如下:
在ESP32 IDF(IoT Development Framework)中,ESPTIMER和GPTIMER是用于处理定时器功能的不同组件。

ESPTIMER(ESP32 Timer):ESPTIMER是ESP32 IDF框架提供的软件定时器组件。它是基于硬件定时器实现的,但由ESP32的系统时钟(80 MHz)驱动,并通过软件进行计数和处理。ESPTIMER可用于创建和管理多个定时器实例,并执行定时操作,如定时任务、定时中断等。

GPTIMER(General Purpose Timer):GPTIMER是ESP32的硬件定时器组件。ESP32芯片上具有多个GPTIMER,每个GPTIMER都有自己的配置寄存器和计数器。GPTIMER是与ESP32的硬件平台紧密相关的,可以执行各种基于时间的操作,如生成精确的定时触发信号、捕获外部事件、产生PWM信号等。

区别:

实现方式:ESPTIMER是基于ESP32系统时钟的软件实现,而GPTIMER是硬件定时器组件。
灵活性:ESPTIMER提供了更多的灵活性和可配置性,允许开发者根据需要创建和管理多个定时器实例。而GPTIMER是固定的硬件定时

二、ESPTIMER的使用

2.1 简单使用过程

对于IDF的ESPTIMER定时器我们需要进行下面这些步骤:

  1. 定义定时器句柄
    定时器句柄的类型为:esp_timer_handle_t
    我们可以这样定义对应的句柄变量:esp_timer_handle_t esp_tim_handle;
  2. 定义定时器结构体
    定时器结构体的类型为:esp_timer_create_args_t
    他的定义如下:
typedef struct {
    esp_timer_cb_t callback;        //!< Function to call when timer expires
    void* arg;                      //!< Argument to pass to the callback
    esp_timer_dispatch_t dispatch_method;   //!< Call the callback from task or from ISR
    const char* name;               //!< Timer name, used in esp_timer_dump function
    bool skip_unhandled_events;     //!< Skip unhandled events for periodic timers
} esp_timer_create_args_t;

esp_timer_cb_t callback: 这是一个函数指针,用于指定定时器触发时要调用的回调函数。当定时器到达设定的时间后,系统将调用此回调函数执行相应的任务。

void* arg: 这是一个指针,用于传递给回调函数的参数。您可以将任何类型的数据结构转换为void*指针,并在回调函数中进行类型转换和使用。

esp_timer_dispatch_t dispatch_method: 这是一个枚举类型的成员,用于指定回调函数是从任务(task)还是中断服务函数(ISR)中调用。它可以采用以下两个值:

ESP_TIMER_TASK: 表示从任务中调用回调函数(默认值)。
ESP_TIMER_ISR: 表示从中断服务函数中调用回调函数。
const char* name: 这是一个指向字符数组的指针,用于为定时器指定一个名称。该名称在调试和跟踪定时器时非常有用,例如在调用esp_timer_dump()函数时使用。

bool skip_unhandled_events: 这是一个布尔类型的标志,用于控制是否跳过未处理的事件(仅适用于周期性定时器)。如果设置为true,周期性定时器在前一个定时器事件未处理之前将不会生成后续事件。如果设置为false,则每个定时器事件都将生成一个新的事件,即使前一个事件尚未处理。

  1. 创建一个事件
    我们可以使用下面这个函数创建一个事件:
esp_err_t esp_timer_create(const esp_timer_create_args_t* create_args,
                           esp_timer_handle_t* out_handle);

参数1为定时器结构体的指针,参数2为定时器句柄

  1. 开启定时器,并设置回调调用的时间
    我们可以使用下面这个函数开启定时器并且指定回调函数调用的时间:
    他的时间单位为us
esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer, uint64_t period);

2.2 停止定时器

我们可以使用下面这个函数停止指定定时器,参数为定时器的句柄:

esp_err_t esp_timer_stop(esp_timer_handle_t timer);

2.3 删除定时器

我们可以使用下面这个函数删除指定的定时器:
参数为定时器的句柄

esp_err_t esp_timer_delete(esp_timer_handle_t timer);

三、示例代码

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_timer.h"

// 定时器回调函数,每秒打印一次消息
void timer_callback(void* arg)
{
    printf("Timer expired\n");
}

void app_main()
{
    // 创建一个esp_timer_create_args_t结构体,设置定时器参数
    esp_timer_create_args_t timer_args = {
        .callback = timer_callback,                 // 设置回调函数
        .name = "my_timer",                          // 设置定时器名称
        .dispatch_method = ESP_TIMER_TASK,           // 从任务中调用回调函数
        .skip_unhandled_events = false               // 不跳过未处理的事件
    };

    // 创建定时器
    esp_timer_handle_t timer;
    esp_timer_create(&timer_args, &timer);

    // 启动定时器,每秒触发一次
    esp_timer_start_periodic(timer, 1000000); // 1000000微秒 = 1秒

    // 等待10秒钟
    vTaskDelay(10000 / portTICK_PERIOD_MS); // 等待10秒

    // 停止定时器
    esp_timer_stop(timer);

    // 删除定时器
    esp_timer_delete(timer);

    // 任务结束
    vTaskDelete(NULL);
}

在这里插入图片描述


总结

ESPTIMER是ESP32 IDF开发框架中提供的定时器模块,具有以下特点和优势:

精确的定时控制:ESPTIMER可以以微秒级的精度进行定时,可以满足对时间精度要求较高的应用场景。

多种工作模式:ESPTIMER支持3种工作模式,包括单次定时器、重复定时器和高精度定时器。开发者可以灵活选择适合自己需求的工作模式。

多任务支持:ESPTIMER可以同时管理多个定时器任务,每个定时器任务可以独立运行,互不干扰。

灵活的任务调度:ESPTIMER提供了丰富的任务调度选项,例如在指定时间触发、循环执行、延时执行等。

ESPTIMER在很多应用中都发挥着重要作用,例如:

定时采集数据:开发者可以利用ESPTIMER实现定时采集传感器数据或其他外部设备的数据,以保持数据的及时性和准确性。

周期性任务:ESPTIMER可以周期性地执行某些任务,例如周期性发送数据、刷新显示、控制设备状态等。

定时触发操作:通过ESPTIMER,可以实现在指定时间点触发某些操作,例如定时启动、定时关闭或定时执行某些任务。

综上所述,ESPTIMER作为ESP32 IDF开发框架的一部分,为开发者提供了强大的定时器功能,可广泛应用于各种定时任务和周期性操作的场景。开发者可以根据自己的需求,灵活地利用ESPTIMER实现定时功能,提升系统的稳定性和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/274455.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java八股文(RabbitMQ)

Java八股文のRabbitMQ RabbitMQ RabbitMQ RabbitMQ 是什么&#xff1f;它解决了哪些问题&#xff1f; RabbitMQ 是一个开源的消息代理中间件&#xff0c;用于在应用程序之间进行可靠的异步消息传递。 它解决了应用程序间解耦、消息传递、负载均衡、故障恢复等问题。 RabbitMQ …

JavaSE(上)-Day6

JavaSE&#xff08;上&#xff09;-Day6 数组数组的定义数组的初始化打印数组分析数组索引数组内存图 方法方法的定义和调用方法的重载方法的内存图 二维数组二位数组的创建和初始化二维数组的内存图 数组 1.数组是一种容器&#xff0c;可以一次存储多个相同类型的数据 数组的…

基于openresty构建运维工具链实践

本文字数&#xff1a;4591字 预计阅读时间&#xff1a;25 01 导读 如今OpenResty已广泛被各个互联网公司在实际生产环境中应用&#xff0c;在保留Nginx高并发、高稳定等特性基础上&#xff0c;通过嵌入Lua来提升在负载均衡层的开发效率并保证其高性能。本文主要介绍接口鉴权、流…

从零开始写 Docker(六)---实现 mydocker run -v 支持数据卷挂载

本文为从零开始写 Docker 系列第六篇&#xff0c;实现类似 docker -v 的功能&#xff0c;通过挂载数据卷将容器中部分数据持久化到宿主机。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; …

搭建项目后台系统基础架构

任务描述 1、了解搭建民航后端框架 2、使用IDEA创建基于SpringBoot、MyBatis、MySQL、Redis的Java项目 3、以原项目为参照搭建项目所涉及到的各个业务和底层服务 4、以原项目为例&#xff0c;具体介绍各个目录情况并参照创建相关文件夹 1、创建项目后端 BigData-KongGuan …

【MySQL】MySQL视图

文章目录 一、视图的基本使用1.创建视图2.修改了视图&#xff0c;对基表数据有影响3.修改了基表&#xff0c;对视图有影响4.删除视图 二、视图规则和限制 一、视图的基本使用 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称…

15届蓝桥杯备赛(2)

文章目录 刷题笔记(2)二分查找在排序数组中查找元素的第一个和最后一个位置寻找旋转排序数组中的最小值搜索旋转排序数组 链表反转链表反转链表II 二叉树相同的树对称二叉树平衡二叉树二叉树的右视图验证二叉搜索树二叉树的最近公共祖先二叉搜索树的最近公共祖先二叉树层序遍历…

管道(acwing,蓝桥杯,二分)

题目描述&#xff1a; 有一根长度为 len 的横向的管道&#xff0c;该管道按照单位长度分为 len 段&#xff0c;每一段的中央有一个可开关的阀门和一个检测水流的传感器。 一开始管道是空的&#xff0c;位于 Li的阀门会在 Si 时刻打开&#xff0c;并不断让水流入管道。 对于位…

WRF模型运行教程(ububtu系统)--III.运行WRF模型(官网案例)

零、创建DATA目录 # 1.创建一个DATA目录用于存放数据&#xff08;一般为fnl数据&#xff0c;放在Build_WRF目录下&#xff09;。 mkdir DATA # 2.进入 DATA cd DATA 一、WPS预处理 在模拟之前先确定模拟域&#xff08;即模拟范围&#xff09;,并进行数据预处理&#xff08…

我的尝试:Codigger + Vim

若您愿意耐心投入&#xff0c;学习 Vim 的过程其实远比想象中轻松。我对 Vim 产生兴趣&#xff0c;主要是源于它对提升生产力的巨大潜力。我尝试了 Neovim、NvChad 以及 Codigger Vim 插件&#xff0c;如今我的工作效率已远超从前。 那么&#xff0c;Vim 究竟是什么呢&#xff…

Leetcode 79. 单词搜索

心路历程&#xff1a; 做完这道题才发现是回溯&#xff0c;一开始想的是递归&#xff0c;判断完第i个字符后&#xff0c;只需要挨个判断第i1个字符在不在第i个字符的邻域。后来发现由于不能重复使用元素&#xff0c;所以需要维护一个visited列表&#xff0c;并且在遍历所有可能…

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——自适应大邻域算法(ALNS)

基于python语言&#xff0c;采用经典自适应大邻域算法&#xff08;ALNS&#xff09;对 需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整3. 求解结果4. 代码片段参考 往期优质资源 经过一年多的创作&#xff0c;目前…

Aigtek超声功率放大器产品介绍

超声功率放大器是一种特殊类型的功率放大器&#xff0c;专门用于增强和放大超声信号的功率。它在医疗、工业和科学领域中得到广泛应用。 一、超声功率放大器的基本概述 超声功率放大器是一种能够将低功率超声信号放大到更高功率水平的设备。它是超声系统的关键组成部分&#xf…

力扣1. 两数之和

思路&#xff1a;用一个map存放 已遍历过的元素和下标&#xff1b; 若当前元素是nums[i], 且该元素的另一半 target-nums[i] 在已遍历过的map里面&#xff0c;则返回两个元素的下标&#xff1b; class Solution {public int[] twoSum(int[] nums, int target) {int[] ans new…

腾讯云服务器多少钱1个月?2024一个月收费阿济格IE吧

2024腾讯云服务器多少钱一个月&#xff1f;5元1个月起&#xff0c;腾讯云轻量服务器4核16G12M带宽32元1个月、96元3个月&#xff0c;8核32G22M配置115元一个月、345元3个月&#xff0c;腾讯云轻量应用服务器61元一年折合5元一个月、4核8G12M配置646元15个月、2核4G5M服务器165元…

数据结构:详解【顺序表】的实现

1. 顺序表的定义 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。动态顺序表与数组的本质区别是——根据需要动态的开辟空间大小。 2. 顺序表的功能 动态顺序表的功能一般有如下几个&#xff1a; 初始化顺序表打印顺序…

PlantUML Integration 编写短信服务类图

PlantUML Integration 写一个类图&#xff0c;主要功能为 1、编写一个serviceSms短信服务类&#xff1b; 2、需要用到短信的地方统一调用基建层的服务即可&#xff1b; 3、可以随意切换、增加短信厂商&#xff0c;不需要更改场景代码&#xff0c;只需要更改application.yml 里面…

Redis数据结构对象中的对象共享、对象的空转时长

对象共享 概述 除了用于实现引用计数内存回收机制之外&#xff0c;对象的引用计数属性还带有对象共享的作用。 在Redis中&#xff0c;让多个键共享同一个值对象需要执行以下两个步骤: 1.将数据库键的值指针指向一个现有的值对象2.将被共享的值对象的引用计数增一 目前来说…

【Godot4.2】2D导航01 - AStar2D及其使用方法

概述 对于2D平台跳跃或飞机大战&#xff0c;以及一些直接用键盘方向键操控玩家的游戏&#xff0c;是根本用不到寻路的&#xff0c;因为只需要检测碰撞就可以了。 但是对于像RTS或战棋这样需要操控玩家到地图指定位置的移动方式&#xff0c;就绝对绕不开寻路了。 导航、碰撞与…

微信小程序接口请求出错:request:fail url not in domain list:xxxxx

一、微信小程序后台和开发者工具配的不一样导致了这个错误 先说结论&#xff1a; 开发者工具配置了https://www.xxx.cn/prod-api/ 微信后台配置了 https://www.xxx.cn 一、最开始 开发者工具配置了https://www.xxx.cn:7500 微信后台配置了 https://www.xxx.cn 报错:reques…
最新文章