如何在搭载ESP32(pico-v3-02)的pico-mini-02上使用SPI自定义引脚
错误根因分析
你的报错属于非法内存访问,从栈回溯可以定位到是__pinMode函数执行时访问了非法地址,触发原因有两个:
- 你使用的arduino-esp32 1.0.5版本过老,对ESP32-Pico-V3-02这类紧凑型芯片的引脚映射适配不完善,SPI初始化时对无效引脚的校验逻辑缺失,直接调用引脚配置函数触发崩溃
- 你代码中使用的默认/自定义引脚和ESP32-Pico-V3-02的板载资源冲突:GPIO6~11全部接了板载SPI Flash不能挪用,GPIO12是MTDI strapping引脚,上电时拉高会导致Flash供电电压异常,GPIO0、GPIO2是启动strapping引脚,随意用作SPI功能会导致启动异常
解决方案
- 先升级Arduino IDE中的arduino-esp32包到2.0.10及以上版本,旧版本的SPI驱动存在已知的初始化漏洞,升级后可以规避大部分非法访问问题
- 替换SPI引脚配置,避开冲突引脚,参考可用引脚定义如下:
// 开启自定义引脚模式 #define ALTERNATE_PINS // VSPI 可用自定义引脚(均为非strapping、非Flash占用引脚) #define VSPI_MISO 34 #define VSPI_MOSI 35 #define VSPI_SCLK 32 #define VSPI_SS 33 // HSPI 可用自定义引脚 #define HSPI_MISO 26 #define HSPI_MOSI 27 #define HSPI_SCLK 25 #define HSPI_SS 14
- 修改SPIClass实例的创建方式,老版本对动态创建SPIClass的支持有bug,直接创建全局静态实例即可:
// 替换原来的指针定义 SPIClass vspi(VSPI); SPIClass hspi(HSPI); // 后续调用把->改成.,例如: // vspi.begin(VSPI_SCLK, VSPI_MISO, VSPI_MOSI, VSPI_SS);
- 如果你不需要SPI的MISO功能,可以在调用begin时给MISO参数传
-1,跳过该引脚的初始化,进一步降低引脚冲突概率
验证方法
修改完成后编译上传,串口不会再打印Guru Meditation报错,用逻辑分析仪接对应SPI引脚可以看到正常的时钟和数据输出。
内容的提问来源于stack exchange,提问作者listout
相关产品推荐
相关产品推荐

