M5.Axp.ScreenBreath() hangs when used in interrupt

  • It seems that M5.Axp.ScreenBreath() hangs when it is used in a interrupt.
    The demo below should turn off the screen after a timer delay and turn it back on when the button is pressed. Run it in Arduino IDE.
    On my system, this program crashes with a watchdog timeout during i2c operation. See it in serial log.

    #include <M5StickC.h>
    #define BUTTON_MAIN 37  //The main button pin number
    #define SCREEN_TIMEOUT 10 //Screen-off timeout in seconds
    hw_timer_t *timer;  //Screen-off timer
    void IRAM_ATTR onButton() { //Interrupt on button press => turn on the screen
     detachInterrupt(BUTTON_MAIN); //Ignore more button presses
     M5.Axp.ScreenBreath(10); //Set screen light ON
     timerAlarmEnable(timer); //Start timer for screen-off delay
    void IRAM_ATTR onTimer(){  //Interrupt on timer => turn off the screen
     timerAlarmDisable(timer); //Stop the timer.
     M5.Axp.ScreenBreath(0); //Set screen light OFF
     attachInterrupt(BUTTON_MAIN,onButton,FALLING); //Attach interrupt on button press => turn on the screen
    void setup() {
    M5.begin(); //Init M5. Start with screen ON.
    M5.Lcd.fillScreen(YELLOW); //Make screen yellow
    pinMode(BUTTON_MAIN, INPUT_PULLUP); //Button GPIO set as input, pull-up enabled
    timer=timerBegin(1,40000,true); //Init screen light timer, divisor 40000 => 0.5ms steps
    timerAttachInterrupt(timer,&onTimer,true);  //Set screen light timer interrupt function
    timerAlarmWrite(timer,SCREEN_TIMEOUT*2000,true); //Set interrupt to turn off screen after X timer steps of 0.5ms each.
    timerAlarmEnable(timer); //Start timer for screen-off delay
    void loop() {
      //No code here.