二十五,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}}人
人已打赏
ESP32ESP32-基础

二十四,ESP32 条件运算符

2018-10-4 13:01:50

ESP32ESP32-基础

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

2018-10-21 8:45:15

15 条回复 A文章作者 M管理员
  1. Jeffer

    G观摩学习

  2. 树先生

    学习

  3. 谦ツ冲

    辛苦辛苦!

  4. 老鐘

    學習了,謝謝

  5. ♂灬王剑桥

    学习楼主!

  6. 苍龙

    66666666666666666666666666

  7. 辛苦了

  8. 跟党走

    学习学习!!

  9. 中庸至道

    ?

  10. Whuihui

    厉害

  11. chm87

    观摩学习

  12. wisher

    123

  13. 干嘛

    学习了,中断函数那里为什么要用“IRAM_ATTR”?

  14. 金戈铁马

    不错

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