esp32 pico kit - фактическая тактовая частота vs кристалл vs max_speed и т. д. - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь понять, как работает тактовая частота в 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());
 
  }
}
...