调试分析

[English]


ESP 设备的串口名称是什么?

串口名称通常是由操作系统指定的,不同的操作系统和设备可能会有不同的串口名称。常见如下:

  • Windows 系统中串口设备名称格式是 COM*

  • Linux 系统中: - UART 接口设备名称格式是 /dev/ttyUSB* - USB 接口设备名称是 /dev/ttyACM*

  • macOS 系统中串口设备名称格式是 /dev/cu.usbserial-*


ESP32 如何关闭默认通过 UART0 发送的调试信息?

  • 一级 Bootloader 日志信息可以通过 GPIO15 接地来屏蔽。

  • 二级 Bootloader 日志信息可以在 menuconfig 里的 Bootloader config 中进⾏相关配置。

  • ESP-IDF 中的日志信息可以在 menuconfig 里的 Component config > Log output 中进⾏相关配置。


ESP32 如何修改默认上电 RF 校准⽅式?

  • 上电时 RF 初始化默认采⽤部分校准的⽅案:打开 menuconfig 中 CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE 选项。

  • 不关注上电启动时间,可修改使⽤上电全校准⽅案:关闭 menuconfig 中 CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE 选项。

  • 建议默认使用 部分校准 的方案,这样既可以保证上电启动的时间,也可以在业务逻辑中增加擦除 NVS 中 RF 校准信息的操作,以触发全校准的操作。

请参考 RF 校准文档 获取更多信息。


ESP8266 如何修改默认上电校准⽅式?

上电时 RF 初始化默认采⽤部分校准的⽅案。该方案中 esp_init_data_default.bin 的第 115 字节为 0x01,RF 初始化时间较短。如不关注上电启动时间,可修改使⽤上电全校准⽅案。

使⽤ NONOS SDK 及 RTOS SDK 3.0 以前的版本:

  • 在 user_pre_init 或 user_rf_pre_init 函数中调⽤ system_phy_set_powerup_option(3)。

  • 修改 phy_init_data.bin 中第 115 字节为 0x03

使⽤ RTOS SDK 3.0 及以后版本:

  • 在 menuconfig 中关闭 CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE。

  • 如果在 menuconfig 中开启了 CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION,修改 phy_init_data.bin 中第 115 字节为 0x03;如果没有开启 CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION,修改 phy_init_data.h 中第 115 字节为 0x03

继续使⽤上电部分校准⽅案,若需在业务逻辑中增加触发全校准操作的功能:

  • 使⽤ NONOS SDK 及 RTOS SDK 3.0 以前的版本:擦除 RF 参数区中的内容,触发全校准操作。

  • 使⽤ RTOS SDK 3.0 及以后版本:擦除 NVS 分区中的内容,触发全校准操作。


ESP32 Boot 启动模式不正常如何排查?

  • ESP32-WROVER 模组使用 1.8 V flash 与 PSRAM,启动状态默认为 0x33,下载模式 0x23

  • 其余模组使用 3.3 V flash 与 PSRAM,启动状态默认为 0x13,下载模式 0x03

  • 详情请参考 ESP32 系列芯片技术规格书 中的 Strapping 管脚部分。示例 0x13 对应如下:

    管脚

    GPIO12

    GPIO0

    GPIO2

    GPIO4

    GPIO15

    GPIO5

    电平

    0

    1

    0

    0

    1

    1

您也可以直接参考 Boot 模式选择文档



如何监测任务栈的剩余空间?

调用函数 vTaskList() 可以用于定期打印任务栈的剩余空间。详细的操作可以参考 CSDN 文档


ESP32-S2 是否可以使用 JTAG 进行下载调试?

可以,详情请参考 ESP32-S2 JTAG 调试



为什么 ESP8266 进⼊启动模式 (2,7) 并触发看⻔狗复位?

  • 请确保 ESP8266 启动时,Strapping 管脚处于所需的电平。如果外部连接的外设使 Strapping 管脚进⼊到错误的电平,ESP8266 可能进⼊错误的操作模式。在⽆有效程序的情况下,看⻔狗计时器将复位芯⽚。

  • 因此在设计实践中,建议仅将 Strapping 管脚⽤于连接高阻态外部器件的输⼊,这样便不会在上电时强制 Strapping 管脚为高/低电平。详情请参考 ESP8266 Boot Mode Selection


ESP-WROVER-KIT 开发板 OpenOCD 错误 Error: Can’t find board/esp32-wrover-kit-3.3v.cfg,如何解决?

  • OpenOCD 版本为 20190313 和 20190708,请使用 openocd -f board/esp32-wrover.cfg 指令打开。

  • OpenOCD 版本为 20191114 和 20200420(2020 以上版本),请使用 openocd -f board/esp32-wrover-kit-3.3v.cfg 指令打开。


ESP32 SPI boot 时会一直发生 RTC_WDT 复位是什么原因?

  • 原因:flash 对 VDD_SDIO 上电到第一次访问之间有时间间隔要求。例如,GD 的 1.8 V Flash 要求从供电到第一次访问的时间间隔为 5 ms,而 ESP32 的时间间隔则为 1 ms 左右(XTAL 频率为 40 MHz),此时,访问 flash 会出错,接着会触发定时器看门狗或 RTC 看门狗重置,具体的重置类型取决于谁先被触发。RTC 看门狗重置的门限是 128 KB cycle,定时器看门狗重置的门限是 26 MB cycle。以 40 MHz 的 XTAL 时钟频率为例,当 RTC 慢速时钟的频率大于 192 KHz 时,会先触发 RTC 看门狗重置,反之则触发定时器看门狗重置。定时器看门狗重置时,VDD_SDIO 会持续供电,此时访问 flash 不会出现问题,芯片可以正常工作。而 RTC 看门狗重置时会停止 VDD_SDIO 供电,此时访问 flash 则会因为不满足 flash 上电到第一次访问的时间间隔而导致持续复位。

  • 解决办法:当发生 RTC 看门狗重置时,VDD_SDIO 的供电停止,可以通过 VDD_SDIO 加上一个电容来保证这段时间 VDD_SDIO 的电压不会掉到 flash 能够容忍的电压以下。


ESP32 如何获取与解析 coredump?

  • 从完整的固件中提取出 64 KB 大小的 coredump,需要先从分区表中确认 coredump 的偏移量。假设当前偏移量为 0x3F0000,运行如下命令读取固件:

    python esp-idf/components/esptool_py/esptool/esptool.py -p /dev/ttyUSB* read_flash 0x3f0000 0x10000  coredump.bin
    
  • 使用 coredump 读取脚本将二进制的 coredump 文件转变成可读的信息。假设第一步获得的 coredump 文件为 coredump.bin,此固件对应的 elf 文件为 hello_world.elf,运行如下命令转换文件:

    python esp-idf/components/espcoredump/espcoredump.py info_corefile -t raw -c coredump.bin hello_world.elf
    

也可以参考 Core Dump 文档 了解更多信息。


ESP32、ESP8266、ESP32S2 如何做射频性能测试?

请参见 ESP 射频测试指南help 文件夹下的文档说明。


Win 10 系统下识别不到 ESP 设备有哪些原因?

  • 请检查是否开启了任何安全防护软件。

  • 请检查是否是在 Win10 Linux 虚拟子系统下识别设备。

  • 如果只是在 Win10 下识别不到设备,应前往设备管理器,查看是否有对应设备,如 COM x。若没有识别到任何设备,请查看设备接线以及驱动是否正常。

  • 如果是在 Linux 虚拟子系统下识别不到设备,在完成设备接线以及驱动检查后,以 VMWare 为例,前往虚拟机设置窗口里的 “USB 控制器”,勾选 “显示所有 USB 输入设备”。


ESP32 出现 Error:Core 1 paniced (Cache disabled but cache memory region accessed) 是什么原因?

问题原因:

  • 在 cache 被禁用期间(例如在使用 spi_flash API 读取/写入/擦除/映射 SPI flash 的时候),发生了中断并且中断程序访问了 flash 的资源。

  • 通常发生在处理程序调用了在 flash 中的程序,引用了 flash 中的常量时。值得注意的是,当在中断程序里面使用 double 类型变量时,由于 double 型变量操作的实现属于软件实现,该部分实现也被链接在了 flash 中(例如强制类型转换操作)。

解决措施:

  • 给在中断中访问的函数加上 IRAM_ATTR 修饰符。

  • 给在中断中访问的常量加上 DRAM_ATTR 修饰符。

  • 不在中断处理程序中使用 double 类型。

您也可以参考 严重错误文档 来获取更多信息。


如何读取模组 Flash 型号信息?

  • 乐鑫模组或芯片可通过 python 脚本 esptool 读取。

  • Windows 环境:

    esptool.py -p COM* flash_id
    
  • Linux 环境:

    esptool.py -p /dev/ttyUSB* flash_id
    

调试 ESP-IDF 里的 Ethernet 示例,出现如下异常日志如何解决?

emac: Timed out waiting for PHY register 0x2 to have value 0x0243(mask 0xffff). Current value:

可以参考开发板的如下配置,详见开发板原理图:

  • CONFIG_PHY_USE_POWER_PIN=y

  • CONFIG_PHY_POWER_PIN=5


使用 ESP32 时出现 “Brownout detector was triggered” 报错,原因是什么,如何解决?

  • ESP32 内置有掉电探测器,当其探测到芯片电压低于一定的预设阈值时,将重置芯片以防出现意外情况。

  • 该报错信息可能会在不同场景内出现,但根本原因都在于芯片的供电电压暂时或永久性地低于掉电阈值。可通过替换稳定的电源、USB 电缆,或在模组内增加电容来解决。

  • 对于使用电池供电的产品,可以检查一下上电时序,或者更换能提供大电流的电池,或者尝试增加电源的电容。

  • 除此之外,也可以通过配置重置掉电阈值,或禁用掉电探测功能。详细信息请参考 config-esp32-brownout-det

  • 关于 ESP32 上电、复位时序说明,详见 《ESP32 技术规格书》


ESP32 导入头文件 protocol_examples_common.h 后,为什么编译时提示找不到该文件?

  • 在工程下的 CMakeLists.txt 中添加语句 “set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common)” 即可。

  • 您也可以参考 构建系统文档 来获取更多信息。


使用 ESP8266 NonOS v3.0 版本的 SDK,如下报错是什么原因?

E:M 536    E:M 1528

以 E:M 开头的报错表示内存不足。


使用 flash_download_tool 给 ESP8266 模组烧录固件时,出现如下错误如何解决?

ESP8266 Chip efuse check error esp_check_mac_and_efuse
  • 原因:

    • 出现 efuse check error 说明芯片内部的 eFuse 参数区域遭到意外修改。eFuse 中通常存储着一些重要信息,比如芯片的配置以及 MAC 地址。如果 eFuse 损坏,将导致芯片不可用。

    • eFuse 损坏通常由过压或者静电导致。

  • 建议:

    • 检测电源部分上下电过程中的波动情况。

    • ESP32-C3/ESP32-C2 芯片的 eFuse 功能有所加强,后续可以考虑替换相关产品。


从 ESP-IDF v4.4 版本更新到 v5.0 以及以上版本,会报 esp_log.h:265:27: error: format ‘%d’ expects argument of type ‘int’, but argument 6 has type ‘uint32_t’ {aka ‘long unsigned int’} [-Werror=format=]265 | #define LOG_COLOR(COLOR) “033[0;” COLOR “m” 错误,如何解决?

  • 这是乐鑫工具链更新导致的错误,具体原因和解决方法可参考 迁移指南:从 4.4 迁移到 5.0

  • 如想有意忽视这个错误(不推荐),也可以在编译报错文件对应的 cmake 里添加 target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-pointer-sign -Wno-format)