ESP32-arduino,超好玩的定时器!

前言

嵌入式系统的主程序基本上是个大循环,如果在循环里要处理各个任务的请求的话,最粗暴的方式就是轮流查询,简称轮询, 轮询可以解决简单系统的问题,但当请求数量和处理复杂度提升的时候,难免捉襟见肘,中断就是为了解决“按需分配”的资源配置问题。

当然,中断有很几种,外部中断、定时中断等,今天我们要介绍的就是中断里的定时中断!

定时中断——定时执行的中断

直奔主题,编写一个定时中断的程序需要几步呢?我们来编写一个简单的定时器程序,每秒打印一次,如下:

  1. 首先声明一个定时器
/* timerBegin:初始化定时器指针
		第一个参数:设置定时器0(一共有四个定时器0、1、2、3)
		第二个参数:80分频(设置APB时钟,ESP32主频80MHz),80则时间单位为1Mhz即1us,1000000us即1s。
		第三个参数:计数方式,true向上计数 false向下计数
 */
timer = timerBegin(0, 80, true);
  1. 编写中断函数并绑定定时器
/*
	中断服务函数,为使编译器将代码分配到IRAM内,中断处理程序应该具有 IRAM_ATTR 属性
*/
void IRAM_ATTR onTimer() {            
  Serial.println('1');
}

/* timerAttachInterrupt:绑定定时器
		 第一个参数:指向已初始化定时器的指针
		 第二个参数:中断服务器函数
		 第三个参数:true边沿触发,false电平触发
*/
timerAttachInterrupt(timer, &onTimer, true);
  1. 初始化定时器,指定定时器、分频、计数方式
/* timerAlarmWrite:配置报警计数器保护值(就是设置时间)
		 第一个参数:指向已初始化定时器的指针
		 第二个参数:定时时间,这里为1000000us  意思为1s进入一次中断
		 第三个参数:是否重载,false定时器中断触发一次  true:死循环
*/
timerAlarmWrite(timer, 1000000, true); 
  1. 启用定时器
	/* timerAlarmEnable:启用定时器
			 第一个参数:指向已初始化定时器的指针
	*/         
  timerAlarmEnable(timer);   
  1. 关闭定时器
/*timerDetachInterrupt:关闭定时器
	 	 第一个参数:指向已初始化定时器的指针
*/
timerDetachInterrupt(timer);
hw_timer_t * timer = NULL;                        // 声明一个定时器

void IRAM_ATTR onTimer() {                        // 中断函数
  Serial.println('1');
}

void setup() {
  Serial.begin(115200);       
	timer = timerBegin(0, 80, true);                // 初始化定时器指针        
  timerAttachInterrupt(timer, &onTimer, true);    // 绑定定时器
  timerAlarmWrite(timer, 1000000, true);          // 配置报警计数器保护值(就是设置时间)
	timerAlarmEnable(timer);                        // 启用定时器
                  
// timerDetachInterrupt(timer);                   // 关闭定时器         
}
 
void loop() {
 
}

需要注意的是:

  • 中断服务程序必须是一个返回void(空)且没有输入参数的函数。

相关参考

[ESP32系列教程]ESP32 Arduino教程:定时器中断

ESP-Arduino玩转外设(五)中断基本概念及Timer中断

ESP32 Timer实现

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuZou 邹宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值