多个定时器中断(内含代码解析)
定时器,顾名思义就是用来计时的,我们常常会设定计时或闹钟,然后时间到了就告诉我们要做什么。ESP32也是这样,通过定时器可以完成各种预设好的任务。ESP32定时器到达指定时间后也会产生中断,然后在回调函数内执行所需功能,这个和外部中断类似。ESP32芯片包含。本实验我们通过调用三个定时器,让三个LED以不同的周期进行闪烁。
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闪烁一下
更多推荐



所有评论(0)