ESP32 Arduino 定时器中断

1.实验原理

ESP32可以通过定时器完成各种预设好的任务,ESP32定时器在达到指定的时间后会产生中断,然后再回调函数中执行所需的功能。

在Arduino中定时器的有两种:

"硬件定时器"是ESP32芯片上的内置定时器,专门用于计时和定时的硬件模块。硬件定时器可以通过设置特定的寄存器来配置和控制,具有更高的精确性和稳定性。不受代码干扰,适用于高精度和实时性的任务,例如PWM输出或输入捕获的脉冲等。

"软件定时器"是通过编写代码在Arduino中模拟实现的定时器,他不依赖硬件模块,使用计数器变量实现定时功能。时间精度要求不高或只需要基本定时功能时可以使用。

软硬件定时器各有优劣,取决于应用需求。

2.硬件定时器

2.1 硬件定时器库函数

在ESP32 Arduino开发环境中,可以使用以下几个库函数(esp32-hal-timer.h)来配置和操作硬件定时器(timer):  

2.1.1 初始化硬件定时器

hw_timer_t * timerBegin(uint8_t num, uint16_t divider, bool countUp)
  • num    定时器变化,可选值0-3。
  • divider    定时器分频系数,用于设置定时器的始终频率。通常为80分频(设置APB时钟,ESP32主频80MHz),80则时间单位为1Mhz即1us,1000000us即1s。
  • countUp    指定定时器是否为向上计数模式。设置为ture为向上计数,false为向下计数。

2.1.2 关联中断处理函数

void timerAttachInterrupt(hw_timer_t *timer, void (*fn)(void), bool edge)
  • timer    指向已初始化的定时器指针。
  • fn    中断服务函数。
  • edge    中断类型,true边沿触发,false电平触发。

2.1.3 设置定时器计数值

void timerAlarmWrite(hw_timer_t *timer, uint64_t alarm_value, bool autoreload)
  • timer    指向已初始化的定时器指针。
  • alarm_value    计数值,例如分频系数为80,500000us 意思为0.5s进入一次中断。
  • autoreload    是否重载,false定时器中断触发一次,true自动重载。

2.1.4 使能/失能定时器事件

void timerAlarmEnable(hw_timer_t *timer)
void timerAlarmDisable(hw_timer_t *timer)

2.1.5 获取定时器是否自动重载

bool timerGetAutoReload(hw_timer_t *timer)

2.1.6 使能/失能/重启定时器

void timerStart(hw_timer_t *timer)
void timerStop(hw_timer_t *timer)
void timerRestart(hw_timer_t *timer)
//定时器状态,是否开始计数
bool timerStarted(hw_timer_t *timer)

2.1.7 获取定时器报警值

uint64_t timerAlarmRead(hw_timer_t *timer)

2.2 硬件定时器使用步骤

  • 1.初始化定时器:使用 'timerBegin()' 初始化硬件定时器。
  • 2.注册中断函数:使用 'timerAttachInterrupt()' 函数将中断处理函数与定时器关联起来。
  • 3.设置定时器模式:使用 'timerAlarmWrite()' 函数设置计数值及是否重载。
  • 4.启动定时器:使用 'timerAlarmEnable()' 函数使能定时器,开始计数。

2.3 示例

//定时器中断初始化
hw_timer_t *timer = NULL;
void timer_init(void)
{
  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, timerIAR, true);
  timerAlarmWrite(timer, 500 * 1000, true);
  timerAlarmEnable(timer);
}
//中断处理函数
void timerIAR()
{
  digitalWrite(LED_PIN, !digitalRead(LED_PIN));
}

3.软件定时器

使用软件定时器的时候,需要用到ESP32内置的库 Ticker,Ticker是ESP32 Arduino内置的一个定时器库,这个库用于规定时间后调用函数。

 3.1 Ticker库函数

3.1.1 停止Ticker

void Ticker::detach()

3.1.2 Ticker激活状态

bool Ticker::active()//true表示启用

3.1.3 once()

void once(float seconds, void (*callback)(TArg), TArg arg)
void once_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg)

n秒(毫秒)后只执行一次callback函数,arg表示回调函数的参数(不写表示没有)。

3.1.4 attach()

void attach(float seconds, void (*callback)(TArg), TArg arg)
void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg)

每隔n秒(毫秒)后周期性执行callback,arg参数同once()。

3.2 示例

//软件定时器初始化
Ticker ticker;
void ticker_init(void)
{
  ticker.attach(0.5,timerIAR);
}
//每0.5秒转换一次led状态
void timerIAR()
{
  digitalWrite(LED_PIN, !digitalRead(LED_PIN));
}

  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ESP32 Arduino定时器中断是一种在ESP32开发板上使用Arduino编程语言实现的中断方式。它可以在预定的时间间隔内触发中断,从而执行特定的任务。在ESP32中,定时器中断可以用于控制LED灯的闪烁、读取传感器数据等应用场景。通过使用定时器中断,可以提高系统的响应速度和效率,从而实现更加复杂的功能。 ### 回答2: ESP32 Arduino定时器中断是一种常见的硬件中断,可以让我们按照一定的时间间隔来执行程序。我们可以通过在ESP32芯片上配置一个或多个定时器,让它们在指定的时间间隔内触发中断,并执行我们指定的代码。 在ESP32使用定时器中断,我们需要使用适当的库和API,以获取最佳性能和可靠性。例如,我们可以使用"esp_timer.h"库提供的"esp_timer_create()"函数来创建定时器。 创建定时器后,我们需要通过调用"esp_timer_start_periodic()"函数来设置定时器的间隔时间,并启动定时器。这个函数需要我们传入"handle"(由"esp_timer_create()"函数返回)和时间间隔(以微秒为单位)两个参数。 当定时器中断被触发时,我们需要在回调函数中添加我们想要执行的代码。这可以通过创建一个函数并将其作为回调函数传递给"esp_timer_start_periodic()"函数来实现。 在回调函数中,我们可以执行任何适当的操作,例如打开或关闭LED,读取传感器值或者执行其他计算操作。我们也可以使用全局变量来共享数据,以在回调函数和主代码之间进行通信。 总之,ESP32 Arduino定时器中断可以有效地提高程序的性能和可靠性,特别是在需要实时响应的应用程序中。我们只需要注意一些注意事项,例如保持定时器间隔时间合理,并在回调函数中执行适当的操作。 ### 回答3: ESP32是一块功能强大的微控制器,它不仅支持多种通信协议,还拥有丰富的硬件资源。其中定时器中断使用ESP32进行编程的常见技术之一, 该技术可以帮助开发人员按照精确的时间间隔执行任务。 在ESP32中,有多个硬件定时器可以使用。这些定时器有自己的计时器和计数器,可以精确地测量时间。定时器中断就是指当计时器或计数器达到特定值时,会触发中断,并执行中断处理程序。 针对ESP32使用Arduino IDE或其他开发工具编程都可以。例如使用Arduino IDE,可以通过编写以下代码来启用定时器并设置定时器中断: ```c++ hw_timer_t * timer = NULL; //创建定时器变量 //中断处理 void IRAM_ATTR onTimer() { // 处理定时器中断任务 } void setup() { //创建一个1毫秒的定时器,定时器0默认禁用 timer = timerBegin(0, 80, true); timerAttachInterrupt(timer, &onTimer, true); // 附加中断 timerAlarmWrite(timer, 1000, true); // 定时1毫秒 timerAlarmEnable(timer); // 启用定时器中断 } void loop() { //主循环 } ``` 在上述代码中,我们首先创建一个定时器对象`timer`,然后定义了一个中断处理函数`onTimer()`。接着在`setup`函数中,我们通过调用`timerBegin`函数创建了一个定时器,并使用`timerAttachInterrupt`函数将中断处理函数附加到定时器中断上。使用`timerAlarmWrite`函数设置定时器计数器的周期,使用`timerAlarmEnable`函数启用定时器中断。最后,在`loop`循环中处理其他任务。 使用ESP32定时器中断,可以实现周期性任务的精确控制。例如,可以使用定时器中断来读取或发送数据、控制LED灯、检测传感器、驱动电机等。总之,ESP32定时器中断是一种十分有用的技术,可以为开发人员提供更加准确和高效的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值