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 expiresvoid* arg;                      		//!< Argument to pass to the callbackesp_timer_dispatch_t dispatch_method;   //!< Call the callback from task or from ISRconst char* name;               		//!< Timer name, used in esp_timer_dump functionbool 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.hqwc.cn/news/414150.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云ECS使用docker搭建mysql服务

目录 1.确保正确安装好docker 2.安装mysql镜像 3.创建容器&#xff08;设置端口映射、目录映射&#xff09; 1.确保正确安装好docker 安装教程&#xff1a; 阿里云ECS(CentOS镜像)安装docker-CSDN博客https://blog.csdn.net/qq_62262918/article/details/135686614?spm10…

DAY12--learning English

一、积累 1.superstition 2.intersection If you are in an intersection and heard siren of an emergency vehicle. you should. 当你身处于道路交界处并且听到应急车辆的鸣笛声&#xff0c;你应该. 3. luxurious Japans $3000 Most luxurious sleeper train. 花费3000美元…

小程序商城 免 费 搭 建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景+b2b2c

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案 使用技术&#xff1a; Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台&#xff1a; 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务&#xff08;30个通用…

geemap学习笔记051:获取影像的范围

前言 通常在筛选的过程中&#xff0c;需要获取得到影像的边界范围&#xff0c;下面就将介绍一下如何获取影像的范围。 1 导入库并加载数据 import ee import geemapee.Initialize() # Create a map centered at (lat, lon). Map geemap.Map(center[40, -100], zoom4)image …

STM32 CubeIDE 使用 CMSIS-DAP烧录 (方法2--外部小工具)

前言&#xff1a; 本篇所用方法&#xff0c;需要借助一个外部的工具小软件。 优点&#xff1a;烧录更稳定; 缺点&#xff1a;不能在线仿真调试。 下面链接&#xff0c;是另一种方法&#xff1a;修改CubeIDE调试文件。能在CubeIDE直接烧录、仿真&#xff0c;但不稳定。…

The Blocks Problem

本题是一道模拟题&#xff0c;但个人感觉挺有意思的&#xff08;思路很明确&#xff0c;但是WA了好几发才过&#xff09;&#xff0c;因此来讲一讲思路。 题面 题面PDF 样例输入 10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5…

ChatGPT与文心一言:AI助手之巅的对决

随着科技的飞速发展&#xff0c;人工智能助手已经渗透到我们的日常生活和工作中。 而在这个充满竞争的领域里&#xff0c;ChatGPT和文心一言无疑是最引人注目的两款产品。它们各自拥有独特的优势&#xff0c;但在智能回复、语言准确性、知识库丰富度等方面却存在差异。那么&am…

【新书推荐】Web3.0应用开发实战(从Web 2.0到Web 3.0)

第一部分 Flask简介 第1章 安装 1.1 创建应用目录 1.2 虚拟环境 1.2.1 创建虚拟环境 1.2.2 使用虚拟环境 1.3 使用pip安装Python包 1.4 使用pipregs输出包 1.5 使用requirements.txt 1.6 使用pipenv管理包 第2章 应用的基本结构 2.1 网页显示过程 2.2 初始化 2.3 路由和视图函数…

保姆版Vps安装灯塔(ARL)

因为灯塔的默认端口为5003&#xff0c;所以我们在安装之前就在防火墙里把我们的5003端口打开 打开端口步骤如下&#xff1a; 1.我们打开控制面板&#xff0c;在控制面板里点击 系统和安全 。如下图&#xff1a; 2.接着点击 Windows Defender防火墙,如下图&#xff1a; 3.再…

spring boot学习第八篇:kafka监听消费

为了实现监听器功能 pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoc…

代码随想录 Leetcode459. 重复的子字符串(KMP算法)

题目&#xff1a; 代码&#xff08;首刷看解析 KMP算法 2024年1月18日&#xff09;&#xff1a; class Solution { public:void getNext(string& s,vector<int>& next) {int j 0;next[0] j;for (int i 1; i < s.size(); i) {while (j > 0 && s…

Java的便捷输入方法及解析

在 Java 中&#xff0c;有多种便捷的输入方法可以从用户那里获取输入。下面是一些常见的便捷输入方法及解析&#xff1a; 使用 Scanner 类&#xff1a;在上述示例中&#xff0c;首先导入了 java.util.Scanner 类&#xff0c;创建了一个 Scanner 对象&#xff0c;并使用 System…