You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32调用CH32V003驱动触发StoreProhibited错误的原因与解决咨询

CH32V003驱动begin()调用触发ESP32崩溃问题排查

问题背景

使用Olimex ESP32-SBC-FabGL开发板,搭配Arduino 1.8.19 IDE,调用FabGL库中CH32V003驱动的begin()方法时触发系统崩溃。调用代码如下:

Terminal::Terminal()
  : m_canvas(nullptr),
    m_mutex(nullptr),
    m_soundGenerator(nullptr),
    m_sprites(nullptr),
    m_spritesCount(0),
    m_mux ()
{
  if (s_activeTerminal == nullptr)
    s_activeTerminal = this;
}

bool Terminal::begin(BaseDisplayController * displayController, int maxColumns, int maxRows, Keyboard * keyboard)
{
  // 无关代码已省略
  bool success = m_mux -> begin (); // 崩溃发生在此处
  return success;
}

崩溃时的错误信息:

Guru Meditation Error: Core 1 panic'ed (StoreProhibited). Exception was unhandled.

Core 1 register dump:
PC : 0x400e52b5 PS : 0x00060c30 A0 : 0x800de86c A1 : 0x3ffc66a0
A2 : 0x00000000 A3 : 0x00000023 A4 : 0x00000001 A5 : 0x0000000e
A6 : 0x0000000d A7 : 0x00000001 A8 : 0x0000000c A9 : 0x3ffc66d0
A10 : 0x00000001 A11 : 0x00000000 A12 : 0x00000000 A13 : 0x00000000
A14 : 0x3ffdffec A15 : 0x00000000 SAR : 0x00000018 EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000000 LBEG : 0x4008aad9 LEND : 0x4008aafb LCOUNT : 0xffffffff

Backtrace: 0x400e52b2:0x3ffc66a0 0x400de869:0x3ffc6730 0x400d2dc6:0x3ffc6760 0x400d43a4:0x3ffc6780 0x400f362e:0x3ffc67b0

异常解码结果:

PC: 0x400e52b5: CH32V003::begin(gpio_num_t, gpio_num_t, gpio_num_t, gpio_num_t, short, short) at /home/jacek/Arduino/libraries/OLIMEX-FABGL/src/devdrivers/CH32V003.cpp line 84
EXCVADDR: 0x00000000

Decoding stack results
0x400e52b2: CH32V003::begin(gpio_num_t, gpio_num_t, gpio_num_t, gpio_num_t, short, short) at /home/jacek/Arduino/libraries/OLIMEX-FABGL/src/devdrivers/CH32V003.cpp line 82
0x400de869: fabgl::Terminal::begin(fabgl::BaseDisplayController*, int, int, fabgl::Keyboard*) at /home/jacek/Arduino/libraries/OLIMEX-FABGL/src/terminal.cpp line 407
0x400d2dc6: ConfDialogApp::setupDisplay() at /home/jacek/Arduino/libraries/OLIMEX-FABGL/examples/VGA/AnsiTerminal/confdialog.h line 645
0x400d43a4: setup() at /home/jacek/Arduino/libraries/OLIMEX-FABGL/examples/VGA/AnsiTerminal/AnsiTerminal.ino line 108
0x400f362e: loopTask(void*) at /home/jacek/.arduino15/packages/esp32/hardware/esp32/2.0.11/cores/esp32/main.cpp line 42

错误含义解析

  1. StoreProhibited异常:ESP32的核心错误类型,表明代码尝试访问不允许写入的内存区域,或者访问了空指针(EXCVADDR: 0x00000000直接指向空地址)。
  2. 崩溃根源:从代码和回溯信息看,m_mux是一个未初始化的空指针,调用m_mux->begin()时,程序试图通过空指针访问CH32V003类的成员或方法,直接触发内存访问错误。

解决办法

  1. 初始化m_mux指针:在Terminal类的构造函数中,需要为m_mux分配有效的CH32V003实例,修改构造函数如下:
Terminal::Terminal()
  : m_canvas(nullptr),
    m_mutex(nullptr),
    m_soundGenerator(nullptr),
    m_sprites(nullptr),
    m_spritesCount(0),
    m_mux(new CH32V003()) // 初始化CH32V003实例
{
  if (s_activeTerminal == nullptr)
    s_activeTerminal = this;
}

同时记得在Terminal类的析构函数中释放内存,避免内存泄漏:

Terminal::~Terminal()
{
  delete m_mux;
}
  1. 确认硬件引脚参数:CH32V003的begin()方法默认参数可能与开发板的实际引脚不匹配,调用时需要传入开发板对应的SDA、SCL、INT、RST引脚号,以及正确的I2C地址和频率。比如:
bool success = m_mux->begin(GPIO_NUM_21, GPIO_NUM_22, GPIO_NUM_4, GPIO_NUM_5, 0x20, 400000);

具体引脚参数请参考Olimex ESP32-SBC-FabGL的硬件手册。
3. 检查库版本与兼容性:确保使用的FabGL库版本与ESP32 Arduino核心版本(2.0.11)兼容,必要时更新到库的最新稳定版本。

内容的提问来源于stack exchange,提问作者Neppomuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:57:03