【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");
    }
}

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

相关推荐
双古7 分钟前
步进电机调试记录(先让我的步进电机转起来)
单片机·嵌入式硬件
lixzest10 分钟前
STM32开发中,线程启动异常问题排查简述
stm32·嵌入式硬件
程序员JerrySUN1 小时前
全面理解 Linux 内核性能问题:分类、实战与调优策略
java·linux·运维·服务器·单片机
学习噢学个屁1 小时前
基于STM32语音识别柔光台灯
c语言·stm32·单片机·嵌入式硬件·语音识别
欢乐熊嵌入式编程3 小时前
欢乐熊大话蓝牙知识14:用 STM32 或 EFR32 实现 BLE 通信模块:从0到蓝牙,你也能搞!
stm32·单片机·嵌入式硬件
傍晚冰川4 小时前
FreeRTOS任务调度过程vTaskStartScheduler()&任务设计和划分
开发语言·笔记·stm32·单片机·嵌入式硬件·学习
XRZaaa6 小时前
常见排序算法详解与C语言实现
c语言·算法·排序算法
SY师弟6 小时前
51单片机基础部分——矩阵按键检测
嵌入式硬件·矩阵·51单片机
jie188945758667 小时前
C++ 中的 const 知识点详解,c++和c语言区别
java·c语言·c++
Lester_11017 小时前
嵌入式学习笔记 - freeRTOS xTaskResumeAll( )函数解析
笔记·stm32·单片机·学习·freertos