调试分析

[English]


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

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

  • 二级 Bootloader 日志信息可以通过 make menuconfig 中 Bootloader config 进⾏相关配置。

  • IDF 中的日志信息可以通过 make menuconfig 中 Component config/Log output 进⾏相关配置。

更新时间:2022.4.22


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

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

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

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

更新时间:2022.4.22


3. 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

更新时间:2022.4.22




6. 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 指令打开。

更新时间:2022.4.22


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

  • 原因: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 能够容忍的电压以下。

更新时间:2022.4.22


8. 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

更新时间:2022.4.22


9. 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 类型。

更新时间:2022.4.22


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

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

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

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

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

更新时间:2022.4.22