Я пытаюсь понять, как работает тактовая частота в esp32.
Я запускаю arduino ide 1.8.12 с определением платы 1.04 - на модуле pico kit 4.
В техническом описании устройства указано, что у него кристалл 40 МГц.
getCpuFrequencyMhz () сообщает о 240 МГц
Но следующий код генерирует прерывания 1se c с 80 мгц в качестве основы, т.е. как если бы тактовая частота 80 МГц.
Если я явно установил тактовую частоту на 80 МГц, то getCpufrequency правильно сообщает, что она изменилась, но код все равно продолжает генерировать прерывания 1se c. Если я установлю часы на 40 МГц, то я наконец увижу прерывания через 2 секунды, как и ожидалось.
Я уверен, что объяснение есть где-то в документации expressif, но мне не удалось его почерпнуть. Может ли кто-нибудь быстро объяснить, что происходит, или указать мне на какой-либо ресурс, который объясняет это конкретное обстоятельство?
---------------
Sample output
getCpuFrequencyMhz() = 240
interrupts so far = 1 - : - mills() = 1018
interrupts so far = 2 - : - mills() = 2018
interrupts so far = 3 - : - mills() = 3018
interrupts so far = 4 - : - mills() = 4018
interrupts so far = 5 - : - mills() = 5018
---------------- Пример кода
#include "esp32-hal-cpu.h"
volatile int interruptCounter;
int totalInterruptCounter;
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
void IRAM_ATTR onTimer() {
portENTER_CRITICAL_ISR(&timerMux);
interruptCounter++;
portEXIT_CRITICAL_ISR(&timerMux);
}
void setup() {
Serial.begin(115200);
Serial.printf("getCpuFrequencyMhz() = %d\n",getCpuFrequencyMhz()); //Get CPU clock
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 1000000, true);
timerAlarmEnable(timer);
}
void loop() {
if (interruptCounter > 0) {
portENTER_CRITICAL(&timerMux);
interruptCounter--;
portEXIT_CRITICAL(&timerMux);
totalInterruptCounter++;
Serial.printf("interrupts so far = %d - : - mills() = %d \n", totalInterruptCounter, millis());
}
}