ESP32 复位原因排查

作者:追风剑情 发布于:2026-5-27 15:46 分类:物联网

如果发现 ESP32 莫名重启,又没有明显的崩溃日志信息,可以用下面的代码进行诊断。

#include "esp_system.h"
#include "esp_log.h"

/**
 * @brief 检查并打印 ESP32 复位原因
 * @param tag 日志标签,通常使用 "MAIN"
 */
void check_reset_reason(const char *tag)
{
    esp_reset_reason_t reason = esp_reset_reason();
    
    switch (reason) {
        case ESP_RST_UNKNOWN:
            ESP_LOGW(tag, "复位原因: 未知 (无法确定复位原因)");
            break;
        case ESP_RST_POWERON:
            ESP_LOGI(tag, "复位原因: 正常上电");
            break;
        case ESP_RST_EXT:
            ESP_LOGI(tag, "复位原因: 外部引脚复位 (不适用于ESP32)");
            break;
        case ESP_RST_SW:
            ESP_LOGI(tag, "复位原因: 软件复位 (esp_restart)");
            break;
        case ESP_RST_PANIC:
            ESP_LOGE(tag, "!!! 复位原因: 异常/死机复位 (PANIC) !!!");
            ESP_LOGE(tag, "    可能是空指针、断言失败、内存溢出等导致");
            break;
        case ESP_RST_INT_WDT:
            ESP_LOGW(tag, "复位原因: 中断看门狗复位");
            ESP_LOGW(tag, "    中断服务程序(ISR)执行时间过长,未及时喂狗");
            break;
        case ESP_RST_TASK_WDT:
            ESP_LOGW(tag, "复位原因: 任务看门狗复位");
            ESP_LOGW(tag, "    某个任务长时间占用CPU未释放");
            break;
        case ESP_RST_WDT:
            ESP_LOGW(tag, "复位原因: 其他看门狗复位");
            break;
        case ESP_RST_DEEPSLEEP:
            ESP_LOGI(tag, "复位原因: 深度睡眠唤醒后复位");
            break;
        case ESP_RST_BROWNOUT:
            ESP_LOGE(tag, "!!! 复位原因: 欠压复位 (Brownout) !!!");
            ESP_LOGE(tag, "    电源电压跌落至工作电压以下,请检查供电!");
            ESP_LOGE(tag, "    可能原因:舵机/电机瞬间大电流、USB供电不足、电源线内阻过大");
            break;
        case ESP_RST_SDIO:
            ESP_LOGI(tag, "复位原因: SDIO接口复位");
            break;
        case ESP_RST_USB:
            ESP_LOGI(tag, "复位原因: USB外设复位");
            break;
        case ESP_RST_JTAG:
            ESP_LOGI(tag, "复位原因: JTAG调试接口复位");
            break;
        case ESP_RST_EFUSE:
            ESP_LOGE(tag, "!!! 复位原因: eFuse校验错误复位 !!!");
            break;
        case ESP_RST_PWR_GLITCH:
            ESP_LOGW(tag, "复位原因: 电源干扰/毛刺复位");
            ESP_LOGW(tag, "    电源不稳定,可能存在瞬间波动");
            break;
        case ESP_RST_CPU_LOCKUP:
            ESP_LOGE(tag, "!!! 复位原因: CPU锁死复位 (双重异常) !!!");
            break;
        default:
            ESP_LOGW(tag, "复位原因: 其他 (枚举值: %d)", reason);
            break;
    }
}

void app_main(void)
{
    // 第一时间检查复位原因
    check_reset_reason("MAIN");
}


实战案例:作者在开发AI控制舵机项目时,ESP32 在执行旋转命令后总是无日志重启。通过调用 check_reset_reason() 捕获到 ESP_RST_BROWNOUT,最终定位问题是因为舵机瞬间大电流导致电源电压跌落,解决方法是为舵机独立供电,问题解决。

标签: IoT

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号