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,提问作者Византија Исток
相关产品推荐
相关产品推荐

