ESP32-CAM первый: 0x8 TG1WDT_SYS_RESET загрузочный цикл

У меня есть ESP32-CAM, которую я планирую использовать как простую камеру безопасности. Я протестировал программное обеспечение, и оно работало отлично. Я запрограммировал его с помощью платы программирования FTDI с 5V. Проверив все, я решил запитать его от старого адаптера (5В 160мА), который у меня был в течение некоторого времени, но когда я включил адаптер, питание начало мерцать. Когда я это заметил, я сразу же отключил адаптер, но с тех пор я начал застревать в бутлупе. Вот что я получаю:

12:56:10.663 -> ets Jul 29 2019 12:21:46
12:56:10.667 -> 
12:56:10.667 -> rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
12:56:10.667 -> waiting for download
12:56:49.327 -> ets Jul 29 2019 12:21:46
12:56:49.327 -> 
12:56:49.327 -> rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
12:56:49.327 -> configsip: 0, SPIWP:0xee
12:56:49.327 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
12:56:49.327 -> mode:DIO, clock div:2
12:56:49.327 -> load:0x3fff0030,len:1344
12:56:49.327 -> load:0x40078000,len:13836
12:56:49.327 -> load:0x40080400,len:3608
12:56:49.327 -> entry 0x400805f0
12:56:50.707 -> ets Jul 29 2019 12:21:46
12:56:50.707 -> 
12:56:50.707 -> rst:0x8 (TG1WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
12:56:50.707 -> configsip: 0, SPIWP:0xee
12:56:50.707 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
12:56:50.707 -> mode:DIO, clock div:2
12:56:50.707 -> load:0x3fff0030,len:1344
12:56:50.707 -> load:0x40078000,len:13836
12:56:50.707 -> load:0x40080400,len:3608
12:56:50.707 -> entry 0x400805f0
12:56:52.086 -> ets Jul 29 2019 12:21:46
12:56:52.086 -> 
12:56:52.086 -> rst:0x8 (TG1WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
12:56:52.086 -> configsip: 0, SPIWP:0xee
12:56:52.086 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
12:56:52.086 -> mode:DIO, clock div:2
12:56:52.086 -> load:0x3fff0030,len:1344
12:56:52.086 -> load:0x40078000,len:13836
12:56:52.086 -> load:0x40080400,len:3608
12:56:52.086 -> entry 0x400805f0

Так продолжается. Я могу загрузить новый код без проблем, но каждый код, который я загружаю, застревает именно в этом цикле загрузки. Адреса загрузки и входа не меняются. Я также пробовал программировать с помощью arduino nano вместо ftdi, но ничего не изменилось.

Я использую Arduino IDE 2.0.0 в ОС Linux Mint 21. Я также пробовал это на Windows 10, но результаты не изменились. Я новичок в ESP32, поэтому не знаю, как его отлаживать.

Заранее спасибо.

##############

ОБНОВЛЕНИЕ 25.10.2022

После комментария timemage я попробовал еще несколько кодов, и один из примеров кодов arduino ide один раз запустился с ошибкой. Я не мог получить журнал ошибок, но там было что-то вроде «Ошибка чтения PSRAM ID 0xffffff». и еще один журнал, указывающий на поврежденный адрес.

После этого я попытался загрузить другой скетч без PSRAM со следующими настройками:

  • Плата: модуль разработки ESP32
  • Частота ЦП: 240 МГц (WiFi/BT)
  • События проводятся: ядро 1.
  • Частота вспышки: 80 МГц.
  • Режим вспышки: QIO
  • Размер флэш-памяти: 4 МБ (32 МБ).
  • Arduino работает на базе ядра 1.
  • PSRAM: отключено
  • Схема разделов: огромный ПРИЛОЖЕНИЕ (3 МБ без OTA/1 МБ SPIFFS)
  • Скорость загрузки: 115200

и это сработало. Но мне нужен PSRAM для моего проекта. Итак, мой вопрос: может ли это быть аппаратной проблемой? Если нет, то как я могу это исправить?

Еще раз спасибо.

, 👍1

Обсуждение

*"Каждый код, который я загружаю, застревает именно в этом бутлупе"* Это верно, если этот новый код просто скетч или привет, мир на последовательном канале?, @timemage

@timemage Это верно для каждого скетча, который я пробовал до сих пор. Но после вашего комментария я попробовал больше скетчей, добился большего прогресса и отредактировал свой вопрос, так что спасибо., @Eren Sönmez

При выборе «AI Thinker ESP32-CAM» пункт меню «PSRAM» не отображается. Вы говорите *"пробовал загрузить другой скетч без PSRAM"* Это заставляет меня задаться вопросом: какую плату вы выбирали? Если не AI Thinker ESP32-CAM, что произойдет, когда вы переключитесь на него? Использовали ли вы плату AI Thinker, а затем переключились на общую опцию только для того, чтобы вы могли протестировать PSRAM, установленную на «Отключено»?, @timemage

@timemage Я выбрал «Модуль разработчика ESP32». Добавлены подробности о конфигурациях в вопрос., @Eren Sönmez

Это начинает выглядеть как повреждение. Я взял ваши пользовательские настройки и протестировал их на ESP32-CAM без каких-либо подключений и не получил ваш загрузочный цикл. Микросхема PSRAM не находится под радиочастотным экраном, что делает ее относительно заменяемой. Если бы это был я, я мог бы подумать о проверке чипа PSRAM с другой платы, но неясно, как это сделать с ESP32 в сбросе, потому что чип SPI FLASH на той же шине не отключен в неактивное состояние, и этот контакт не незащищенный. Надеюсь, у кого-то еще есть лучшее представление о том, что если что-нибудь попробовать дальше., @timemage


4 ответа


-1

Похожая проблема возникла при запуске тестового кода для модуля ввода данных на основе платы NodeMCU-32s. Плата перезагружалась примерно раз в секунду с той же ошибкой. Это оказалось моей ошибкой. Я перепутал номер физического контакта платы с номером GPIO. Я предполагаю, что попытка чтения выводов GPIO, которые не перенаправлены на выводы чипа, по-прежнему осуществляла доступ к внутренним регистрам, и этого было достаточно для инициализации сторожевого таймера. Поскольку в остальном я ничего не делал для сторожевого таймера (например, часто сбрасывал его), сторожевой таймер правильно выполнял свою работу и сбрасывал часть. Это было не очевидно для меня. В среде Arduino настройка Tools-> Core Debug Level на Verbose дала некоторые подсказки. Отключение некоторых моих входов GPIO также привело меня к тому, что ошибка сторожевого таймера прекратилась, и оттуда я смог продолжить. Короче говоря, я рекомендую проверить назначение контактов для ввода-вывода!

,

1
  1. Поставляется ли ваша камера esp32_cam с PSRAM? У меня была программа, работающая на esp32 wroom с PSRAM, этот же код не мог работать на esp32 wroom. После проверки esp32 wroom не поставляется с PSRAM.

  2. Скажем, esp32_cam поставляется с PSRAM, как ее инициализировать?

  3. В моем коде есть ISR для принудительного выключения через 15 минут пробуждения из глубокого сна, я получу ту же ошибку при сбросе, когда есть цикл while или for, и я пропустил эти две строки кода. vTaskDelay(3/portTICK_PERIOD_MS); esp_task_wdt_reset();

надеюсь, это поможет.

,

0

Я получил то же самое "rst:0x8 (TG1WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)" и сбой при использовании M5stack-Timer-Camera после выполнения "SerialM.setDebugOutput(true);" затем запустите камеру с помощью "camera_init()" а затем выполнить "EEPROM.commit".

Когда я удаляю "SerialM.setDebugOutput(true);" ошибка/сбой исчезают, и вместо этого я просто получаю предупреждение (Serial-Terminal) о "cam_hal: EV-EOF-OVF" при выполнении "EEPROM.commit".

Поэтому в моем случае я подозреваю, что "SerialM.setDebugOutput(true)" вызывал ошибку "cam_hal: EV-EOF-OVF" сообщение об ошибке для сбоя во время "EEPROM.commit".

,

0

Исходя из моего личного опыта работы с чипом ESP32-s3 ESP-CAM, конкретная ошибка является результатом неверной строки кода.

Лучший способ решить эту проблему — очень внимательно изучить написанный вами код, поскольку некоторые ошибки, которые вы можете внести в arduino ide, могут не обнаружиться в процессе компиляции.

Например, я собирал оболочку UART, используя тот же процессор.

Мой код выдавал ту же ошибку из-за вот этого кода:

private:
    size_t commandsLen = 1;
    string commands[1]{
        "lcdcam"
    };

Мне удалось исправить цикл сброса, исправив синтаксис в моем массиве строк. В котором отсутствовал знак равенства.

Следующая модификация устранила мою конкретную проблему, и есть вероятность, что ваша проблема связана с синтаксисом, как и моя.

private:
    size_t commandsLen = 1;
    string commands[1] = {
        "lcdcam"
    };

Изменить: При дальнейшем рассмотрении была обнаружена дополнительная проблема, которая также вызывала эту ошибку.

Обратите внимание на следующий код:

public:
    bool commandSwitch(Uart uart, BosCommand cmd){
        if(cmd.getCommandLength() <= 0){
            sendOutput(uart, "Failed to find commands.\n\r");
            return false;
        }
        string target = cmd.getCommandArg(0);
 
        if(target == "lcdcam"){
            BosCommandSwitch targetCmd;
            targetCmd.init(uart, cmd);
            return targetCmd.process();
        }else{  
           // удаленный
        }
        return false;
    }

Проблема в том, что процессору не нравится, когда я объявляю класс BosCommandSwitch внутри логики if. Исправление массива строк не только исправило ошибку сброса, но и перемещение объявления объекта класса в приватный раздел моего класса позволило всему моему коду работать без автоматического сброса.

private:
    BosCommandSwitch targetCmd;
public:
    bool commandSwitch(Uart uart, BosCommand cmd){
        if(cmd.getCommandLength() <= 0){
            sendOutput(uart, "Failed to find commands.\n\r");
            return false;
        }
        string target = cmd.getCommandArg(0);
 
        if(target == "lcdcam"){
            targetCmd.init(uart, cmd);
            return targetCmd.process();
        }else{  
           // удалено
        }
        return false;
    }

Я полагаю, что проблема связана с распределением памяти. Как только вы углубитесь в логику, вы уменьшите объем доступной памяти в конкретном регионе. Хотя это всего лишь предположение с моей стороны.

,