You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32TimerInterrupt库示例编译失败:TIMER_BASE_CLK未定义

ESP32TimerInterrupt库编译失败问题

编译错误信息

In file included from /home/nikola/Arduino/libraries/ESP32TimerInterrupt/src/ESP32TimerInterrupt.h:60,
                 from /tmp/.arduinoIDE-unsaved202491-5718-1ecd3ef.m2hi/TimerInterruptTest/TimerInterruptTest.ino:45:
/home/nikola/Arduino/libraries/ESP32TimerInterrupt/src/ESP32TimerInterrupt.hpp: In member function 'bool ESP32TimerInterrupt::setFrequency(const float&, bool (* const&)(void*))':
/home/nikola/Arduino/libraries/ESP32TimerInterrupt/src/ESP32TimerInterrupt.hpp:347:23: error: 'TIMER_BASE_CLK' was not declared in this scope
  347 |         _frequency  = TIMER_BASE_CLK / TIMER_DIVIDER;   //1000000;
      |                       ^~~~~~~~~~~~~~

exit status 1

Compilation error: exit status 1

测试代码

#if !defined( ESP32 )
    #error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
#endif

// These define's must be placed at the beginning before #include "ESP32_New_TimerInterrupt.h"
// _TIMERINTERRUPT_LOGLEVEL_ from 0 to 4
#define _TIMERINTERRUPT_LOGLEVEL_     4

// To be included only in main(), .ino with setup() to avoid `Multiple Definitions` Linker Error
#include "ESP32TimerInterrupt.h"

// Don't use PIN_D1 in core v2.0.0 and v2.0.1. Check https://github.com/espressif/arduino-esp32/issues/5868
// Don't use PIN_D2 with ESP32_C3 (crash)
#define PIN_D19             19        // Pin D19 mapped to pin GPIO9 of ESP32
#define PIN_D3               3        // Pin D3 mapped to pin GPIO3/RX0 of ESP32

// With core v2.0.0+, you can't use Serial.print/println in ISR or crash.
// and you can't use float calculation inside ISR
// Only OK in core v1.0.6-
bool IRAM_ATTR TimerHandler0(void * timerNo)
{
    static bool toggle0 = false;

    //timer interrupt toggles pin PIN_D19
    digitalWrite(PIN_D19, toggle0);
    toggle0 = !toggle0;

    return true;
}

bool IRAM_ATTR TimerHandler1(void * timerNo)
{
    static bool toggle1 = false;

    //timer interrupt toggles outputPin
    digitalWrite(PIN_D3, toggle1);
    toggle1 = !toggle1;

    return true;
}

#define TIMER0_INTERVAL_MS        1000
#define TIMER0_DURATION_MS        5000

#define TIMER1_INTERVAL_MS        3000
#define TIMER1_DURATION_MS        15000

// Init ESP32 timer 0 and 1
ESP32Timer ITimer0(0);
ESP32Timer ITimer1(1);

void setup()
{
    pinMode(PIN_D19, OUTPUT);
    pinMode(PIN_D3, OUTPUT);

    Serial.begin(115200);

    while (!Serial && millis() < 5000);

    delay(500);

    Serial.print(F("\nStarting TimerInterruptTest on "));
    Serial.println(ARDUINO_BOARD);
    Serial.println(ESP32_TIMER_INTERRUPT_VERSION);
    Serial.print(F("CPU Frequency = "));
    Serial.print(F_CPU / 1000000);
    Serial.println(F(" MHz"));

    // Using ESP32  => 80 / 160 / 240MHz CPU clock ,
    // For 64-bit timer counter
    // For 16-bit timer prescaler up to 1024

    // Interval in microsecs
    if (ITimer0.attachInterruptInterval(TIMER0_INTERVAL_MS * 1000, TimerHandler0))
    {
        Serial.print(F("Starting  ITimer0 OK, millis() = "));
        Serial.println(millis());
    }
    else
        Serial.println(F("Can't set ITimer0. Select another freq. or timer"));

    // Interval in microsecs
    if (ITimer1.attachInterruptInterval(TIMER1_INTERVAL_MS * 1000, TimerHandler1))
    {
        Serial.print(F("Starting  ITimer1 OK, millis() = "));
        Serial.println(millis());
    }
    else
        Serial.println(F("Can't set ITimer1. Select another freq. or timer"));

    Serial.flush();
}

void loop()
{
    static unsigned long lastTimer0 = 0;
    static unsigned long lastTimer1 = 0;

    static bool timer0Stopped         = false;
    static bool timer1Stopped         = false;

    if (millis() - lastTimer0 > TIMER0_DURATION_MS)
    {
        lastTimer0 = millis();

        if (timer0Stopped)
        {
            Serial.print(F("Start ITimer0, millis() = "));
            Serial.println(millis());
            ITimer0.restartTimer();
        }
        else
        {
            Serial.print(F("Stop ITimer0, millis() = "));
            Serial.println(millis());
            ITimer0.stopTimer();
        }

        timer0Stopped = !timer0Stopped;
    }

    if (millis() - lastTimer1 > TIMER1_DURATION_MS)
    {
        lastTimer1 = millis();

        if (timer1Stopped)
        {
            Serial.print(F("Start ITimer1, millis() = "));
            Serial.println(millis());
            ITimer1.restartTimer();
        }
        else
        {
            Serial.print(F("Stop ITimer1, millis() = "));
            Serial.println(millis());
            ITimer1.stopTimer();
        }

        timer1Stopped = !timer1Stopped;
    }
}

问题原因及解决办法

报错是因为ESP32 Arduino Core版本更新后,TIMER_BASE_CLK宏被移除或重命名,而当前使用的ESP32TimerInterrupt库未适配新版本Core。

解决办法:

  • 方法1:降级ESP32 Arduino Core
    安装v1.x系列的ESP32 Arduino Core版本(比如v1.0.6),该版本仍保留TIMER_BASE_CLK宏,可直接兼容现有库。

  • 方法2:修改库文件适配新版本Core
    打开库文件ESP32TimerInterrupt.hpp,找到报错的第347行,将TIMER_BASE_CLK替换为APB_CLK_FREQ(ESP32定时器默认使用APB时钟),修改后代码为:

    _frequency  = APB_CLK_FREQ / TIMER_DIVIDER;
    

    也可根据当前CPU频率手动指定数值,比如CPU为240MHz时,APB时钟通常为80MHz,直接写80000000替代TIMER_BASE_CLK。

  • 方法3:更新库到适配版本
    检查ESP32TimerInterrupt库的最新版本,若有适配ESP32 Arduino Core v2.x的更新,直接安装最新版本即可。

内容的提问来源于stack exchange,提问作者Византија Исток

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:04:51