调试分析
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 模式选择文档。
* 表示该产品处于生命周期终止状态。
使用 ESP32 JLINK 调试,发现会报 ERROR:No Symbols For Freertos,如何解决呢?
该错误日志不影响调试使用,解决措施可以参考 ST 论坛。
如何监测任务栈的剩余空间?
调用函数
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_idLinux 环境:
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)
。
ESP32 系列产品是否支持在 边界扫描 环境中使用 JTAG 功能?从哪里可以下载 BSDL 文件?
由于硬件限制,目前 ESP32 系列产品都不支持边界扫描功能,因此不支持在边界扫描环境中使用 JTAG,也没有 BSDL 文件。