我在使用 esp32 时遇到了麻烦。 我想要一个来自 240MHz esp32 时钟的 128Hz (7812.5μs) 定时器。 我将预分频器设置为 120 和 15625 刻度以获得所需的频率。
240Mhz / 120 = 2Mhz 2MHz / 15625 = 128Hz
但是当我运行以下代码时,串行监视器每 3 秒打印一次“3000”,而它应该每秒打印“1000”。
#define TMR_ID 0
#define TMR_PRESCALER 120
unsigned long start_ = 0;
float counter = 0;
hw_timer_t *timer = NULL;
void IRAM_ATTR timer_isr(void) {
counter++;
}
void setup() {
Serial.begin(115200);
timer = timerBegin(TMR_ID, TMR_PRESCALER, true); //timer 0, div 120
timerAttachInterrupt(timer, &timer_isr, true); //attach callback
timerAlarmWrite(timer, 15625, true); //set time in us
timerAlarmEnable(timer);
Serial.print("start");
start_ = millis();
}
void loop() {
if (counter == 128) {
Serial.println(millis() - start_);
counter = 0;
start_ = millis();
}
}
将预分频器替换为40后,似乎工作正常。 有人可以回答这个问题吗?
通常定时器时钟设置为 80 MHz,即使 CPU 时钟设置为 240 MHz。 因此,将预分频器替换为 40 即可求解方程。 (80Mhz/40)/15625 = 128Hz