esp32-idf eclipse 定时器的使用demo

esp32定时器的使用demo

1、介绍

 ESP32芯片包含两个硬件定时器组。每组有两个通用硬件定时器。它们都是基于16位预分频器和64位自动重载功能的向上向下计数器的64位通用定时器。

2、API接口函数

创建定时器函数: esp_timer_create();

esp_err_t esp_timer_create (const esp_timer_create_args_t* create_args, esp_timer_handle_t* out_handle)

功能:

创建一个esp_timer实例

注意

使用计时器完成后,请使用esp_timer_delete函数将其删除。

返回:

  • ESP_OK成功
  • 如果某些create_args无效,则为ESP_ERR_INVALID_ARG
  • ESP_ERR_INVALID_STATE如果esp_timer库尚未初始化
  • 如果内存分配失败,则为ESP_ERR_NO_MEM

参数:

  • create_args:指向带有计时器创建参数的结构的指针。未由库保存,可以在堆栈上分配。
  • [out] out_handle:输出,指向esp_timer_handle_t变量的指针,该变量将保存创建的计时器句柄。

esp_err_t esp_timer_start_once(esp_timer_handle_t timer,uint64_t timeout_us 

功能:

启动单发计时器。

调用此函数时,计时器不应运行。

返回

  • ESP_OK成功
  • ESP_ERR_INVALID_ARG如果句柄无效
  • ESP_ERR_INVALID_STATE,如果计时器已经在运行

数:

  • timer:使用esp_timer_create创建的计时器句柄
  • timeout_us:计时器超时,相对于当前时刻,以微秒为单位

esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer,uint64_t period 

功能:

启动一个定期计时器。

调用此函数时,计时器不应运行。此功能将启动计时器,该计时器将触发每个“周期”微秒。

返回

  • ESP_OK成功
  • ESP_ERR_INVALID_ARG如果句柄无效
  • ESP_ERR_INVALID_STATE,如果计时器已经在运行

数:

  • timer:使用esp_timer_create创建的计时器句柄
  • period:计时器时间(以微秒为单位)

esp_err_t esp_timer_stop(esp_timer_handle_t timer 

功能:

停止计时器。

此函数停止先前使用esp_timer_start_once或esp_timer_start_periodic启动的计时器。

返回

  • ESP_OK成功
  • ESP_ERR_INVALID_STATE(如果计时器未运行)

参量

  • timer:使用esp_timer_create创建的计时器句柄

esp_err_t esp_timer_delete(esp_timer_handle_t timer 

删除esp_timer实例。

删除前必须停止计时器。一次到期的单次计时器无需停止。

返回

  • ESP_OK成功
  • ESP_ERR_INVALID_STATE,如果计时器正在运行

参量

  • timer:使用esp_timer_create分配的计时器句柄

int64_t esp_timer_get_time( void )

功能:

自启动以来获取时间(以微秒为单位)。

返回

自从调用esp_timer_init以来的微秒数(这通常在应用程序启动期间的早期发生)。

3、代码demo:

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_log.h"
#include "esp_timer.h"

static const char *TAG = "myTimer";

esp_timer_handle_t periodic_timer_handle = NULL;  //周期性的定时器句柄
esp_timer_handle_t onece_timer_handle = NULL;     //单次定时器句柄


void periodic_timer_callback(void* arg)
{
	for(int i=0;i<10;i++)
	{
		printf("<<<<<<<<<<<<<<<<<<<<<<<<<< periodic_timer_callback = %d \n",i);
		vTaskDelay(10 / portTICK_PERIOD_MS);
	}

	esp_timer_stop(periodic_timer_handle);    //停止定时器
	esp_timer_delete(periodic_timer_handle);  //删除定时器
}

void onece_timer_callback(void* arg)
{
	printf("=============================  onece_timer_callback \n");
	vTaskDelay(500 / portTICK_PERIOD_MS);
}

void app_main()
{
    uint32_t num = 0;

    esp_timer_init(); //定时器初始化+

    while (1)
    {
        // 数值自加
        num++;
        ESP_LOGI(TAG,"---> num = %d",num);

        // 判断是否达到触发条件
        if (num == 10) {
            // 创建定时器
            //esp_timer_handle_t timer_handle = NULL;
        	/*
        	 * 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;+
        	 */
            const esp_timer_create_args_t periodic_timer_args = {
                .callback = &periodic_timer_callback,
                .arg = NULL,
                .name = "my_periodic_timer"
            };
            esp_timer_create(&periodic_timer_args, &periodic_timer_handle);

            // 启动定时器
            const TickType_t delay_ms = 1000 / portTICK_PERIOD_MS;
            esp_timer_start_periodic(periodic_timer_handle, delay_ms * 1000);  //周期性的定时器,即定时器会以固定的时间间隔重复触发回调函数

        }

        //判断是否达到触发条件
        if(num == 15)
        {
            const esp_timer_create_args_t once_timer_args = {
                .callback = &onece_timer_callback,
                .arg = NULL,
                .name = "my_onece_timer"
            };
            esp_timer_create(&once_timer_args, &onece_timer_handle);

            // 启动定时器
            const TickType_t delay_ms = 1000 / portTICK_PERIOD_MS;
        	esp_timer_start_once(onece_timer_handle, delay_ms * 1000);  //启动一个一次性的定时器,即定时器只会触发一次回调函数,然后自动停止
        }

        if (num > 20) {
            // 定时器触发后退出循环
            break;
        }

        vTaskDelay(500 / portTICK_PERIOD_MS);  // 等待一段时间
    }
    ESP_LOGI(TAG,"app is out");
}

4、运行结果:

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

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

相关文章

动态pv(nfs方式挂载)

1、定义 发布pvc之后可以生成pv&#xff0c;还可以在共享服务器上直接生成挂载目录 pvc直接绑定和使用pv 2、动态pv依赖两个组件 &#xff08;1&#xff09;provisioner卷插件&#xff1a;k8s本身支持的动态pv创建不包括nfs&#xff0c;需要声明和安装一个外部插件provisio…

16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating

16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating ability_main.xml <?xml version"1.0" encoding"utf-8"?> <DirectionalLayoutxmlns:ohos"http://schemas.huawei.com/res/ohos"ohos:height"match_parent"oh…

「优选算法刷题」:盛最多水的容器

一、题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器…

第29关 阿里云开源的k8s容器秒级事件监控软件-Kube-eventer

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。这节课给大家分析一款K8S上宝藏级秒级事件监控报警的开源软件kube-eventer&#xff0c;它是由阿里云开源的&#xff0c;并且难得的还一直有在更新。 天下武功&#xff0c;唯快不破。对于报警监…

ClickHouse学习笔记(六):ClickHouse物化视图使用

文章目录 1、ClickHouse 物化视图2、物化视图 vs 普通视图3、物化视图的优缺点4、物化视图的用法4.1、基本语法4.2、准备表结构4.3、准备数据4.4、查询结果 1、ClickHouse 物化视图 ClickHouse 的物化视图是一种查询结果的持久化&#xff0c;它的存在是为了带来查询效率的提升…

鸿蒙OS4.0兼容性测试

背景 OpenHarmony兼容性测评主要是验证合作伙伴的设备和业务应用满足OpenHarmony开源兼容性定义的技术要求&#xff0c;确保运行在OpenHarmony上的设备和业务应用能稳定、正常运行&#xff0c;同时使用OpenHarmony的设备和业务应用有一致性的接口和业务体验。 OpenHarmony兼容…

MySQL存储函数和存储过程练习题

一、创建表的要求 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) …

Peter:经济形势不好,一个最大的原因就是诚信道德的缺失 | 程客有话说002

《程客有话说》是我们最新推出的一个访谈栏目&#xff0c;邀请了一些国内外有趣的程序员来分享他们的经验、观点与成长故事&#xff0c;我们尝试建立一个程序员交流与学习的平台&#xff0c;也欢迎大家推荐朋友或自己来参加我们的节目&#xff0c;一起加油。本期我们邀请的程序…

【前端设计】输入框

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 html <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

python数字图像处理基础(六)——模板匹配、直方图

目录 模板匹配概念单对象模板匹配多对象模板匹配 直方图1.查找直方图2.绘制直方图3.掩膜的应用 模板匹配 概念 模板匹配和卷积原理很像&#xff0c;模板在原图像上从原点开始滑动&#xff0c;计算模板与图像被模板覆盖的地方的差别程度&#xff0c;这个差别程度的计算方法在o…

基于WEKWS模型的语音唤醒关键词识别

一、模型描述 1.1 论文解读 本文所使用的模型网络结构继承自论文《Compact Feedforward Sequential Memory Networks for Small-footprint Keyword Spotting》&#xff0c;文中研究了将低秩矩阵分解与传统FSMN相结合的紧凑型前馈顺序记忆网络&#xff08;cFSMN&#xff09;用…

中北数据结构2023真题

雪雾: 设计一个算法&#xff0c;将一个节点值为自然数的单列表拆分成两个单列表&#xff0c;原表中值为偶数的节点保留&#xff0c;而值为奇数的节点&#xff0c;按他们在原表的相对次序组成一个新的单列表 #include <stdio.h> #include <stdlib.h>typedef struct…

一文教你V3+TS(保姆级教程)

TS 与 JS 的区别 基础类型 ts 的常用类型 ts 的常用基础类型分为两种&#xff1a; js 已有类型 原始类型&#xff1a;number/string/boolean/null/undefined/symbol 对象类型&#xff1a;object&#xff08;包括&#xff0c;数组、对象、函数等对象&#xff09; 每次编写前…

oracle11g的闪回技术-闪回表-时间戳

--数据库闪回表 --1创建表&#xff08;登录模式system&#xff09; CREATE table dept2 as select * from dept;--此语句如果加上where条件可用于工作中数据的临时备份 select * from dept2;--查询新建表信息 --进入sql>set time on 通过时间点闪回 记录弹出的时间点&#…

软件测试|使用Python生成PDF文件

简介 PDF&#xff08;Portable Document Format&#xff09;是一种常用的文档格式&#xff0c;具有跨平台兼容性、保真性、安全性和交互性等特点。我们日常生活工作中的合同、报告、论文等通常都采用PDF格式&#xff0c;以确保文档在不同的操作系统&#xff08;例如 Windows、…

腾讯云轻量化应用服务器_轻量化应用服务器_轻量化私有云

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别便宜&#xff0c;大带宽&#xff0c;但是限制月流量&#xff0c;轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c…

【不用找素材】ECS 游戏Demo制作教程(1) 1.15

一、项目设置 版本&#xff1a;2022.2.0f1 &#xff08;版本太低的话会安装不了ECS插件&#xff09; 模板选择3D URP 进来后移除URP&#xff08;因为并不是真的需要&#xff0c;但也不是完全不需要&#xff09; Name: com.unity.entities.graphics Version: 1.0.0-exp.8 点击…

推荐 10 个基于 Stable Diffusion 的 AI 绘画网站

在当今快速发展的人工智能领域&#xff0c;AI 绘画已经成为一个不可忽视的趋势。特别是基于 Stable Diffusion 技术的 AI 绘画工具&#xff0c;以其强大的图像生成能力和丰富的创意潜力吸引了众多艺术家和设计师的目光。对于那些热爱艺术创作&#xff0c;但又缺乏专业绘画技巧的…

三、MySQL实例初始化、设置、服务启动关闭、环境变量配置、客户端登入(一篇足以从白走到黑)

目录 1、选择安装的电脑类型、设置端口号 2、选择mysql账号密码加密规则 3、设置root账户密码 4、设置mysql服务名和服务启动策略 5、执行设置&#xff08;初始化mysql实例&#xff09; 6、完成设置 7、MySQL数据库服务的启动和停止 方式一&#xff1a;图形化方式 方式…

《Python数据分析技术栈》第01章 03 Python基础(Python Basics)

03 Python基础&#xff08;Python Basics&#xff09; 《Python数据分析技术栈》第01章 03 Python基础&#xff08;Python Basics&#xff09; In this section, we get familiar with the syntax of Python, commenting, conditional statements, loops, and functions. 在…