ESP32-C3实现定时器的启停(Arduino IDE)
1概述
ESP32-C3微控制器有多个定时器,这些定时器可用于各种用途,包括计时、生成PWM信号、测量输入信号的频率等。以下是ESP32-C3上可用的定时器资源:
-
两个硬件定时器:
- 定时器0:这是一个通用定时器,通常用于操作系统的任务调度。
- 定时器1:同样是一个通用定时器,也可以用于其他目的。
-
八个LED控制定时器:
- 这些定时器专门用于LED控制,例如,它们可以用来生成PWM信号来控制LED的亮度。
-
两个I2S DMA定时器:
- 这些定时器用于I2S(Inter-IC Sound)接口的DMA(Direct Memory Access)操作。
-
一个RMT(Remote Control)定时器:
- RMT定时器用于生成和接收红外遥控信号。
这些定时器资源在ESP32-C3上的分配和功能可能会根据具体的应用和ESP-IDF(Espressif IoT Development Framework)的版本有所不同。硬件定时器(定时器0和定时器1)通常用于最关键的计时任务,而其他定时器则可用于特定外设的控制。
2实现定时器的启停(1秒)
#include <Arduino.h>hw_timer_t *timer = NULL;
volatile int seconds = 0;
volatile bool printFlag = false; // 添加一个标志来指示是否需要打印// 定时器中断服务例程
void IRAM_ATTR tim1Interrupt() {seconds++; // 每次中断增加秒数printFlag = true; // 设置打印标志
}void setup() {Serial.begin(115200);timer = timerBegin(0, 80, true); // 初始化定时器timerAttachInterrupt(timer, &tim1Interrupt, true); // 绑定中断函数timerAlarmWrite(timer, 1000000, true); // 设置报警值为 1 秒timerAlarmEnable(timer); // 启用定时器中断
}void loop() {if (printFlag) {Serial.print("Seconds passed: ");Serial.println(seconds);printFlag = false; // 重置打印标志}
}
3注意串口不能放在定时器中断内部
,放进去会产生内存溢出
-
串行缓冲区溢出:如果在
Serial.print
或Serial.println
调用之间有太多的数据要发送,而串行通信速度跟不上,串行缓冲区可能会溢出,导致数据丢失或混乱。 -
中断处理和串行通信冲突:由于
Serial.print
和Serial.println
不是原子操作,如果在它们执行过程中发生中断,可能会导致输出不完整或混乱。 -
其他代码或库的干扰:如果在您的程序中还有其他代码或库使用串行端口进行通信,它们可能会与您的打印语句冲突。
4重点解释
-
timerBegin(0, 80, true);
timerBegin
函数用于初始化定时器,并返回一个定时器句柄。- 第一个参数
0
指定要使用的定时器组。ESP32-C3 有两个定时器组,每个组有两个定时器。这里选择定时器组0。 - 第二个参数
80
是预分频器的值。定时器的时钟源通常是 APB(Advanced Peripheral Bus)时钟,预分频器用于降低时钟频率。预分频器值设置为80,意味着定时器的时钟频率是 APB 时钟的 1/80。 - 第三个参数
true
表示定时器是向上计数的,即从0开始,每次计数增加,直到达到设定的报警值。
-
timerAttachInterrupt(timer, &tim1Interrupt, true);
timerAttachInterrupt
函数用于将中断服务例程(ISR)与定时器中断关联起来。- 第一个参数
timer
是由timerBegin
返回的定时器句柄。 - 第二个参数
&tim1Interrupt
是指向中断服务例程的指针。当定时器达到报警值时,将调用此函数。 - 第三个参数
true
表示在中断服务例程执行期间,定时器中断应该被禁用。这是为了避免在中断服务例程执行期间再次进入中断。
-
timerAlarmWrite(timer, 1000000, true);
timerAlarmWrite
函数用于设置定时器的报警值,即定时器达到该值时触发中断。- 第一个参数
timer
是定时器句柄。 - 第二个参数
1000000
是定时器的报警值,单位是定时器时钟周期的个数。由于定时器时钟频率是 APB 时钟的 1/80,因此 1000000 个周期大约等于 1 秒(假设 APB 时钟频率为 80MHz)。 - 第三个参数
true
表示报警值设置后,定时器会自动重载并重新开始计数,从而实现周期性中断。
-
timerAlarmEnable(timer);
timerAlarmEnable
函数用于启用定时器中断。- 参数
timer
是定时器句柄。 - 一旦启用,定时器开始计数,当达到设定的报警值时,将调用之前关联的中断服务例程。
时间计算
以下是计算步骤:
-
确定 APB 时钟频率: ESP32-C3 的 APB 时钟频率默认为 80 MHz(即每秒 80,000,000 周)。
-
应用预分频器: 您设置的预分频器值为 80,这意味着定时器时钟频率是 APB 时钟频率的 1/80。
定时器时钟频率 = APB 时钟频率 / 预分频器值 定时器时钟频率 = 80 MHz / 80 = 1 MHz (即每秒 1,000,000 周)
-
计算定时器计数周期: 您设置的报警值为 1,000,000,这是定时器达到后触发中断的计数值。
计时时间 = 报警值 / 定时器时钟频率 计时时间 = 1,000,000 / 1,000,000 = 1 秒
1分钟
#include <Arduino.h>hw_timer_t *timer = NULL;
volatile int minutes = 0;
volatile bool printFlag = false; // 添加一个标志来指示是否需要打印// 定时器中断服务例程
void IRAM_ATTR tim1Interrupt() {minutes++; // 每次中断增加分钟数printFlag = true; // 设置打印标志
}void setup() {Serial.begin(115200);timer = timerBegin(0, 80, true); // 初始化定时器timerAttachInterrupt(timer, &tim1Interrupt, true); // 绑定中断函数timerAlarmWrite(timer, 60000000, true); // 设置报警值为 60 秒(即 1 分钟)timerAlarmEnable(timer); // 启用定时器中断
}void loop() {if (printFlag) {Serial.print("Minutes passed: ");Serial.println(minutes);printFlag = false; // 重置打印标志}
}
30分钟
#include <Arduino.h>hw_timer_t *timer = NULL;
volatile int minutes = 0;
volatile bool printFlag = false; // 添加一个标志来指示是否需要打印// 定时器中断服务例程
void IRAM_ATTR tim1Interrupt() {minutes += 30; // 每次中断增加30分钟数printFlag = true; // 设置打印标志
}void setup() {Serial.begin(115200);timer = timerBegin(0, 80, true); // 初始化定时器timerAttachInterrupt(timer, &tim1Interrupt, true); // 绑定中断函数timerAlarmWrite(timer, 1800000000, true); // 设置报警值为 1800 秒(即 30 分钟)timerAlarmEnable(timer); // 启用定时器中断
}void loop() {if (printFlag) {Serial.print("Minutes passed: ");Serial.println(minutes);printFlag = false; // 重置打印标志}
}
相关文章:

ESP32-C3实现定时器的启停(Arduino IDE)
1概述 ESP32-C3微控制器有多个定时器,这些定时器可用于各种用途,包括计时、生成PWM信号、测量输入信号的频率等。以下是ESP32-C3上可用的定时器资源: 两个硬件定时器: 定时器0:这是一个通用定时器,通常用于…...

centos升级g++使其支持c++17
centos升级g使其支持c17 升级g的原因现象原因 升级g方法更新镜像源yum升级g版本 总结 升级g的原因 现象 编译最新版本的jsoncpp报一下错误 jsontest.h:87:37: error: ‘hexfloat’ is not a member of ‘std’oss << std::setprecision(16) << std::hexfloat &l…...

Pytest日志收集器配置
前言 在pytest框架中,日志记录(logging)是一个强大的功能,它允许我们在测试期间记录信息、警告、错误等,从而帮助调试和监控测试进度。 pytest与Python标准库中的logging模块完美集成,因此你可以很容易地在…...

Morris算法(大数据作业)
我只能说,概率证明真的好难啊!(;′⌒) 这也证明我的概率论真的学的很差劲,有时间一定要补补/(ㄒoㄒ)/~~ 算法不难证明难! 当一个数足够大时,能不能用更少的空间来近似表示这个整数n,于是&…...

TCP/IP协议 【三次握手】过程简要描述
当建立TCP连接时,三次握手的作用简要描述如下: 第一次握手(客户端向服务器发送SYN包):客户端发送SYN包给服务器,确认服务器是否在线并等待响应。 第二次握手(服务器向客户端发送SYNACK包&…...

docker 数据管理,数据持久化详解 二 数据卷容器
数据卷和数据卷容器核心区别 持久性对比 数据卷:当您直接在启动容器时指定了一个数据卷(例如,使用docker run -v /data),这个数据卷会自动创建,并且其内容会在容器停止或删除后继续存在。您可以随时通过Do…...

Logrotate:Linux系统日志轮转和管理的实用指南
Logrotate是Linux系统中用于自动化管理日志文件的强大工具,它能够高效、安全地轮转、压缩和清理日志文件,从而有效控制日志文件大小,节省磁盘空间,并显著提升系统可维护性和安全性。本文档将提供Logrotate的实用指南,涵…...

八股面试3(自用)
基本数据类型和引用数据类型区别 java中数据类型分为基本数据类型和引用数据类型 8大基本数据类型 1.整数:int,long,short,byte 2.浮点类型:float,double 3.字符类型:char 4.布尔类型&…...

【微服务】springboot3 集成 Flink CDC 1.17 实现mysql数据同步
目录 一、前言 二、常用的数据同步解决方案 2.1 为什么需要数据同步 2.2 常用的数据同步方案 2.2.1 Debezium 2.2.2 DataX 2.2.3 Canal 2.2.4 Sqoop 2.2.5 Kettle 2.2.6 Flink CDC 三、Flink CDC介绍 3.1 Flink CDC 概述 3.1.1 Flink CDC 工作原理 3.2 Flink CDC…...

【Android】浅析OkHttp(1)
【Android】浅析OkHttp(1) OkHttp 是一个高效、轻量级的 HTTP 客户端库,主要用于 Android 和 Java 应用开发。它不仅支持同步和异步的 HTTP 请求,还支持许多高级功能,如连接池、透明的 GZIP 压缩、响应缓存、WebSocke…...

Generate-on-Graph
目录 摘要1 引言2 相关工作4 不完整知识图谱问答(IKGQA)4.1 任务介绍4.2 数据集构建 5 Generate-on-Graph (GoG) 摘要 为了解决大型语言模型(LLMs)在知识不足和幻觉问题上的困扰,众多研究探索了将LLMs与知识图谱&…...

学习笔记——交换——STP(生成树)简介
一、技术背景 1、生成树技术背景 交换机单线路组网,存在单点故障(上左图),上行线路及设备都不具备冗余性,一旦链路或上行设备发生故障,业务将会中断。 为了使得网络更加健壮、更具有冗余性,将拓扑修改为(上右图)接入…...

【Linux从入门到精通一】操作系统概述与Linux初识
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱…...

Git 深度解析 —— 从基础到进阶
目录 1. Git 基础概念 1.1 版本控制 (Version Control) 1.2 分布式版本控制 (Distributed Version Control) 1.3 核心概念 1.4 Git 工作流程 2. Git 常用命令 2.1 初始化仓库 2.2 添加文件 2.3 提交修改 2.4 查看状态 2.5 查看历史记录 2.6 切换分支 2.7 创建分支…...

PCIE-变量总结
1.changed_speed_recovery: 表示链路双方已经将链路速率协商为更高的速率。 在configuration.complete状态下此变量会reset成0; 当前状态在recovery.rcvrlock状态: 在经过24ms的timeout之后,任何一个已经configured的lane&…...

【iOS】AFNetworing初步学习
文章目录 前言OC的网络请求步骤单例封装网络请求使用AFNetworking进行网络请求 前言 在暑假,学习了一些简单的网络请求的内容,本周学习了AFNetworking的基本使用,通过本篇博客进行一个简单的介绍。 OC的网络请求步骤 简单的网络请求主要有…...

【数据结构】堆的创建
Heap.h #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<assert.h>//创建堆结构体 typedef int HPDateType; typedef struct Heap {HPDateType* a;int size;int capacity; }HP;//堆的初始化 void HPInit(HP* php);//堆的销毁 voi…...

Linux下Git操作
一、基本命令 1、创建 git 目录(工作区) mkdir gitcode 2、创建本地仓库,生成 .git 隐藏目录 git init 3、设置配置项 git config user.name "xxx" git config user.email "....." 4、查看配置项 git config -l …...

缺失d3dx9_42.dll如何修复,d3dx9_42.dll故障的6种修复方法分享
在电脑使用过程中,许多游戏玩家和软件用户可能都遇到过d3dx9_42.dll丢失的问题。这个问题会导致游戏或软件无法正常运行,给用户带来诸多不便。本文将详细解读d3dx9_42.dll丢失的原因、影响及解决方案,帮助大家顺利解决这个问题。 一、d3dx9_4…...

深入理解Android WebView的加载流程与事件回调
文章目录 一、WebView 加载流程时序图二、WebView 加载流程回调函数说明三、AwContents3.1 主要功能和职责3.2 架构和实现3.3 使用场景 四、利用WebView回调函数检测白屏4.1 使用onPageStarted和onPageFinished检测加载时间4.2 利用onReceivedError和onReceivedHttpError检测加…...

机器视觉相机自动对焦算法
第一,Brenner梯度法、 第二,Tenegrad梯度法、 第三,laplace梯度法、 第四,方差法、 第五,能量梯度法。 此实例通过使用Halcon实现5种清晰度算法函数: 1. 方差算法函数; 2. 拉普拉斯能量函数…...

StarTowerChain:开启去中心化创新篇章
官网: www.startower.fr 在当今创新驱动的时代,StarTowerChain 以其独特的去中心化创新模式,为我们带来了新的希望和机遇。去中心化,这个充满活力与创造力的理念,正引领着我们走向未来的创新之路。 StarTowerChain …...

SpringCloudStream使用StreamBridge实现延时队列
利用RabbitMQ实现消息的延迟队列 一、安装RabbitMQ 1、安装rabbitmq 安装可以看https://blog.csdn.net/qq_38618691/article/details/118223851,进行安装。 2、安装插件 安装完毕后,exchange是不支持延迟类型的,需要手动安装插件,需要和安装的rabbitmq版本一致 https:…...

MATLAB中head函数用法
目录 语法 说明 示例 显示矩阵的前八行 显示表的前三行 返回表的前八行 head函数的功能是获取数组或表的顶行。 语法 head(A) head(A,k) B head(___) 说明 head(A) 在命令行窗口中显示数组、表或时间表 A 的前八行,但不存储值。 head(A,k) 显示 A 的前 k …...

golang 基本数据类型
1. go语言的数据类型简介 golang的数据类型分为两大类,一类是基本数据类型和符合数据类型; 按照传递的内容分:传递本身数据和传递地址; golang和java很相似,都是值传递,不过分为传递的值和传递的地址&a…...

各种查询sql介绍
1. 关联查询(JOIN) 关联查询用于从多个表中检索数据。它基于两个或多个表之间的共同字段(通常是主键和外键)来组合数据。 内连接(INNER JOIN): sql SELECT a.name, b.order_date FROM custome…...

Guava防击穿回源-异步防击穿
异步防击穿策略 在高并发环境下,缓存击穿(Cache Stampede)是一种常见的问题。当缓存中的热点数据失效或未命中时,大量并发请求同时访问后端数据源(如数据库),可能导致后端系统压力骤增,甚至出现崩溃。为了有效防止这种情况,可以利用Guava提供的异步缓存加载机制(类似…...

人工智能正在扼杀云计算的可持续性
可持续性曾是公共云计算中备受推崇的优势。企业和云提供商大肆宣扬他们的绿色计划,推广采用可再生能源的数据中心,以减少碳足迹。 近几个月来,这个话题已悄然淡出人们的视线。罪魁祸首是什么?对人工智能功能的无限需求正在推动云…...

C# 条形码、二维码标签打印程序
1、条码标答打印主界面 2、打印设置 3、生成QR代码 private void GetBarcode_T(string lr) { QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();//创建一个对象 qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE; //设置编码测量…...

嵌入式入门学习——6Protues点亮数码管,认识位码和段码,分辨共阴还是共阳(数字时钟第一步)
0 系列文章入口 嵌入式入门学习——0快速入门,Let‘s Do It! 首先新建基于Arduino UNO的protues工程,见本系列第3篇文章 1 点“P”按钮找器件 2 输入“seg”或“digit”查找数码管器件 3 找到我们想要的6位7段数码管 4如图A、B…DP都是段码…...