【ESP32】Arduino开发 | Timer定时器+定时器闹钟例程

有关定时器外设的详细介绍在ESP-IDF的对应文章中,跳转栏目目录可以找到。

1. API

1.1 启动定时器

cpp 复制代码
hw_timer_t * timerBegin(uint8_t timer, uint16_t divider, bool countUp);
  • timer:定时器序号(ESP32有4个硬件定时器,所以可填序号0-3);
  • divider:预分频器,定时器频率 = APB频率 / 预分频器值,APB时钟频率默认为80MHz;
  • countUp:选择向上计数还是向下计数。

函数会返回一个硬件定时器句柄。

1.2 关闭定时器

cpp 复制代码
void timerEnd(hw_timer_t *timer);
  • timer:定时器句柄。

1.3 设置定时器中断回调

cpp 复制代码
void timerAttachInterrupt(hw_timer_t *timer, void (*fn)(void), bool edge);
  • timer:定时器句柄;
  • fn:回调函数指针;
  • edge:边沿触发(ESP32不支持,默认失能即可)。

1.4 设置定时器闹钟

cpp 复制代码
void timerAlarmWrite(hw_timer_t *timer, uint64_t alarm_value, bool autoreload);
  • timer:定时器句柄;
  • alarm_value:闹钟超时值,触发时间 = (1 / 定时器频率) * 闹钟超时值;
  • autoreload:是否重装载,为真时闹钟可以连续触发。

1.5 使能定时器闹钟

cpp 复制代码
void timerAlarmEnable(hw_timer_t *timer);
  • timer:定时器句柄。

1.6 关闭定时器闹钟

cpp 复制代码
void timerAlarmDisable(hw_timer_t *timer);
  • timer:定时器句柄。

2. 例程

这个例程实现一个间隔为1秒的定时器闹钟。

cpp 复制代码
#include <Arduino.h>

hw_timer_t *timer = NULL;
SemaphoreHandle_t sem;

void ARDUINO_ISR_ATTR timeoutCb()
{
    BaseType_t higherTaskWoken = pdFALSE;
    xSemaphoreGiveFromISR(sem, &higherTaskWoken);
    if (higherTaskWoken) {
        portYIELD_FROM_ISR();
    }
}

void setup()
{
    Serial.begin(115200);
    /* 初始化定时器 */
    sem = xSemaphoreCreateBinary();
    timer = timerBegin(0, 80, true);  // 时钟频率 = 80MHz / 80 = 1MHz
    timerAttachInterrupt(timer, timeoutCb, false);
    timerAlarmWrite(timer, 1000000, true);  // 闹钟频率 = (1 / 1MHz) * 1000000 = 1s
    timerAlarmEnable(timer);
}

void loop()
{
    if (pdTRUE == xSemaphoreTake(sem, portMAX_DELAY)) {
        Serial.println("Timer timeout");
    }
}

因为中断回调里面是不能调用打印函数的,所以例程中使用一个二值信号量来实现,回调函数内释放信号量,然后主循环中获取信号量,成功获取后打印信息。

相关推荐
我命由我123457 分钟前
嵌入式单片机开发 - HAL 库 STM32F1 外设的时钟使能(时钟使能宏、时钟禁用宏)
c语言·c++·stm32·单片机·嵌入式硬件·嵌入式·嵌入式软件
小猪写代码1 小时前
STM32 ODR
stm32·单片机·嵌入式硬件
Y4090013 小时前
C语言转Java语言,相同与相异之处
java·c语言·开发语言·笔记
S,D5 小时前
MBIST - Memory BIST会对memory进行清零吗?
驱动开发·mcu·memory·功能安全·iso26262·mbist·bist
棐木10 小时前
【C语言】动态内存管理
c语言·free·malloc·realloc·calloc·动态内存
weixin_11223312 小时前
基于STM32闭环步进电机控制系统设计说明
stm32·单片机·嵌入式硬件
机器视觉知识推荐、就业指导13 小时前
STC89C52系列单片机简介
单片机·嵌入式硬件·51单片机
qq_259297247314 小时前
STM32
嵌入式硬件
qq_21513832715 小时前
【51单片机-B020】【protues仿真】基于51单片机智能晾衣架仿真
单片机·嵌入式硬件
屁股割了还要学15 小时前
【C语言进阶】内存函数
c语言·开发语言·学习·算法·青少年编程