4. ESP32定时器(Arduino)

定时器

介绍

定时器是单片机内部的一种外设,主要用来实现定时执行代码的功能,通过计数器和时钟周期来计时。定时器的类型多样,包括PWM定时器、系统定时器、看门狗定时器等,各有不同的特点和用途

ESP32 内置 464-bit 通用定时器。每个定时器包含一个 16-bit 预分频器和一个 64-bit 可自动重新加载向上/向下计数器
4个定时器分为 2 组,每组 2 个。TIMGn_Tx n 代表组别,x 代表定时器编号。共4个硬件通用定时器,分别对应序号0,1,2,3

ESP32的计数基频为80MHZ,预分频系数为80可以得到1MHz的计数信号,每个计数信号的周期为1us,即每个计数单位1us

定时器API

1.定时器硬件初始化

hw_timer_t* timerBegin(timer_num_t timer_num, uint32_t divider, bool count_up)
  • timer_num:定时器编号,可选值为 0-3 等。
  • divider:定时器的分频系数,用于设置定时器的时钟频率。较大的分频系数将降低定时器的时钟频率。可以根据需要选择合适的值,一般设置为 80 即可
  • count_up:指定定时器是否为向上计数模式。设置为 true 表示向上计数,设置为 false 表示向下计数。

2.将中断处理函数与特定的定时器关联起来

timerAttachInterrupt(hw_timer_t *timer, void (*isr)(void *), int intr_type)
  • timer:定时器指针
  • isr: 中断处理函数
  • intr_type: 中断类型,可选值为 ture(边沿触发)或 false(电平触发)

3.设置定时器的计数值

timerAlarmWrite(hw_timer_t *timer, uint64_t alarm_value, bool autoreload)
  • timer:定时器指针
  • alarm_value: 定时器的计数值,向上计数到达该数值溢出,触发中断。当预分频系数为80时,alarm_value设置为1000000,即间隔时间为1秒溢出,执行中断服务函数。
  • autoreload: 是否自动重载计数值,可选值为 true(自动重载)或 false(单次触发)

其他API

  1. timerAlarmEnable(hw_timer_t *timer):用于启动定时器,使其开始计数
  2. timerAlarmEnabled(hw_timer_t *timer): 检查定时器是否启动
  3. timerAlarmDisable(hw_timer_t *timer):用于禁用定时器,停止计数
  4. timerGetAutoReload(hw_timer_t *timer):获取定时器是否自动重新加载
  5. timerAlarmRead(hw_timer_t *timer):获取定时器计数器报警值
  6. timerStart(hw_timer_t *timer):计数器开始计数
  7. timerStop(hw_timer_t *timer):计数器停止计数
  8. timerRestart(hw_timer_t *timer):计数器重新开始计数,从 0 开始
  9. timerStarted(hw_timer_t *timer):计数器是否开始计数。

使用硬件定时器的基本步骤如下:
10. 初始化定时器:使用 timerBegin() 函数初始化所需的硬件定时器。
11. 注册中断处理函数:使用 timerAttachInterrupt() 函数将中断处理函数与定时器关联起来。
12. 设置定时器模式:使用 timerAlarmWrite(),设置触发一次,还是周期性触发。
13. 启动定时器:使用 timerAlarmEnable() 函数启动定时器,使其开始计数。

实训案例

定时器间隔定时

请添加图片描述

#include <Arduino.h>

// 定义引脚d2为数字输出引脚
#define d2 2

// 定时器服务函数,用于切换引脚d2的状态
void service_timer0() {
  digitalWrite(d2, !digitalRead(d2)); // 读取引脚d2的当前状态,并取反后写入引脚d2
}

// 声明一个全局变量,用于存储定时器句柄
hw_timer_t *tim0 = NULL;

// 初始化定时器函数
void Init_timer() {
  // 使用timerBegin函数初始化定时器,参数分别为定时器编号、时钟频率和是否启用自动重装载模式
  tim0 = timerBegin(0, 80, true);
  
  // 使用timerAttachInterrupt函数将定时器中断与服务函数service_timer0关联,并设置为在定时器溢出时触发中断
  timerAttachInterrupt(tim0, service_timer0, true);
  
  // 使用timerAlarmWrite函数设置定时器的闹钟值,参数分别为定时器句柄、闹钟值和是否启用闹钟功能
  timerAlarmWrite(tim0, 2000000, true);
  
  // 使用timerAlarmEnable函数启用定时器的闹钟功能
  timerAlarmEnable(tim0);
}

void setup() {
  // 设置引脚d2为数字输出模式
  pinMode(d2, OUTPUT);
  
  // 调用初始化定时器的函数
  Init_timer();
}

void loop() {
  // 主循环函数,空实现
}

  • 25
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ESP32定时中断是指在ESP32开发板上使用定时器来触发中断,在中断函数中执行相应的操作。通过使用定时中断,可以实现一些特定的功能,如单击、双击、长按等按键状态机。 在Arduino上编写ESP32定时器中断的代码,可以将代码分为两个文件。一个是KEYS.C文件,其中封装了按键处理机的Class对象,供主程序调用。另一个是KEYS.ino文件,为Arduino主程序文件,实现了具体的按键功能。这两个文件中都加入了详细的中文注释,方便阅读和理解。 在解决过程中,可能会遇到一些问题,比如出现了中断看门狗超时错误。这种错误通常是由于中断函数中的阻塞操作导致的。在某些情况下,中断函数会阻塞不释放控制权,导致没有及时喂狗,进而触发重启。为了解决这个问题,可以尝试优化中断函数,在其中减少阻塞操作的使用。特别是println()和printf()这类阻塞性函数,可能会导致中断阻塞而无法及时喂狗。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ESP32定时中断实现单、双击、长按等功能的按键状态机Arduino代码](https://blog.csdn.net/liyong_sbcel/article/details/123875182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [【踩坑日记】ESP32触发定时器中断后无限重启](https://blog.csdn.net/Beihai_Van/article/details/125793806)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁子希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值