На вход 27 ESP32 подаю импульсы частотой 9 Гц. Решил померить сколько тактов процессора составляет длительность этих импульсов. Запустил программу и она почти всегда замеряет правильно.
unsigned long Fref = 40; //Частота работы процессора (240,160,80,40) мГц. //
const int interruptPin = 27; // GPIO pin where the interrupt will be configured //
volatile bool start_gate=1; //
volatile uint32_t c1_new,c1_old; //
volatile uint64_t tik,led; //
volatile uint64_t N=0,n1=0,s1=0; //
volatile uint64_t c2,M1,M2; //
//----------------------------------------------------------------------------------------------------//
void IRAM_ATTR buttonTick() //
{ //
c1_new = esp_cpu_get_cycle_count(); //
c2 = c2+c1_new-c1_old; //
if (c1_new<c1_old) c2=c2+4294967296; //
c1_old=c1_new; //
N=N+1; //
if (start_gate==1 ) {M2=c2;N=0;start_gate=0;} //
if ((c2-M2)>=40000000) {n1=N;s1=c2-M2;N=0;start_gate=1;} //
} //
//----------------------------------------------------------------------------------------------------//
void setup() //
{ //
setCpuFrequencyMhz(Fref); //
Serial.begin(115200); //
pinMode(interruptPin, INPUT); // Configure the pin as an input with an internal pull-up resistor //
attachInterrupt(interruptPin, buttonTick, RISING); // Configure the interrup //
} //
//----------------------------------------------------------------------------------------------------//
void loop() //
{ //
//---Начало режима индикации------------------------------------------------------------------------//
tik = esp_timer_get_time(); //количество микросекунд с момента запуска базового таймера //
Serial.print(" N= ");Serial.print(n1);Serial.print(" Q= ");Serial.println(s1); //
delay(1000); //
//---Конец режима индикации-------------------------------------------------------------------------//
} //
Вот данные монитора порта. Последняя цифра почти не меняется. Но есть скачки в несколько сотен.
N= 10 Q= 44442630
N= 10 Q= 44442630
N= 10 Q= 44442629
N= 10 Q= 44442629
N= 10 Q= 44442629
N= 10 Q= 44442031
N= 10 Q= 44442031
N= 10 Q= 44442587
N= 10 Q= 44442630
N= 10 Q= 44442629
N= 10 Q= 44442630
N= 10 Q= 44442629
N= 10 Q= 44442629
Немного изменим условия Loop вывода на экран. Строка 28 и ниже.
unsigned long Fref = 40; //Частота работы процессора (240,160,80,40) мГц. //
const int interruptPin = 27; // GPIO pin where the interrupt will be configured //
volatile bool start_gate=1; //
volatile uint32_t c1_new,c1_old; //
volatile uint64_t tik,led; //
volatile uint64_t N=0,n1=0,s1=0; //
volatile uint64_t c2,M1,M2; //
//----------------------------------------------------------------------------------------------------//
void IRAM_ATTR buttonTick() //
{ //
c1_new = esp_cpu_get_cycle_count(); //
c2 = c2+c1_new-c1_old; //
if (c1_new<c1_old) c2=c2+4294967296; //
c1_old=c1_new; //
N=N+1; //
if (start_gate==1 ) {M2=c2;N=0;start_gate=0;} //
if ((c2-M2)>=40000000) {n1=N;s1=c2-M2;N=0;start_gate=1;} //
} //
//----------------------------------------------------------------------------------------------------//
void setup() //
{ //
setCpuFrequencyMhz(Fref); //
Serial.begin(115200); //
pinMode(interruptPin, INPUT); // Configure the pin as an input with an internal pull-up resistor //
attachInterrupt(interruptPin, buttonTick, RISING); // Configure the interrup //
} //
//----------------------------------------------------------------------------------------------------//
void loop() //
{ //
//---Начало режима индикации------------------------------------------------------------------------//
tik = esp_timer_get_time(); //количество микросекунд с момента запуска базового таймера //
if ((tik-led)>=1000000) //
{ //
Serial.print(" N= ");Serial.print(n1);Serial.print(" Q= ");Serial.println(s1); //
led=tik; //
} //
//---Конец режима индикации-------------------------------------------------------------------------//
} //
Результат гораздо хуже.
N= 10 Q= 44443013
N= 10 Q= 44442627
N= 10 Q= 44442109
N= 10 Q= 44442899
N= 10 Q= 44442647
N= 10 Q= 44442292
N= 10 Q= 44442292
N= 10 Q= 44442582
N= 10 Q= 44442301
N= 10 Q= 44442719
N= 10 Q= 44442667
N= 10 Q= 44442667
Нашел пока только одну статью на эту тему.
Просьба помочь по данному вопросу. Надо убрать большое изменения количество тактов процессора во втором варианте программы.