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

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

相关推荐
Groundwork Explorer44 分钟前
W5500 网卡编程初始化与使用指南
python·单片机
单片机仿真设计1 小时前
【proteus仿真】基于 STM32 的智能垃圾桶设计(仿真图+程序)
c语言·stm32·stm32单片机·proteus·毕设·仿真
智闲电子设计2 小时前
STM32 SD 卡 + FatFS 实战:掉电丢数据?f_sync 和簇对齐写救你
stm32·单片机·嵌入式硬件
ヾChen4 小时前
ESP32 OTA 踩坑实录
stm32·单片机·嵌入式硬件·物联网·学习
etc95274 小时前
keil下如何指定stack和heap地址
ide·mcu
DevHub4 小时前
probe-rs 教程:一行命令替代 OpenOCD 烧写调试 Cortex-M
arm开发·嵌入式硬件·mcu·rust
小僧景贤4 小时前
嵌入式ADC高阶深度解析:基于STM32底层原理、误差溯源、硬件调校与工业级落地
单片机·嵌入式硬件·stm32 adc·工业级高精度采集·adc 误差校准·量产固件开发
黑猫学长呀5 小时前
【驱动开发常见问题】编译出现rm: cannot remove `asm/arch‘: Is a directory
驱动开发·单片机·嵌入式硬件·bug·编译报错·kernrl
雨田言炎5 小时前
STM32专题之内部FLASH详解
笔记·stm32·单片机
是隼人6 小时前
buuctf-pwn axb_2019_fmt32题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门