1.引言

        定时器,顾名思义就是用来计时的,我们常常会设定计时或闹钟,然后时间到了就告诉我们要做什么。ESP32也是这样,通过定时器可以完成各种预设好的任务。ESP32定时器到达指定时间后也会产生中断,然后在回调函数内执行所需功能,这个和外部中断类似。ESP32芯片包含两个硬件定时器组每组有两个通用硬件定时器。

本实验我们通过调用三个定时器,让三个LED以不同的周期进行闪烁。

2.代码展示

#include <Arduino.h>

#define d1 14
#define d3 25
#define d5 23


void init_port(){
  pinMode(d1,OUTPUT);
  pinMode(d3,OUTPUT);
  pinMode(d5,OUTPUT);
} 

void service_tim1(){
  digitalWrite(d1,!digitalRead(d1));
}
void service_tim2(){
  digitalWrite(d3,!digitalRead(d3));
}
void service_tim3(){
  digitalWrite(d5,!digitalRead(d5));
}

hw_timer_t *tim1=NULL,*tim2=NULL,*tim3=NULL;
void init_timer(){
  tim1=timerBegin(1,80,true);
  timerAttachInterrupt(tim1,service_tim1,true);
  timerAlarmWrite(tim1,500000,true);
  timerAlarmEnable(tim1);

  tim2=timerBegin(2,80,true);
  timerAttachInterrupt(tim2,service_tim2,true);
  timerAlarmWrite(tim2,1000000,true);
  timerAlarmEnable(tim2);

  tim3=timerBegin(3,80,true);
  timerAttachInterrupt(tim3,service_tim3,true);
  timerAlarmWrite(tim3,3000000,true);
  timerAlarmEnable(tim3);
}

void setup(){
  init_port();
  init_timer();
}

void loop() {
  
}

3.代码解析

 定时器初始化

hw_timer_t *tim1=NULL,*tim2=NULL,*tim3=NULL;

这里定义了三个指向 hw_timer_t 类型的指针变量 tim1、tim2 和 tim3,并初始化为 NULL

tim1=timerBegin(1,80,true);
  timerAttachInterrupt(tim1,service_tim1,true);
  timerAlarmWrite(tim1,500000,true);
  timerAlarmEnable(tim1);

timerBegin(1, 80, true):初始化定时器1

第一个参数1代表用定时器1
第二个参数 80是预分频系数,将时钟频率分频为 80 MHz / 80 = 1 MHz,即每个计数周期为 1 微秒。
第三个参数 true 表示定时器在计数达到设定值后自动重载(auto-reload)。

timerAttachInterrupt(tim1, service_tim1, true):为定时器1附加中断服务函数

第一个参数 tim1 是定时器1。
第二个参数 service_tim1 是中断服务函数的名称,当定时器1触发中断时,会调用这个函数。
第三个参数 true 表示中断是边缘触发的,false则是电平触发

timerAlarmWrite(tim1, 500000, true):设置定时器1的定时周期

第一个参数 tim1 是定时器1。
第二个参数 500000 是定时器的计数值,由于预分频器设置为 80,定时器的计数频率为 1 MHz,因此 500000 对应 500 毫秒(0.5 秒),即每0.5s触发一次中断。
第三个参数 true 表示定时器在达到计数值后自动重载,适合执行需要周期性中断的任务。

timerAlarmEnable(tim1):启用定时器1的中断功能

void service_tim1(){
  digitalWrite(d1,!digitalRead(d1));
}

tim1的中断回调函数,当中断触发时,就将LED状态翻转。

tim2,tim3也是同理

实现效果:d1每0.5s闪烁一下,d3每1s闪烁一下,d5每3s闪烁一下

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐