概述
本文章 来自原创专栏《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_t ESP_OK 配置成功 同上 ESP_ERR_INVALID_ARG 参数错误 同上 ESP_ERR_INVALID_STATE esp_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_periodic
和esp_timer_start_once
函数的第二个参数都是以微秒us
为单位的
运行结果:(白字部分)
最后
以上就是无心音响为你收集整理的ESP32 之 ESP-IDF 教学(四)——高分辨率软件定时器(esp_timer)的全部内容,希望文章能够帮你解决ESP32 之 ESP-IDF 教学(四)——高分辨率软件定时器(esp_timer)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复