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

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

相关推荐
不做无法实现的梦~1 小时前
PX4各个模块的作用(3)
linux·stm32·嵌入式硬件·机器人·自动驾驶
清风6666661 小时前
基于单片机的喷漆机器人自动控制系统
单片机·嵌入式硬件·机器人·毕业设计·课程设计·期末大作业
不能跑的代码不是好代码1 小时前
STM32独立看门狗(IWDG)知识点及标准库使用指南
stm32·嵌入式硬件
程序员良许2 小时前
嵌入式处理器架构
后端·单片机·嵌入式
wengqidaifeng2 小时前
数据结构(三)栈和队列(上)栈:计算机世界的“叠叠乐”
c语言·数据结构·数据库·链表
来自晴朗的明天2 小时前
15、隔离 DC-DC 电源电路(18S12 模块)
单片机·嵌入式硬件·硬件工程
我送炭你添花2 小时前
电子世界的奇妙冒险:从一个电阻开始(系列目录)
人工智能·单片机·嵌入式硬件·fpga开发
VekiSon2 小时前
Linux内核驱动——设备树原理与应用
linux·c语言·arm开发·嵌入式硬件
国科安芯2 小时前
火箭传感器控制单元的抗辐照MCU选型与环境适应性验证
单片机·嵌入式硬件·架构·risc-v·安全性测试
BlackQid2 小时前
深入理解指针Part5——回调函数及应用
c语言