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.mzph.cn/news/632683.shtml

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

相关文章

触摸按键控制LED灯

目录 1.理论 2.代码 2.1 touch_ctrl_led.v 2.2 tb_touch_ctrl_led 1.理论 以上的波形图的touch_flag是采用组合逻辑的方式产生的。 以上的touch_flag是采用时序逻辑产生的&#xff0c;时序逻辑会延迟一拍。 以上是上升沿和下降沿的组合逻辑和时序逻辑实现&#xff0c;逻辑或…

微信小程序 - 导航 、wxs及生命周期函数

导航 声明式导航 使用<navigator></navigator>标签 属性类型默认值必填说明targetstringself否在哪个目标上发生跳转&#xff0c;默认当前小程序urlstring否当前小程序内的跳转链接open-typestringnavigate否跳转方式 target参数 属性值说明self当前小程序min…

书生·浦语大模型实战营第五节课笔记及作业

LMDeploy 大模型量化部署实践 1 大模型部署背景 1.1 模型部署及大模型特点 1.2 大模型部署挑战及方案 2 LMDeploy简介 2.1 核心功能-量化 2.2 核心功能-推理引擎TurboMind 2.1 核心功能-推理服务api server 3 动手实践及作业 按照文档LMDeploy 的量化和部署中的步骤在Intern…

【4k】4k的webrtc播放示例

目录 使用带研发角色的账号&#xff0c;在app端设置下分辨率 &#xff1a; 4k 点播 ffplay播放看下详细的参数 使用带研发角色的账号&#xff0c;在app端设置下分辨率 &#xff1a; 4k 点播 ffplay播放看下详细的参数

解决Windows下VSCode控制台乱码问题

我们在Windows使用VSCode编写C/C程序时&#xff0c;如果代码中的中文字符串使用的是UTF8编码&#xff0c;且代码内没有设置控制台的输出编码&#xff0c;或者编译时没有指定运行时编码&#xff08;GCC可以在编译时使用-fexec-charsetGBK来指定运行时的字符串编码&#xff1b;cl…

将AI的潜能转化为人类的福祉

在这个技术迅速发展的时代&#xff0c;AI不仅是一项突破性的技术&#xff0c;更是人类未来的关键。作为一名AI训练师&#xff0c;我的目标不仅仅是开发先进的AI产品&#xff0c;更重要的是让这些产品服务于人类&#xff0c;改善人们的生活。 我相信&#xff0c;AI的真正价值在于…

MFC 绘图

目录 MFC中绘图 CPaintDC&#xff0c;封装了在WM_PAINT消息中绘图的绘图设备 CClientDC类&#xff0c;封装了在客户区绘图的绘图设备 CGdiObject类(绘图对象类)&#xff0c;封装了各种绘图对象相关的操作 MFC中绘图 Windows绘图需要绘图设备&#xff0c;Win32&#xff1a;…

pyqtgraph绘图类

pyqtgraph绘图类 pyqtgraph绘图有四种方法: 方法描述pyqtgraph.plot()创建一个新的QWindow用来绘制数据PlotWidget.plot()在已存在的QWidget上绘制数据PlotItem.plot()在已存在的QWidget上绘制数据GraphicsLayout.addPlot()在网格布局中添加一个绘图 上面四个方法都接收同样…

OpenHarmony应用开发-进程间通讯

版本&#xff1a;v3.2 Beta5 进程模型 OpenHarmony的进程模型如下图所示&#xff1a; 应用中&#xff08;同一包名&#xff09;的所有UIAbility、ServiceExtensionAbility、DataShareExtensionAbility运行在同一个独立进程中&#xff0c;即图中绿色部分的“Main Process”。…

Linux设备驱动开发学习笔记(等待队列,锁,字符驱动程序,设备树,i2C...)

1. 内核工具和辅助函数 1.1宏container_of container_of函数可以通过结构体的成员变量检索出整个结构体 函数原型&#xff1a; /* pointer 指向结构体字段的指针 container_type 结构体类型 container_field 结构体字段名称 返回值是一个指针 */ container_of(pointer, con…

在线App封装技术:HTML5的新生命

HTML5封装的魅力所在HTML5带来了丰富的多媒体功能、地理位置服务、离线存储等特性&#xff0c;使得Web应用的体验更加接近原生App。封装HTML5到App中&#xff0c;可以大大缩短开发周期&#xff0c;降低开发成本&#xff0c;并且一次编写&#xff0c;多平台运行&#xff0c;极大…

MySQL面试题 | 15.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

.NET Core使用SkiaSharp快速生成二维码( 真正跨平台方案)

前言 在.NET 6之前我们一直是使用QRCoder来生成二维码&#xff08;QRCoder是一个非常强大的生成二维码的组件&#xff0c;用到了System.Drawing.Common 包&#xff09;&#xff0c;然后从.NET 6开始&#xff0c;当为非 Windows 操作系统编译引用代码时&#xff0c;平台分析器会…

外汇天眼:Alpha Group International在2023财年实现营收同比增长12%

Alpha Group International plc&#xff0c;一家为企业和机构提供金融解决方案的公司&#xff0c;今天发布了截至2023财年的贸易更新。 营收增长12%&#xff0c;达到1.1亿英镑&#xff08;2022财年&#xff1a;9830万英镑&#xff09;。 税前利润增长超过140%&#xff0c;达到…

xhr、jQuery、axios、fetch、vue-resource简单了解和对比

1. xhr 不常用&#xff08;太麻烦&#xff09;&#xff0c;一般进行二次封装&#xff0c;或者使用成型的第三方封装jQuery&#xff0c;axios等。axios和jQuery都是对xhr的封装。 2. jQuery 核心是封装Dom操作&#xff0c;80%的内容都是关于Dom的&#xff0c;Vue和React的使用…

第16章_网络编程拓展练习(TCP编程,UDP编程)

文章目录 第16章_网络编程拓展练习TCP编程1、学生与老师交互2、查询单词3、拓展&#xff1a;查询单词4、图片上传5、拓展&#xff1a;图片上传6、多个客户端上传文件7、群聊 UDP编程8、群发消息 第16章_网络编程拓展练习 TCP编程 1、学生与老师交互 案例&#xff1a;客户端模…

Qt程序如何在Release模式下进行断点调试

有些时候,因为某些工程pro文件设置了debug和Release版本的原因,导致在编译运行的时候,程序会自动生成带d后缀的一些库文件,进行调试。 debug模式下我们打断点进行调试,大家都知道。但是Release模式下,如果你直接Ctrl + R运行,肯定是无法断点调试的。 那么这个时候,我…

AEB滤镜再破碎,安全焦虑「解不开」?

不久前&#xff0c;理想L7重大交通事故&#xff0c;再次引发了公众对AEB的热议。 根据理想汽车公布的事故视频显示&#xff0c;碰撞发生前3秒&#xff0c;车速在178km/h时驾驶员采取了制动措施&#xff0c;但车速大幅超出AEB&#xff08;自动紧急刹车系统&#xff09;的工作范…

如何搭建Z-blog网站并结合内网穿透实现无公网ip访问本地站点

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

hadoop下载,安装

下载&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/ 从清华源下载 找到apache 找到hadoop 找到对应的版本 使用64位版本 上传到linux的 /usr/local 目录下 使用tar -zxvf 文件。 命令解压 添加path路径 1&#xff0c;vim /etc/profile 2, 追加hadoop的两个bin路径…