我是靠谱客的博主 无心音响,最近开发中收集的这篇文章主要介绍ESP32 之 ESP-IDF 教学(四)——高分辨率软件定时器(esp_timer),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!

↓↓↓通过下方对话框进入专栏目录页↓↓↓
CSDN 请求进入目录       _ O x

是否进入ESP32教学导航(基于ESP-IDF)?

       确定


文章目录

    • 高分辨率软件定时器(esp_imer)
      • 1、为什么选择esp_timer定时器作为esp32首选软件定时器
      • 2、esp_timer定时器两种工作方式
        • 【1】单次模式
        • 【2】周期模式
      • 3、使用esp_timer定时器(头文件esp_timer.h)
        • 【1】创建定时器对象
          • 1、函数`esp_timer_create`简介
          • 2、配置结构体`esp_timer_create_args_t`简介
        • 【2】使用esp_timer定时器 (含代码示例)

高分辨率软件定时器(esp_imer)

1、为什么选择esp_timer定时器作为esp32首选软件定时器

尽管FreeRTOS提供软件计时器,但这些计时器有一些限制:

1、最大分辨率等于RTOS滴答周期

2、FreeRTOS的定时器回调来自于一个低优先级的任务。

硬件计时器不受这两种限制的限制,但它们通常使用起来不太方便。【见我的上一篇文章】例如,应用程序组件可能需要计时器事件在将来的特定时间触发,但是硬件计时器只包含一个用于产生中断的“比较”值。这意味着需要在硬件计时器之上构建一些工具来管理可以释放的挂起事件列表.

2、esp_timer定时器两种工作方式

【1】单次模式

【2】周期模式

参考经典8051单片机之一 STC89C52 的Timer0和Timer1

3、使用esp_timer定时器(头文件esp_timer.h)

引用头文件esp_timer.h

#include "esp_timer.h"

【1】创建定时器对象

再创建定时器对象之前,我们应该先初始化esp_timer的API。方法是调用库函数esp_err_tesp_timer_init(void)
之后使用函数esp_timer_create创建定时器对象

1、函数esp_timer_create简介

1、功能简介
用于创建esp_timer定时器对象
2、返回值

类型名称意义
esp_err_tESP_OK配置成功
同上ESP_ERR_INVALID_ARG参数错误
同上ESP_ERR_INVALID_STATEesp_timer库尚未初始化
同上ESP_ERR_NO_MEM创建定时器过程种内存分配失败

3、参数

类型名称意义
const esp_timer_create_args_t *create_args定时器的参数结构体(指针)
esp_timer_handle_t *out_handle用于接收创建的定时器句柄的变量指针
2、配置结构体esp_timer_create_args_t简介
struct esp_timer_create_args_t {
/*函数在计时器到期时调用。*/
	esp_timer_cb_t			callback;
/*传递给回调函数的参数*/
	void 					*arg;
/*从任务或ISR调用回调。*/
	esp_timer_dispatch_t	dispatch_method;
/*定时名称(字符串)*/
	const char 				*name;
/*是否跳过未处理的事件(因为各种原因而被忽略的事件
	如esp32进入低功耗模式)*/
	bool 					skip_unhandled_events;

【2】使用esp_timer定时器 (含代码示例)

我做了一个十分简单的例程:创建一个定时器,定时时间为500ms(即500e3 微秒)周期性使用定时器。

如果开启宏定义#define TIMER_PERIODIC则定时器为周期模式,周期为500ms。每500ms打印一句 "Timer1 Interrupt, state: periodic"
如果注释掉宏定义#define TIMER_PERIODIC则定时器为单次模式,定时为500ms。单片机启动500ms之后打印一句 "Timer1 Interrupt, state: Once"

上边加删除线原因:为提高代码可读性,已删除代码示例中的宏定义。示例中定时器为周期模式,周期为500ms。每500ms打印一句 "Timer1 Interrupt, state: periodic"




代码(基于C++

#include "esp_timer.h"
#include "iostream"

using namespace std;
esp_timer_handle_t timer1;

void timer1Interrupt(void *args){
    cout << "Timer1 Interrupt, state:periodic" << endl;
}

extern "C" void app_main() {
    esp_timer_init();
    esp_timer_create_args_t args = {
        .callback = timer1Interrupt,
        .arg = (void*)1,
        .dispatch_method = ESP_TIMER_TASK,
        .name = "Tiemr1",
        .skip_unhandled_events = false,
    };
    esp_timer_create(&args, &timer1);
    esp_timer_start_periodic(timer1, 500e3);
}

其中esp_timer_start_periodicesp_timer_start_once函数的第二个参数都是以微秒us为单位的

运行结果:(白字部分)
运行结果

最后

以上就是无心音响为你收集整理的ESP32 之 ESP-IDF 教学(四)——高分辨率软件定时器(esp_timer)的全部内容,希望文章能够帮你解决ESP32 之 ESP-IDF 教学(四)——高分辨率软件定时器(esp_timer)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部