Skip to content

Timer#1 and #2 are conflict and cannot be used the same time #6905

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
1 task done
Globefishp opened this issue Jun 24, 2022 · 1 comment
Closed
1 task done

Timer#1 and #2 are conflict and cannot be used the same time #6905

Globefishp opened this issue Jun 24, 2022 · 1 comment
Assignees
Labels
Area: Peripherals API Relates to peripheral's APIs. Status: Solved

Comments

@Globefishp
Copy link

Board

WEMOS LOLIN32 LITE

Device Description

No other hardware, just on breadboard.

Hardware Configuration

No hardware needed.

Version

v2.0.3

IDE Name

Arduino IDE

Operating System

Windows 10 1809

Flash frequency

80MHz

PSRAM enabled

no

Upload speed

115200

Description

When I try to use multiple timer, I meet a strange behaviour that:
If I start timer #0 #1 #2, timer #1 will never execute its callback function.(but without crash)
If I start timer #0 #2, it works fine.
If I start timer #1 #2, timer #1 don't execute its callback function.

I further demostrate this problem in the below sketch that use 4 timer. Here the callback function do simple increment. By observing Serial Output we can know which timer is enabled.

By comment "timerStart" we can get multiple timer combination, which timer#1 never "work" when timer#2 is started.
When start only timer#1, it will execute callback function of timer#2;
If I delete the initiation code of timer#2, timer#1 will execute its own callback function.

Because of this "crosstalk", only #0, #2, #3 counter increase if you open all 4 timers.

I wonder there's no hardware limit in the 4 timer. They run indenpendently, and even, I can run all 4 timer when coding in ESP32-IDF style, bypassing the Arduino function. Code is here:

//Here demostrate a ESP32-IDF style implementation for 4 timer.
#include <driver/timer.h>

uint16_t timer0_count=0;
uint16_t timer1_count=0;
uint16_t timer2_count=0;
uint16_t timer3_count=0;

bool IRAM_ATTR timer0_event(void *args) {
  timer0_count++;
  return 0;
}
bool IRAM_ATTR timer1_event(void *args) {
  timer1_count++;
  return 0;
}
bool IRAM_ATTR timer2_event(void *args) {
  timer2_count++;
  return 0;
}
bool IRAM_ATTR timer3_event(void *args) {
  timer3_count++;
  return 0;
}

void setup() {
  Serial.begin(115200);
  
  // put your setup code here, to run once:
  timer_config_t timer0 = { 
    .alarm_en = TIMER_ALARM_EN,
    .counter_en = TIMER_PAUSE,
    .intr_type = TIMER_INTR_LEVEL,
    .counter_dir = TIMER_COUNT_UP,
    .auto_reload = TIMER_AUTORELOAD_EN,
    .divider = 80,
  };
  timer_init(TIMER_GROUP_0, TIMER_0, &timer0); //TimerGroup0,Num0,Config.
  timer_init(TIMER_GROUP_0, TIMER_1, &timer0); 
  timer_init(TIMER_GROUP_1, TIMER_0, &timer0); 
  timer_init(TIMER_GROUP_1, TIMER_1, &timer0);

  timer_set_alarm_value(TIMER_GROUP_0, TIMER_0, 1000000);
  timer_set_alarm_value(TIMER_GROUP_0, TIMER_1, 1000000);
  timer_set_alarm_value(TIMER_GROUP_1, TIMER_0, 1000000);
  timer_set_alarm_value(TIMER_GROUP_1, TIMER_1, 1000000);

  timer_isr_callback_add(TIMER_GROUP_0, TIMER_0, timer0_event, NULL, ESP_INTR_FLAG_IRAM);
  timer_isr_callback_add(TIMER_GROUP_0, TIMER_1, timer1_event, NULL, ESP_INTR_FLAG_IRAM);
  timer_isr_callback_add(TIMER_GROUP_1, TIMER_0, timer2_event, NULL, ESP_INTR_FLAG_IRAM);
  timer_isr_callback_add(TIMER_GROUP_1, TIMER_1, timer3_event, NULL, ESP_INTR_FLAG_IRAM);
   
  timer_start(TIMER_GROUP_0,TIMER_0);
  timer_start(TIMER_GROUP_0,TIMER_1);
  timer_start(TIMER_GROUP_1,TIMER_0);
  timer_start(TIMER_GROUP_1,TIMER_1);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.printf("%d %d %d %d \n", timer0_count,timer1_count,timer2_count,timer3_count);
  delay(100);
}

So I guess there may be some mistake in Arduino implementation for Timer.
Could you please help?

Sketch

//ESP32-Arduino Timer cannot work as expected, Seems some conflict between timer1 and timer2 in Arduino implementation

uint16_t timer0_count=0;
uint16_t timer1_count=0;
uint16_t timer2_count=0;
uint16_t timer3_count=0;

hw_timer_t *Timer0 = NULL;
hw_timer_t *Timer1 = NULL;
hw_timer_t *Timer2 = NULL;
hw_timer_t *Timer3 = NULL;


void IRAM_ATTR timer0_event() {
  timer0_count++;
}
void IRAM_ATTR timer1_event() {
  timer1_count++;
}
void IRAM_ATTR timer2_event() {
  timer2_count++;
}
void IRAM_ATTR timer3_event() {
  timer3_count++;
}


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  //-------Timer Initiation---------
  Timer0 = timerBegin(0, 80, true); 
  timerAttachInterrupt(Timer0, &timer0_event, true);
  timerAlarmWrite(Timer0, 800000, true); 
  timerAlarmEnable(Timer0); 
  timerStop(Timer0); 
  timerWrite(Timer0, 0);

  Timer1 = timerBegin(1, 80, true); 
  timerAttachInterrupt(Timer1, &timer1_event, true);
  timerAlarmWrite(Timer1, 800000, true); 
  timerAlarmEnable(Timer1); 
  timerStop(Timer1); 
  timerWrite(Timer1, 0);

  Timer2 = timerBegin(2, 80, true); 
  timerAttachInterrupt(Timer2, &timer2_event, true);
  timerAlarmWrite(Timer2, 800000, true); 
  timerAlarmEnable(Timer2); 
  timerStop(Timer2); 
  timerWrite(Timer2, 0);

  Timer3 = timerBegin(3, 80, true); 
  timerAttachInterrupt(Timer3, &timer3_event, true);
  timerAlarmWrite(Timer3, 800000, true); 
  timerAlarmEnable(Timer3); 
  timerStop(Timer3); 
  timerWrite(Timer3, 0);
  
  //---------Timer Start----------
  // timerStart(Timer0);
  timerStart(Timer1);
  // timerStart(Timer2);
  // timerStart(Timer3);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.printf("%d %d %d %d \n", timer0_count,timer1_count,timer2_count,timer3_count);
  delay(100);
}

Debug Message

Run the code and see Serial Output.

Other Steps to Reproduce

No response

I have checked existing issues, online documentation and the Troubleshooting Guide

  • I confirm I have checked existing issues, online documentation and Troubleshooting guide.
@Globefishp Globefishp added the Status: Awaiting triage Issue is waiting for triage label Jun 24, 2022
@P-R-O-C-H-Y P-R-O-C-H-Y added the Area: Peripherals API Relates to peripheral's APIs. label Jun 24, 2022
@P-R-O-C-H-Y
Copy link
Member

Hi @Globefishp, this have been already fixed by PR #6716 and will be in 2.0.4 release.
Or you can always clone master branch with newest merges.

@P-R-O-C-H-Y P-R-O-C-H-Y added Status: Solved and removed Status: Awaiting triage Issue is waiting for triage labels Jun 24, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Area: Peripherals API Relates to peripheral's APIs. Status: Solved
Projects
None yet
Development

No branches or pull requests

2 participants