ESP32-WROOM-32D Resetting with TFT_eSPI library

Has anyone else run into a rebooting issue with the ESP32-WROOM-32D and using the TFT_eSPI library? It's more apparent when I am using the TFT_eSPI library together with the NimBLE library to read my gamepad (see link below to other thread). I've read other posts about it maybe being something to do with the watchdog timer and so I have also tried moving the display update code to Core 0 and that made it slightly better, but the reboots still occur. Not as frequent but still there.

It seems to be random but if the screen updates enough times, the ESP32 reboots itself. Maybe is there another library that is more compatible I should be using for a ILI9341 display?

These are the libraries I am using in this thread here
TFT_eSPI.zip (5.9 MB)
NimBLE-Arduino.zip (1.3 MB)

Even with a sketch as simple as this will cause it to eventually reboot. (wiring for the display is in the 'User_Setup.h' file )

#include <SPI.h>
#include <TFT_eSPI.h>

TFT_eSPI tft = TFT_eSPI();

#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
#define FONT_SIZE 3
#define FACE_BUTTON1 13
#define FACE_BUTTON2 14
#define FACE_BUTTON3 26
#define FACE_BUTTON4 27
#define FACE_BUTTON_WIDTH ((SCREEN_WIDTH - 1) / 4)

void drawFaceButtons() {
  for (int i = 0; i < 4; i++) {
    int x = i * FACE_BUTTON_WIDTH;
    tft.fillRect(x, 218, FACE_BUTTON_WIDTH, 20, TFT_BLACK);
    tft.drawRect(x, 218, FACE_BUTTON_WIDTH, 20, TFT_WHITE);
  }
}

void setupScreen() {
  tft.init();
  tft.setRotation(3);
  tft.fillScreen(TFT_BLACK);
  tft.drawString("HELLO ARDUINO WORLD!", 10, 120);
  drawFaceButtons();
}

void readFaceButtons() {
  drawFaceButtons();

  if (digitalRead(FACE_BUTTON1) == LOW) {
    tft.fillRect(0, 218, FACE_BUTTON_WIDTH, 20, TFT_GREEN);
  }
  if (digitalRead(FACE_BUTTON2) == LOW) {
    tft.fillRect(0 + FACE_BUTTON_WIDTH, 218, FACE_BUTTON_WIDTH, 20, TFT_GREEN);
  }
  if (digitalRead(FACE_BUTTON3) == LOW) {
    tft.fillRect(0 + FACE_BUTTON_WIDTH * 2, 218, FACE_BUTTON_WIDTH, 20, TFT_GREEN);
  }
  if (digitalRead(FACE_BUTTON4) == LOW) {
    tft.fillRect(0 + FACE_BUTTON_WIDTH * 3, 218, FACE_BUTTON_WIDTH, 20, TFT_GREEN);
  }
}

void setup() {
  setupScreen();

  pinMode(FACE_BUTTON1, INPUT_PULLUP);
  pinMode(FACE_BUTTON2, INPUT_PULLUP);
  pinMode(FACE_BUTTON3, INPUT_PULLUP);
  pinMode(FACE_BUTTON4, INPUT_PULLUP);
}

void loop() {
  static unsigned long buttonRefreshMillis = 0;
  unsigned long milliSeconds = millis();

  if (milliSeconds - buttonRefreshMillis > 250) {
    readFaceButtons();
    buttonRefreshMillis = milliSeconds;
  }
}

Output from Serial Monitor

Advertised Device found: Name: , Address: d4:14:a7:2b:40:0d, appearance: 964, manufacturer data: 060000, serviceUUID: 0x1812

19:45:29.381 -> name:, address:d4:14:a7:2b:40:0d

19:45:29.381 -> uuidService:0x1812

19:45:29.381 -> Found Our Service

19:45:29.381 -> Scan Ended

19:45:30.766 -> Connected

19:45:30.766 -> Connected to: d4:14:a7:2b:40:0d

19:45:30.799 -> RSSI: -46

19:45:31.428 -> Service: uuid: 0x1812, start_handle: 33 0x0021, end_handle: 65535 0xffff

19:45:31.493 -> s:0x1812 c:0x2a4a h:35 canRead

19:45:31.593 -> onAuthenticationComplete

19:45:31.625 -> str: 

19:45:31.625 -> hex: 11 01 00 01

19:45:31.625 -> s:0x1812 c:0x2a4e h:39 canRead

19:45:31.657 -> str: 

19:45:31.657 -> hex: 01

19:45:31.657 -> s:0x1812 c:0x2a4b h:41 canRead

19:45:31.953 -> str:  �� �
19:45:31.953 -> hex: 05 01 09 05 a1 01 85 01 09 01 a1 00 09 30 09 31 09 33 09 34 15 00 27 ff ff 00 00 95 04 75 10 81 02 c0 09 32 26 ff 03 95 01 75 0a 81 02 25 00 75 06 81 03 09 35 26 ff 03 75 0a 81 02 25 00 75 06 81 03 09 39 15 01 25 08 34 46 3b 01 65 14 75 04 81 42 15 00 25 00 45 00 65 00 81 03 05 09 19 01 29 0a 25 01 75 01 95 0a 81 02 25 00 75 06 95 01 81 03 05 01 09 80 85 02 a1 00 09 85 25 01 75 01 81 02 25 00 75 07 81 03 c0 05 0f 09 21 85 03 a1 02 09 97 25 01 75 04 91 02 25 00 91 03 09 70 25 64 75 08 95 04 91 02 09 50 66 01 10 55 0e 26 ff 00 95 01 91 02 09 a7 91 02 65 00 55 00 09 7c 91 02 c0 85 04 05 06 09 20 81 02 c0
19:45:32.018 -> s:0x1812 c:0x2a4d h:44 canRead
19:45:32.052 -> str: 
19:45:32.052 -> hex:
19:45:32.052 -> s:0x1812 c:0x2a4d h:44 canNotify 
19:45:32.119 -> set notifyCb
19:45:32.119 -> s:0x1812 c:0x2a4d h:48 canRead
19:45:32.152 -> str: 
19:45:32.152 -> hex: 00
19:45:32.152 -> Done with this device!
19:45:32.152 -> Success! we should now be getting notifications
19:45:34.001 -> value:  00 80 00 80 00 80 00 80 00 00 00 00 09 00 00
19:45:34.001 -> 
19:45:38.752 -> onConnParamsUpdateRequestvalue:  00 80 74 74 00 80 00 80 00 00 00 00 09 00 00
19:45:43.636 -> 
19:45:43.734 -> value:  00 80 59 59 00 80 00 80 00 00 00 00 09 00 00
19:45:43.767 -> 
19:45:43.867 -> value:  00 80 48 48 00 80 00 80 00 00 00 00 09 00 00
19:45:43.867 -> 
19:45:44.000 -> value:  00 80 48 48 00 80 00 80 00 00 00 00 09 00 00
19:45:44.000 -> 
19:45:44.099 -> value:  00 80 48 48 00 80 00 80 00 00 00 00 09 00 00
19:45:44.099 -> 
19:45:44.232 -> value:  00 80 48 48 00 80 00 80 00 00 00 00 09 00 00
19:45:44.232 -> 
19:45:44.329 -> value:  00 80 48 48 00 80 00 80 00 00 00 00 09 00 00
19:45:44.361 -> 
19:45:44.462 -> value:  00E (74367) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
19:45:49.443 -> E (74367) task_wdt:  - IDLE0 (CPU 0)
19:45:49.443 -> E (74367) task_wdt: Tasks currently running:
19:45:49.498 -> E (74367) task_wdt: CPU 0: nimble_host
19:45:49.498 -> E (74367) task_wdt: CPU 1: loopTask
19:45:49.498 -> E (74367) task_wdt: Aborting.
19:45:49.498 -> 
19:45:49.498 -> abort() was called at PC 0x400f3ef9 on core 0
19:45:49.498 -> 
19:45:49.498 -> 
19:45:49.498 -> Backtrace: 0x4008396d:0x3ffbeb6c |<-CORRUPTED