二十五,ESP32 使用定时器中断

一,介绍

blinky演示中,我们使用delay()函数使LED闪烁。在本演示中,我们将使用Timer(这是硬件定时器)来复制delay()函数。使用Timer我们可以安排何时需要启动任务和重复。应用于此演示,当Timer超时时,我们将每1秒更改LED的当前状态(ON至OFF至ON)。

二,硬件

  • ESP32开发板
  • 一个红色LED

三,电路图

连接:

[ESP32 IO18和ESP32 GND到LED] 

二十五,ESP32 使用定时器中断

四,代码设计

为了使用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() {

}
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
Arduino
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论