二十五,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() {
 
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
ESP-32

二十四,ESP32 条件运算符

2025-4-16 15:07:11

ESP-32

二十六,ESP32 使用事件组同步多个任务-广播事件

2025-4-16 15:11:23

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索