Всем привет! Пишу программу для ESP32 на ArdiunoIDE. Пытаюсь выводить какой-либо текст на LCD дисплей 2004по I2C шине, и получаю циклическую перезагрузку. Подскажите, куда копать?
Тест программы:
#define LED 2 // встроеный светодиод Pin2
hw_timer_t *My_timer = NULL; // Переменная-указатель с именем My_timer для настройки
#include <LCDI2C_Multilingual.h>
#include <Wire.h>
LCDI2C_Russian lcd(0x27, 16, 2); // I2C address: 0x27; Display size: 16x2
void ARDUINO_ISR_ATTR onTimer() { //Функция ISR для обработки прерывания таймера
digitalWrite(LED, !digitalRead(LED)); //переключаем светодиод
lcd.print("Расцветали яблони и груши, Поплыли туманы над рекой"); // wait for 4 seconds before each next screen
}
void setup() {
Wire.begin(GPIO_NUM_33, GPIO_NUM_32); // sda, scl
lcd.init();
lcd.backlight();
pinMode(LED, OUTPUT); // Pin2 как выход
/*Для инициализации таймера есть функция timerbegin ()
- Номер таймера, который мы хотим использовать (от 0...3),
- Значение предварительного делителя
- Флаг, указывающий, должен ли счетчик считать вверх true/false */
My_timer = timerBegin(1000000);
/*Перед включением таймера, необходимо прикрепить его к ISR,
который будет выполняться при генерации прерывания.
Это делается вызовом функции timerAttachInterrupt */
timerAttachInterrupt(My_timer, &onTimer);
/* Функция timerAlarmWrite() используется для указания значения счетчика,
при котором должно генерироваться прерывание таймера!
Генерируем прерывание каждую секунду, и поэтому передаем значение 1000000 микросекунд,
что равно 1 секунде. В качестве третьего аргумента передаем значение true-счетчик будет
перезагружаться и, таким образом, прерывание будет генерироваться периодически.*/
timerAlarm(My_timer, 1000000, true, 0);
//timerStart(My_timer);
/*Разрешаем прерывание по таймеру с помощью функции timerAlarmEnable.*/
//timerAlarmEnable(My_timer);
}
void loop() {
}
Текст ошибки в консоли:
14:31:54.857 -> Guru Meditation Error: Core 1 panic'ed (Unhandled debug exception).
14:31:54.857 -> Debug exception reason: Stack canary watchpoint triggered (loopTask)
14:31:54.890 -> Core 1 register dump:
14:31:54.890 -> PC : 0x40085242 PS : 0x00060536 A0 : 0x800e01a0 A1 : 0x3ffbf44c
14:31:54.890 -> A2 : 0x3ffbf460 A3 : 0x00000000 A4 : 0x0000000c A5 : 0x3ffbf460
14:31:54.890 -> A6 : 0x800896a9 A7 : 0x00000000 A8 : 0x3ffc2de8 A9 : 0x00000000
14:31:54.890 -> A10 : 0x3f402b55 A11 : 0x0000000a A12 : 0x00000001 A13 : 0x3ffbf504
14:31:54.924 -> A14 : 0x00000009 A15 : 0x00000000 SAR : 0x00000020 EXCCAUSE: 0x00000001
14:31:54.924 -> EXCVADDR: 0x00000000 LBEG : 0x40085234 LEND : 0x4008523f LCOUNT : 0xffffffff
14:31:54.924 ->
14:31:54.924 ->
14:31:54.924 -> Backtrace: 0x4008523f:0x3ffbf44c |<-CORRUPTED
14:31:54.924 ->
14:31:54.924 ->
14:31:54.924 -> Core 0 register dump:
14:31:54.924 -> PC : 0x40088766 PS : 0x00060035 A0 : 0x00000001 A1 : 0x00000000
14:31:54.957 -> A2 : 0x3f4028b4 A3 : 0x00000000 A4 : 0x400d8c20 A5 : 0x400d8aec
14:31:54.957 -> A6 : 0x00000000 A7 : 0x3ffbf38c A8 : 0x00000001 A9 : 0x00000004
14:31:54.957 -> A10 : 0x3ffc23b8 A11 : 0x00000001 A12 : 0x3ffbf328 A13 : 0x00040024
14:31:54.957 -> A14 : 0x3ffbf38c A15 : 0x00060536 SAR : 0x00040026 EXCCAUSE: 0x3ffc2de8
14:31:54.957 -> EXCVADDR: 0x400842d3 LBEG : 0x3f402b55 LEND : 0x0000000a LCOUNT : 0x800e01a0
14:31:54.991 ->
14:31:54.991 ->
14:31:54.991 -> Backtrace: 0x40088763:0x00000000 |<-CORRUPTED
14:31:54.991 ->
14:31:54.991 ->
14:31:54.991 ->
14:31:54.991 ->
14:31:54.991 -> ELF file SHA256: a969b1739
14:31:54.991 ->
14:31:54.991 -> Re-entered core dump! Exception happened during core dump!
14:31:54.991 -> Rebooting...