目录
一,介绍
在blinky演示中,我们使用delay()函数使LED闪烁。在本演示中,我们将使用Timer(这是硬件定时器)来复制delay()函数。使用Timer我们可以安排何时需要启动任务和重复。应用于此演示,当Timer超时时,我们将每1秒更改LED的当前状态(ON至OFF至ON)。
二,硬件
- ESP32开发板
- 一个红色LED
三,电路图
连接:
[ESP32 IO18和ESP32 GND到LED]
四,代码设计
为了使用Timer,我们将使用以下功能:
“hw_timer_t * timerBegin(uint8_t num,uint16_t divider,bool countUp)”
+ num:是Timer的顺序。我们只有4个定时器,所以订单可以是0,1,2,3。
+ divider:它是一个预分频器。要制作1秒调度器,我们将使用分频器值为80. ESP32主时钟为80MHZ,因此每个滴答将采用T = 1 /(80MHZ / 80)= 1微秒。我们需要1000000个刻度1秒。
+countUp:如果为true,则计时器将计数,反之亦然。
“void timerAttachInterrupt(hw_timer_t * timer,void(* fn)(void),bool edge)”
+ fn:是调用定时器超时和定时器中断时将调用的回调函数。
+ edge:如果为true,则报警将产生边缘类型中断。“void timerAlarmWrite(hw_timer_t * timer,uint64_t alarm_value,bool autoreload)”
+ alarm_value:我们将其设置为1000000,如上所计算 + autoreload:如果为true,则计时器将重复。“void timerAlarmEnable(hw_timer_t * timer)”:启用定时器。
/* 创建硬件定时器 */
hw_timer_t * timer = NULL;
/* LED 引脚 */
int led = 18;
/* LED 状态 */
volatile byte state = LOW;
void IRAM_ATTR onTimer(){
state = !state;
digitalWrite(led, state);
}
void setup() {
Serial.begin(115200);
pinMode(led, OUTPUT);
/* 1/(80MHZ/80) = 1us */
timer = timerBegin(0, 80, true);
/* 将onTimer函数附加到我们的计时器 */
timerAttachInterrupt(timer, &onTimer, true);
/* *设置闹钟每秒调用onTimer函数1 tick为1us => 1秒为1000000us * /
/ *重复闹钟(第三个参数)*/
timerAlarmWrite(timer, 1000000, true);
/* 启动警报*/
timerAlarmEnable(timer);
Serial.println("start timer");
}
void loop() {
}
G观摩学习
观摩学习
学习
辛苦辛苦!
學習了,謝謝
学习楼主!
66666666666666666666666666
辛苦了
学习学习!!
?
厉害
观摩学习
123
学习了,中断函数那里为什么要用“IRAM_ATTR”?
不错