当前位置: 首页 > news >正文

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实现

相关文章:

  • Python selenium 页面滚动
  • 【FPGA教程案例69】硬件开发板调试9——通过ila在线调试DDS,并通过HDMI接口在显示器上显示正弦波形
  • MeterSphere专题之: 配套的浏览器插件:chrome-extensions
  • 【FPGA教程案例70】硬件开发板调试10——vivado程序固化详细操作步骤
  • 计算机毕业设计ssm青年志愿者社团管理36uiu系统+程序+源码+lw+远程部署
  • 数据结构————树
  • 【操作系统】 第二章 —— 系统调用 中断 异常
  • 移动端测试
  • Cmake、Qt与VS编译VTK(生成QVTK)
  • Java——JDBC(Java DataBase Connectivity)数据库连接技术
  • Express
  • java学习之springcloud之服务调用+服务降级+服务网关篇
  • 常见的设计模式
  • 【我不熟悉的javascript】02. 使用token和refreshToken的管理用户登录状态
  • 备战秋招涵盖二十九大技术栈Java面试最新八股文来袭
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • JavaScript服务器推送技术之 WebSocket
  • k8s 面向应用开发者的基础命令
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Spring Boot MyBatis配置多种数据库
  • Sublime text 3 3103 注册码
  • use Google search engine
  • vue中实现单选
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从伪并行的 Python 多线程说起
  • 分布式事物理论与实践
  • 技术:超级实用的电脑小技巧
  • 力扣(LeetCode)56
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • Mac 上flink的安装与启动
  • PostgreSQL之连接数修改
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 阿里云服务器购买完整流程
  • #数学建模# 线性规划问题的Matlab求解
  • (2015)JS ES6 必知的十个 特性
  • (二)正点原子I.MX6ULL u-boot移植
  • (四)库存超卖案例实战——优化redis分布式锁
  • (五)MySQL的备份及恢复
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • .apk文件,IIS不支持下载解决
  • .Net - 类的介绍
  • .net(C#)中String.Format如何使用
  • .netcore 获取appsettings
  • .NET大文件上传知识整理
  • .NET实现之(自动更新)
  • .NET运行机制
  • .net中我喜欢的两种验证码
  • []T 还是 []*T, 这是一个问题
  • [51nod1610]路径计数
  • [ABC294Ex] K-Coloring
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [corCTF 2022] CoRJail: From Null Byte Overflow To Docker Escape