esp32-idf eclipse 定时器的使用demo

news2024/12/24 21:52:44

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、运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

P4学习(四)实验一:Basic Forwarding

目录 一.前置知识二.实验过程记录1.找到实验文件2.拓扑图3.明确实验内容4.实验初体验 三. 编写解决方案1.Parse部分1.1 Code1.2 知识点解析 2.Ingress部分2.1 Code2.2 知识点解析 3.Deparse部分3.1 Code3.2 知识点 四.实验完成测试 一.前置知识 Linux基础命令(vim)V!Model的架…

大模型多卡训练原理

背景知识 深度学习涉及大量矩阵运算&#xff0c;而矩阵运算可以并行计算。 一、数据并行 每张卡加载不同的数据&#xff0c;将计算结果合并 存在问题&#xff1a;每个显卡都加载了模型&#xff0c;浪费了一定空间 二、模型并行&#xff1a;适合模型特别大的情况 1、串行计算…

Java Springboot SSE如何判断客户端能否正常接收消息

目录 背景解决方案思路代码代码解释 Java反射知识点补充 背景 当新建一个 emitter 对象的时候, 它的默认超时时间是 30s. SseEmitter emitter new SseEmitter(); 但是很多情况下, 默认30s的时间太短, 需要把 emitter 对象的超时时间设置成不超时, 也就是永久有效. private …

RHEL8 Samba服务器详细配置用户模式

任务&#xff1a; 配置server01为samba服务器&#xff0c;samba服务器的/companydata/sales为共享目录&#xff0c;共享名为sales&#xff0c;里面创建测试文件test_share.tar&#xff0c;创建用户组sales&#xff0c;创建组内用户sale1&#xff0c;要求配置用户模式访问&#…

py爬虫入门笔记(request.get的使用)

文章目录 Day11. 了解浏览器开发者工具2. Get请求http://baidu.com3. Post请求https://fanyi.baidu.com/sug4. 肯德基小作业 Day21. 正则表达式2. 使用re模块3. 爬取豆瓣电影Top250的第一页4. 爬取豆瓣电影Top250所有的250部电影信息 Day31. xpath的使用2. 认识下载照片线程池的…

【翻译】在Qt Designer中创建主窗口(Main Windows)

原文地址&#xff1a;https://doc.qt.io/qt-6/designer-creating-mainwindows.html Qt Designer 可用于为不同用途创建用户界面&#xff0c;并为每个用户界面提供不同类型的模板。主窗口模板用于创建具有菜单栏、工具栏和停靠窗口部件的应用程序窗口。 通过打开文件菜单并选择…

工程档案数字化的意义

工程档案数字化可以提高档案管理效率、节约资源成本、保护档案安全、提高档案可持续性、提升检索与利用的便捷性&#xff0c;促进信息共享与合作&#xff0c;具有重要的意义和价值。 1. 提高档案管理效率&#xff1a;数字化档案可以通过电子方式进行存储、检索和共享&#xff0…

企业网盘的价值:为什么企业需要它?

企业网盘因其主打的文件管理协作功能&#xff0c;正好符合信息时代高速发展下企业的需要&#xff0c;能够帮助企业集中管理文件数据&#xff0c;提供便捷的文件协作服务&#xff0c;一跃成为近两年企业服务类产品榜单中的一匹黑马。 企业网盘真的这么好用吗&#xff1f;企业真…

ant-desgin的table的上移、下移

文章目录 html部分函数部分 html部分 <a-table :columns"columns" :data-source"dataList" :loading"listLoading" :pagination"false"><template #bodyCell"{ column, record, index }"><template v-if&qu…

class_10:this关键字

this关键字是指向调用对象的指针 #include <iostream> #include <iostream> using namespace std;class Car{ public://成员数据string brand; //品牌int year; //年限//构造函数名与类名相同Car(string brand,int year){cout<<"构造函数中&#…

字面量(java)

字面量类型&#xff1a; 整数类型&#xff1a;不带小数的数字&#xff0c;如666、-88 小数类型&#xff1a;带小数点的数字&#xff0c;如13.14、-5.21 字符串类型&#xff1a;用双引号引起来的内容&#xff0c;如"HelloWorld"&#xff0c;""," &q…

HCIA交换技术

VLAN的作用&#xff08;只记录MAC&#xff09;&#xff1a; 路由器和交换机协同工作&#xff0c;为了解决广播域带来的问题&#xff0c;人们引入了VLAN&#xff08;virtual local area network&#xff09;&#xff0c;即虚拟局域网技术&#xff1a;通过在交换机上部署VLAN&…

【软件测试】学习笔记-精准测试

软件测试行业从最开始的手工测试到自动化测试&#xff0c;从黑盒测试到白盒测试&#xff0c;测试理念和技术都发生了日新月异的变化。现如今&#xff0c;几乎所有的软件公司都有一套强大且复杂的自动化测试用例&#xff0c;用来夜以继日地保证产品的正确性和稳定性。 然而&…

Nginx的access_log 状态码499的问题排查

前提&#xff1a;公司的项目网站&#xff0c;运行环境是lnmp环境下 一、起因 如下图&#xff0c;网站请求超过60s(如&#xff1a;导出半年的报表数据到excel)时&#xff0c;报如下错误&#xff0c;且浏览器上没有返回值 二、发展 查找nginx和php-fpm都没有报错日志。于是先把…

万字讲解新一代分布式任务调度框架Power-job

1、简介 Power-Job 的设计目标是成为企业级的分布式任务调度平台&#xff0c;整个公司统一部署调度中心 power-job-server&#xff0c;旗下所有业务线应用只需要依赖 power-job-worker 即可接入调度中心获取任务调度与分布式计算能力。 Power-job官方网址&#xff1a;http:/…

ELK 分离式日志

目录 一.ELK组件 ElasticSearch&#xff1a; Kiabana&#xff1a; Logstash&#xff1a; 可以添加的其它组件&#xff1a; ELK 的工作原理&#xff1a; 二.部署ELK 节点都设置Java环境: 每台都可以部署 Elasticsearch 软件&#xff1a; 修改elasticsearch主配置文件&…

QT-QML2048小游戏

QT-QML2048小游戏 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Dialogs 1.1 import QtQuick.Window 2.1 import "2048.js" as MyScriptAp…

使用pyechart创建折线图

import json from pyecharts.charts import Line from pyecharts import options# 首先使用文件打开数据 f_us open(Desktop/python/Project/数据可视化/美国.txt,r,encoding"UTF-8") f_rb open(Desktop/python/Project/数据可视化/日本.txt,r,encoding"UTF-8…

基于springboot+vue的蜗牛兼职网的设计与实现系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

Pypputeer自动化

Pyppeteer简介 pyppeteer 是 Python 语言的一个库&#xff0c;它是对 Puppeteer 的一个非官方端口&#xff0c;Puppeteer 是一个 Node 库&#xff0c;Puppeteer是Google基于Node.js开发的一个工具&#xff0c;它提供了一种高层次的 API 来通过 DevTools 协议控制 Chrome 或 Ch…